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
2.0.0-alpha.1
to
2.0.0-alpha.2
+130
CHANGELOG.md
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
<a name="2.0.0-alpha.0f34c7ca"></a>
# [2.0.0-alpha.0f34c7ca](https://github.com/stalniy/casl/compare/@casl/ability@2.0.0...@casl/ability@2.0.0-alpha.0f34c7ca) (2018-03-17)
### Breaking Changes
* **ability:** subject specific rules now takes precedence over `all` rules
* **rulesToQuery:** moves `rulesToQuery` into submodule `@casl/ability/extra`
* **mongoose:** moves mongo related functions into separate `@casl/mongoose` package
<a name="1.1.0"></a>
# [1.1.0](https://github.com/stalniy/casl/compare/v1.0.6...v1.1.0) (2018-02-02)
### Bug Fixes
* **ability:** adds check when action is aliased to itself ([facbe10](https://github.com/stalniy/casl/commit/facbe10))
### Features
* **ability:** adds `on` method and trigger `update` event in `update` method ([a3af0ed](https://github.com/stalniy/casl/commit/a3af0ed))
<a name="1.0.6"></a>
## [1.0.6](https://github.com/stalniy/casl/compare/v1.0.5...v1.0.6) (2017-12-19)
### Bug Fixes
* **ts:** fixes return type of mongo related functions ([67e02bc](https://github.com/stalniy/casl/commit/67e02bc))
<a name="1.0.5"></a>
## [1.0.5](https://github.com/stalniy/casl/compare/v1.0.4...v1.0.5) (2017-12-19)
### Bug Fixes
* **ts:** adds conditions to typescript definitions ([a345da7](https://github.com/stalniy/casl/commit/a345da7))
<a name="1.0.4"></a>
## [1.0.4](https://github.com/stalniy/casl/compare/v1.0.3...v1.0.4) (2017-12-18)
### Bug Fixes
* **ability:** properly checks inverted rules when subject type is passed as string ([e6f69e8](https://github.com/stalniy/casl/commit/e6f69e8))
<a name="1.0.2"></a>
## [1.0.2](https://github.com/stalniy/casl/compare/v1.0.1...v1.0.2) (2017-08-02)
<a name="1.0.1"></a>
## [1.0.1](https://github.com/stalniy/casl/compare/v1.0.0...v1.0.1) (2017-08-02)
### Bug Fixes
* **ability:** passes original subject into `rulesFor` instead of parsed one ([0496053](https://github.com/stalniy/casl/commit/0496053))
### Features
* **typescript:** adds d.ts file ([9e73719](https://github.com/stalniy/casl/commit/9e73719)), closes [#7](https://github.com/stalniy/casl/issues/7)
<a name="1.0.0"></a>
# [1.0.0](https://github.com/stalniy/casl/compare/v0.3.4...v1.0.0) (2017-07-28)
### Documentation
* adds all required documentation and examples of integration for v1
<a name="0.3.4"></a>
## [0.3.4](https://github.com/stalniy/casl/compare/v0.3.0...v0.3.4) (2017-07-24)
### Bug Fixes
* **mongoose:** adds proper modelName detection for mongoose query ([0508400](https://github.com/stalniy/casl/commit/0508400))
* **query:** fixes detection of forbidden query ([7712eb2](https://github.com/stalniy/casl/commit/7712eb2))
* **query:** makes query to be empty if there is at least one rule without conditions ([d82c3fc](https://github.com/stalniy/casl/commit/d82c3fc))
<a name="0.3.0"></a>
# [0.3.0](https://github.com/stalniy/casl/compare/v0.2.4...v0.3.0) (2017-07-24)
### Features
* **ability:** adds support for $regex condition ([fc438a1](https://github.com/stalniy/casl/commit/fc438a1))
<a name="0.2.4"></a>
## [0.2.4](https://github.com/stalniy/casl/compare/v0.2.1...v0.2.4) (2017-07-24)
### Bug Fixes
* **error:** fixes ForbiddenError instanceof checks in umd build ([e0a910c](https://github.com/stalniy/casl/commit/e0a910c))
<a name="0.2.1"></a>
## [0.2.1](https://github.com/stalniy/casl/compare/v0.2.0...v0.2.1) (2017-07-20)
<a name="0.2.0"></a>
# 0.2.0 (2017-07-18)
### Features
* **casl:** first release ([8694688](https://github.com/stalniy/casl/commit/8694688))
function rulesToQuery(rules, convert) {
const query = {};
const ignoreOperators = {};
for (let i = 0; i < rules.length; i++) {
const rule = rules[i];
const op = rule.inverted ? '$and' : '$or';
if (!rule.conditions) {
if (rule.inverted) {
return null;
}
if (query[op]) {
delete query[op];
}
ignoreOperators[op] = true;
} else if (!ignoreOperators.hasOwnProperty(op)) {
query[op] = query[op] || [];
query[op].push(convert(rule));
}
}
return rules.length > 0 ? query : null;
}
export { rulesToQuery };
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.casl = global.casl || {}, global.casl.query = {})));
}(this, (function (exports) { 'use strict';
function rulesToQuery(rules, convert) {
var query = {};
var ignoreOperators = {};
for (var i = 0; i < rules.length; i++) {
var rule = rules[i];
var op = rule.inverted ? '$and' : '$or';
if (!rule.conditions) {
if (rule.inverted) {
return null;
}
if (query[op]) {
delete query[op];
}
ignoreOperators[op] = true;
} else if (!ignoreOperators.hasOwnProperty(op)) {
query[op] = query[op] || [];
query[op].push(convert(rule));
}
}
return rules.length > 0 ? query : null;
}
exports.rulesToQuery = rulesToQuery;
Object.defineProperty(exports, '__esModule', { value: true });
})));
export * from './extra/extra'
import { Rule } from '@casl/ability'
export function rulesToQuery(rules: Rule[], convert: (rule: Rule) => Object): Object | null
{
"name": "@casl/ability/extra",
"typings": "./extra.d.ts",
"main": "../dist/umd/extra.js",
"module": "../extra.js",
"es2015": "../dist/es6/extra.js"
}
MIT License
Copyright (c) 2017-2018 Sergii Stotskyi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
(function(factory) {
if (typeof require === 'function' && typeof module !== 'undefined') {
require('chai').use(require('chai-spies'));
factory(require('chai'), global);
} else if (typeof window === 'object') {
window.global = window;
factory(window.chai, window);
}
})(function(chai) {
chai.Assertion.addMethod('allow', function(action, subject) {
const subjectRepresantation = prettifyObject(subject)
this.assert(
this._obj.can(action, subject),
`expected ability to allow ${action} on ${subjectRepresantation}`,
`expected ability to not allow ${action} on ${subjectRepresantation}`
);
});
function prettifyObject(object) {
if (!object || typeof object === 'string') {
return object;
}
if (typeof object === 'function') {
return object.name;
}
const attrs = JSON.stringify(object);
return `${object.constructor.name} { ${attrs[0] === '{' ? attrs.slice(1, -1) : attrs} }`
}
});
+2
-29

@@ -47,3 +47,3 @@ import sift from 'sift';

const DEFAULT_ALIASES = {
manage: ['create', 'read', 'update', 'delete'],
manage: ['create', 'read', 'update', 'delete']
};

@@ -248,29 +248,2 @@ const PRIVATE_FIELD = typeof Symbol !== 'undefined' ? Symbol.for('private') : `__private${Date.now()}`;

function rulesToQuery(rules, convert) {
const query = {};
const ignoreOperators = {};
for (let i = 0; i < rules.length; i++) {
const rule = rules[i];
const op = rule.inverted ? '$and' : '$or';
if (!rule.conditions) {
if (rule.inverted) {
return null;
}
if (query[op]) {
delete query[op];
}
ignoreOperators[op] = true;
} else if (!ignoreOperators.hasOwnProperty(op)) {
query[op] = query[op] || [];
query[op].push(convert(rule));
}
}
return rules.length > 0 ? query : null;
}
export { Ability, Rule, AbilityBuilder, ForbiddenError, rulesToQuery };
export { Ability, Rule, AbilityBuilder, ForbiddenError };

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

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("sift")):"function"==typeof define&&define.amd?define(["exports","sift"],t):t(e.caslAbility={},e.sift)}(this,function(e,t){"use strict";function n(e){Error.call(this),this.message=e,this.constructor=n,"function"==typeof Error.captureStackTrace?(this.name=this.constructor.name,Error.captureStackTrace(this,this.constructor)):this.stack=new Error(this.message).stack}t=t&&t.hasOwnProperty("default")?t.default:t,n.prototype=Object.create(Error.prototype);var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function(){function e(n){i(this,e),this.conditions=n.conditions,this.actions=n.actions,this.subject=n.subject,this.inverted=!!n.inverted,this._matches=this.conditions?t(this.conditions):null}return o(e,[{key:"matches",value:function(e){return!this._matches||this._matches(e)}}]),e}();function u(e){if(!e||"string"==typeof e)return e;var t="object"===(void 0===e?"undefined":r(e))?e.constructor:e;return t.modelName||t.name}var s={manage:["create","read","update","delete"]},c="undefined"!=typeof Symbol?Symbol.for("private"):"__private"+Date.now(),l=function(){function e(t){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=r.RuleType,l=void 0===o?a:o,f=r.subjectName,h=void 0===f?u:f;i(this,e),this[c]={RuleType:l,subjectName:h,originalRules:t,rules:{},events:{},aliases:(n=s,JSON.parse(JSON.stringify(n)))},this.update(t)}return o(e,null,[{key:"addAlias",value:function(e,t){if(e===t||Array.isArray(t)&&-1!==t.indexOf(e))throw new Error("Attempt to alias action to itself: "+e+" -> "+t.toString());return s[e]=t,this}}]),o(e,[{key:"update",value:function(e){if(Array.isArray(e)){var t={rules:e,ability:this};this.emit("update",t),this[c].originalRules=Object.freeze(e.slice(0)),this[c].rules=this.buildIndexFor(this.rules),this.emit("updated",t)}return this}},{key:"buildIndexFor",value:function(e){for(var t={},n=this[c].RuleType,r=0;r<e.length;r++)for(var i=e[r],o=this.expandActions(i.actions),a=0;a<o.length;a++)for(var u=o[a],s=Array.isArray(i.subject)?i.subject:[i.subject],l=0;l<s.length;l++){var f=s[l];t[f]=t[f]||{},t[f][u]=t[f][u]||[],t[f][u].unshift(new n(i))}return t}},{key:"expandActions",value:function(e){var t=this,n=Array.isArray(e)?e:[e],r=this[c].aliases;return n.reduce(function(e,n){return r.hasOwnProperty(n)?e.concat(t.expandActions(r[n])):e},n)}},{key:"can",value:function(e,t){var n=this[c].subjectName(t),r=this.rulesFor(e,t);if(t===n)return r.length>0&&!r[0].inverted;for(var i=0;i<r.length;i++)if(r[i].matches(t))return!r[i].inverted;return!1}},{key:"rulesFor",value:function(e,t){var n=this[c].subjectName(t),r=this[c].rules,i=r.hasOwnProperty(n)?r[n][e]:null,o=r.hasOwnProperty("all")?r.all[e]:null;return(i||[]).concat(o||[])}},{key:"cannot",value:function(e,t){return!this.can(e,t)}},{key:"throwUnlessCan",value:function(e,t){if(this.cannot(e,t))throw new n('Cannot execute "'+e+'" on "'+this[c].subjectName(t)+'"')}},{key:"on",value:function(e,t){var n=this[c].events,r=!0;return n[e]||(n[e]=[]),n[e].push(t),function(){if(r){var i=n[e].indexOf(t);n[e].splice(i,1),r=!1}}}},{key:"emit",value:function(e,t){var n=this[c].events[e];n&&n.forEach(function(e){return e(t)})}},{key:"rules",get:function(){return this[c].originalRules}}]),e}();function f(e){return"string"==typeof e||Array.isArray(e)&&e.length>0}var h=function(){function e(){i(this,e),this.rules=[]}return o(e,null,[{key:"define",value:function(e,t){var n="function"==typeof e?{}:e,r=e===n?t:e,i=new this;return r(i.can.bind(i),i.cannot.bind(i)),new l(i.rules,n)}},{key:"extract",value:function(){var e=new this;return{can:e.can.bind(e),cannot:e.cannot.bind(e),rules:e.rules}}}]),o(e,[{key:"can",value:function(e,t,n){if(!f(e))throw new TypeError("AbilityBuilder#can expects the first parameter to be an action or array of actions");if(!f(t))throw new TypeError("AbilityBuilder#can expects the second argument to be a subject name or array of subject names");var i={actions:e,subject:t};return"object"===(void 0===n?"undefined":r(n))&&n&&(i.conditions=n),this.rules.push(i),i}},{key:"cannot",value:function(){var e=this.can.apply(this,arguments);return e.inverted=!0,e}}]),e}();e.Ability=l,e.Rule=a,e.AbilityBuilder=h,e.ForbiddenError=n,e.rulesToQuery=function(e,t){for(var n={},r={},i=0;i<e.length;i++){var o=e[i],a=o.inverted?"$and":"$or";if(o.conditions)r.hasOwnProperty(a)||(n[a]=n[a]||[],n[a].push(t(o)));else{if(o.inverted)return null;n[a]&&delete n[a],r[a]=!0}}return e.length>0?n:null},Object.defineProperty(e,"__esModule",{value:!0})});
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('sift')) :
typeof define === 'function' && define.amd ? define(['exports', 'sift'], factory) :
(factory((global.casl = {}),global.sift));
}(this, (function (exports,sift) { 'use strict';
sift = sift && sift.hasOwnProperty('default') ? sift['default'] : sift;
function ForbiddenError(message) {
Error.call(this);
this.message = message;
this.constructor = ForbiddenError;
if (typeof Error.captureStackTrace === 'function') {
this.name = this.constructor.name;
Error.captureStackTrace(this, this.constructor);
} else {
this.stack = new Error(this.message).stack;
}
}
ForbiddenError.prototype = Object.create(Error.prototype);
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
return typeof obj;
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
var classCallCheck = function (instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
};
var createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var Rule = function () {
function Rule(params) {
classCallCheck(this, Rule);
this.conditions = params.conditions;
this.actions = params.actions;
this.subject = params.subject;
this.inverted = !!params.inverted;
this._matches = this.conditions ? sift(this.conditions) : null;
}
createClass(Rule, [{
key: 'matches',
value: function matches(object) {
return !this._matches || this._matches(object);
}
}]);
return Rule;
}();
function getSubjectName(subject) {
if (!subject || typeof subject === 'string') {
return subject;
}
var Type = (typeof subject === 'undefined' ? 'undefined' : _typeof(subject)) === 'object' ? subject.constructor : subject;
return Type.modelName || Type.name;
}
function clone(object) {
return JSON.parse(JSON.stringify(object));
}
var DEFAULT_ALIASES = {
manage: ['create', 'read', 'update', 'delete']
};
var PRIVATE_FIELD = typeof Symbol !== 'undefined' ? Symbol.for('private') : '__private' + Date.now();
var Ability = function () {
createClass(Ability, null, [{
key: 'addAlias',
value: function addAlias(alias, actions) {
if (alias === actions || Array.isArray(actions) && actions.indexOf(alias) !== -1) {
throw new Error('Attempt to alias action to itself: ' + alias + ' -> ' + actions.toString());
}
DEFAULT_ALIASES[alias] = actions;
return this;
}
}]);
function Ability(rules) {
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref$RuleType = _ref.RuleType,
RuleType = _ref$RuleType === undefined ? Rule : _ref$RuleType,
_ref$subjectName = _ref.subjectName,
subjectName = _ref$subjectName === undefined ? getSubjectName : _ref$subjectName;
classCallCheck(this, Ability);
this[PRIVATE_FIELD] = {
RuleType: RuleType,
subjectName: subjectName,
originalRules: rules,
rules: {},
events: {},
aliases: clone(DEFAULT_ALIASES)
};
this.update(rules);
}
createClass(Ability, [{
key: 'update',
value: function update(rules) {
if (Array.isArray(rules)) {
var payload = { rules: rules, ability: this };
this.emit('update', payload);
this[PRIVATE_FIELD].originalRules = Object.freeze(rules.slice(0));
this[PRIVATE_FIELD].rules = this.buildIndexFor(this.rules);
this.emit('updated', payload);
}
return this;
}
}, {
key: 'buildIndexFor',
value: function buildIndexFor(rules) {
var indexedRules = {};
var RuleType = this[PRIVATE_FIELD].RuleType;
for (var i = 0; i < rules.length; i++) {
var rule = rules[i];
var actions = this.expandActions(rule.actions);
for (var j = 0; j < actions.length; j++) {
var action = actions[j];
var subjects = Array.isArray(rule.subject) ? rule.subject : [rule.subject];
for (var k = 0; k < subjects.length; k++) {
var subject = subjects[k];
indexedRules[subject] = indexedRules[subject] || {};
indexedRules[subject][action] = indexedRules[subject][action] || [];
indexedRules[subject][action].unshift(new RuleType(rule));
}
}
}
return indexedRules;
}
}, {
key: 'expandActions',
value: function expandActions(rawActions) {
var _this = this;
var actions = Array.isArray(rawActions) ? rawActions : [rawActions];
var aliases = this[PRIVATE_FIELD].aliases;
return actions.reduce(function (expanded, action) {
if (aliases.hasOwnProperty(action)) {
return expanded.concat(_this.expandActions(aliases[action]));
}
return expanded;
}, actions);
}
}, {
key: 'can',
value: function can(action, subject) {
var subjectName = this[PRIVATE_FIELD].subjectName(subject);
var rules = this.rulesFor(action, subject);
if (subject === subjectName) {
return rules.length > 0 && !rules[0].inverted;
}
for (var i = 0; i < rules.length; i++) {
if (rules[i].matches(subject)) {
return !rules[i].inverted;
}
}
return false;
}
}, {
key: 'rulesFor',
value: function rulesFor(action, subject) {
var subjectName = this[PRIVATE_FIELD].subjectName(subject);
var rules = this[PRIVATE_FIELD].rules;
var specificRules = rules.hasOwnProperty(subjectName) ? rules[subjectName][action] : null;
var generalRules = rules.hasOwnProperty('all') ? rules.all[action] : null;
return (specificRules || []).concat(generalRules || []);
}
}, {
key: 'cannot',
value: function cannot(action, subject) {
return !this.can(action, subject);
}
}, {
key: 'throwUnlessCan',
value: function throwUnlessCan(action, subject) {
if (this.cannot(action, subject)) {
throw new ForbiddenError('Cannot execute "' + action + '" on "' + this[PRIVATE_FIELD].subjectName(subject) + '"');
}
}
}, {
key: 'on',
value: function on(event, handler) {
var events = this[PRIVATE_FIELD].events;
var isAttached = true;
if (!events[event]) {
events[event] = [];
}
events[event].push(handler);
return function () {
if (isAttached) {
var index = events[event].indexOf(handler);
events[event].splice(index, 1);
isAttached = false;
}
};
}
}, {
key: 'emit',
value: function emit(event, payload) {
var handlers = this[PRIVATE_FIELD].events[event];
if (handlers) {
handlers.forEach(function (handler) {
return handler(payload);
});
}
}
}, {
key: 'rules',
get: function get$$1() {
return this[PRIVATE_FIELD].originalRules;
}
}]);
return Ability;
}();
function isStringOrNonEmptyArray(value) {
return typeof value === 'string' || Array.isArray(value) && value.length > 0;
}
var AbilityBuilder = function () {
createClass(AbilityBuilder, null, [{
key: 'define',
value: function define(params, dsl) {
var options = typeof params === 'function' ? {} : params;
var define = params === options ? dsl : params;
var builder = new this();
define(builder.can.bind(builder), builder.cannot.bind(builder));
return new Ability(builder.rules, options);
}
}, {
key: 'extract',
value: function extract() {
var builder = new this();
return {
can: builder.can.bind(builder),
cannot: builder.cannot.bind(builder),
rules: builder.rules
};
}
}]);
function AbilityBuilder() {
classCallCheck(this, AbilityBuilder);
this.rules = [];
}
createClass(AbilityBuilder, [{
key: 'can',
value: function can(actions, subject, conditions) {
if (!isStringOrNonEmptyArray(actions)) {
throw new TypeError('AbilityBuilder#can expects the first parameter to be an action or array of actions');
}
if (!isStringOrNonEmptyArray(subject)) {
throw new TypeError('AbilityBuilder#can expects the second argument to be a subject name or array of subject names');
}
var rule = { actions: actions, subject: subject };
if ((typeof conditions === 'undefined' ? 'undefined' : _typeof(conditions)) === 'object' && conditions) {
rule.conditions = conditions;
}
this.rules.push(rule);
return rule;
}
}, {
key: 'cannot',
value: function cannot() {
var rule = this.can.apply(this, arguments);
rule.inverted = true;
return rule;
}
}]);
return AbilityBuilder;
}();
exports.Ability = Ability;
exports.Rule = Rule;
exports.AbilityBuilder = AbilityBuilder;
exports.ForbiddenError = ForbiddenError;
Object.defineProperty(exports, '__esModule', { value: true });
})));

@@ -46,3 +46,1 @@ export interface Rule {

export class ForbiddenError extends Error {}
export function rulesToQuery(rules: Rule[], convert: (rule: Rule) => Object): Object | null

@@ -326,29 +326,2 @@ import sift from 'sift';

function rulesToQuery(rules, convert) {
var query = {};
var ignoreOperators = {};
for (var i = 0; i < rules.length; i++) {
var rule = rules[i];
var op = rule.inverted ? '$and' : '$or';
if (!rule.conditions) {
if (rule.inverted) {
return null;
}
if (query[op]) {
delete query[op];
}
ignoreOperators[op] = true;
} else if (!ignoreOperators.hasOwnProperty(op)) {
query[op] = query[op] || [];
query[op].push(convert(rule));
}
}
return rules.length > 0 ? query : null;
}
export { Ability, Rule, AbilityBuilder, ForbiddenError, rulesToQuery };
export { Ability, Rule, AbilityBuilder, ForbiddenError };
{
"name": "@casl/ability",
"version": "2.0.0-alpha.1",
"version": "2.0.0-alpha.2",
"description": "CASL is an isomorphic authorization JavaScript library which restricts what resources a given user is allowed to access",

@@ -8,2 +8,3 @@ "main": "dist/umd/index.js",

"es2015": "dist/es6/index.js",
"typings": "./index.d.ts",
"repository": {

@@ -13,33 +14,14 @@ "type": "git",

},
"nyc": {
"all": true,
"cache": true,
"sourceMap": false,
"instrument": false,
"require": [
"babel-register",
"./spec/config"
],
"reporter": [
"text-summary",
"html"
],
"include": [
"src/**/*.js"
],
"exclude": [
"spec/**/*.spec.js"
]
"publishConfig": {
"access": "public"
},
"scripts": {
"build.es": "rollup -c ../../tools/rollup.es.js -e sift",
"build.umd": "rollup -c ../../tools/rollup.umd.js -e sift",
"build.umd": "rollup -c ../../tools/rollup.umd.js -e sift -n casl",
"build.es5m": "rollup -c ../../tools/rollup.es5m.js -e sift",
"prebuild": "npm run lint",
"build": "npm run build.es && npm run build.umd && npm run build.es5m",
"test": "NODE_ENV=test nyc mocha spec/*.spec.js",
"coverage": "nyc report --reporter=lcov",
"lint": "eslint -c ../../.eslintrc src/",
"prerelease": "NODE_ENV=production npm run build && npm test",
"release": "standard-version"
"build.extra.es": "rollup -c ../../tools/rollup.es.js -i src/query.js -o dist/es6/extra.js",
"build.extra.es5m": "rollup -c ../../tools/rollup.es5m.js -i src/query.js -o extra.js",
"build.extra.umd": "rollup -c ../../tools/rollup.umd.js -i src/query.js -o dist/umd/extra.js -n casl.extra",
"build.extra": "npm run build.extra.es && npm run build.extra.es5m && npm run build.extra.umd",
"build": "npm run build.es && npm run build.umd && npm run build.es5m && npm run build.extra"
},

@@ -46,0 +28,0 @@ "keywords": [

+141
-4

@@ -1,6 +0,143 @@

# CASL Ability package
# CASL Ability
This package is the core of CASL. It includes logic responsible for checking ability rules in runtime.
Check [domentation][documentation] for details.
[![@casl/ability NPM version](https://badge.fury.io/js/%40casl%2Fability.svg)](https://badge.fury.io/js/%40casl%2Fability)
[![CASL Documentation](https://img.shields.io/badge/documentation-available-brightgreen.svg)](https://stalniy.github.io/casl/)
[![CASL Join the chat at https://gitter.im/stalniy-casl/casl](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/stalniy-casl/casl?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[documentation]: #
This package is the core of CASL. It includes logic responsible for [checking][check-abilities] and [defining][define-abilities] permissions.
## Installation
```sh
npm install @casl/ability
```
## Getting Started
CASL concentrates all attention at what a user can actually do and allows to create abilities in DSL style. Lets see how
### 1. Defining Abilities
`AbilityBuilder` allows to define abilities using DSL:
```js
import { AbilityBuidler } from '@casl/abiltiy'
const ability = AbilityBuilder.define((can, cannot) => {
can('protect', 'Website')
cannot('delete', 'Website')
})
class Website {}
console.log(ability.can('delete', new Website())) // false
```
If you would like to define abilities in own function, it'd better to use its `extract` method:
```js
import { AbilityBuidler, Ability } from '@casl/abiltiy'
function defineAbilityFor(user) {
const { rules, can, cannot } = AbilityBuilder.extract()
if (user.isAdmin) {
can('manage', 'all')
} else {
can('read', 'all')
can('manage', 'Post', { author: 'me' })
cannot('delete', 'Post')
}
return new Ability(rules)
}
```
Also you can combine similar rules together:
```js
const { can, rules } = AbilityBuilder.extract()
can(['read', 'update'], 'User', { id: 'me' })
can(['read', 'update'], ['Post', 'Comment'], { authorId: 'me' })
console.log(rules)
```
See [Defining Abilities][define-abilities] for details.
### 2. Checking rules
Later on you can check abilities by using `can` and `cannot`.
```js
// true if user can read at least one Post
ability.can('read', 'Post')
// true if user cannot update a post
const post = new Post({ title: 'What is CASL?', authorId: 'not_me' })
ability.cannot('update', post)
```
See [Check Abilities][check-abilities] for details.
### 3. Serializing rules
As rules are plain objects, they can be easily serialized and cached in session or JWT token or even [saved to any database][store-rules] and added dynamically later in admin panel.
```js
const jwt = require('jsonwebtoken')
const payload = {
rules: ability.rules
}
jwt.sign(payload, secret, (error, token) => {
if (error) {
return next(error)
}
// later you can send this token to client
// and restore Ability on the client using `jwt.verify`
console.log(token)
})
```
See [Caching Abilities][cache-rules] for details.
### 4. Extra
This package also provides `@casl/ability/extra` submodule which contains helper functions that can construct a database query based on permissions or extract some information from them.
```js
import { rulesToQuery } from '@casl/ability/extra'
function ruleToSequelizeQuery(rule) {
return rule.inverted ? { not: rule.conditions } : rule.conditions
}
function toSequelizeQuery(rules) {
return rulesToQuery(rules, ruleToSequelizeQuery)
}
// now you can construct sequelize query based on Ability
const query = toSequelizeQuery(ability.rulesFor('read', 'Post'))
```
[@casl/mongoose](/packages/casl-mongoose) uses `rulesToQuery` function to construct queries to MongoDB database.
See [Storing Abilities][storing-abilities] for details.
## Want to help?
Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on guidelines for [contributing][contributing]
## License
[MIT License](http://www.opensource.org/licenses/MIT)
[check-abilities]: https://stalniy.github.io/casl/abilities/2017/07/21/check-abilities.html
[define-abilities]: https://stalniy.github.io/casl/abilities/2017/07/20/define-abilities.html
[contributing]: /CONTRIBUTING.md
[storing-abilities]: https://stalniy.github.io/casl/abilities/storage/2017/07/22/storing-abilities.html
[store-rules]: https://stalniy.github.io/casl/abilities/storage/2017/07/22/storing-abilities.html#storing-abilities
[cache-rules]: https://stalniy.github.io/casl/abilities/storage/2017/07/22/storing-abilities.html#caching-abilities
import { AbilityBuilder, ForbiddenError, Ability } from '../src'
import './spec_helper'

@@ -3,0 +4,0 @@ class Post {

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

import { AbilityBuilder, rulesToQuery } from '../src'
import { AbilityBuilder } from '../src'
import { rulesToQuery } from '../src/query'
import './spec_helper'

@@ -3,0 +5,0 @@ function toQuery(rules) {

@@ -5,2 +5,1 @@ export * from './ability';

export * from './error';
export * from './query';
{
"env": {
"test": {
"presets": ["es2015"],
"plugins": ["istanbul"]
}
}
}
{"/home/sergii/projects/casl/packages/ability/src/ability.js":{"path":"/home/sergii/projects/casl/packages/ability/src/ability.js","statementMap":{"0":{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},"1":{"start":{"line":6,"column":4},"end":{"line":6,"column":19}},"2":{"start":{"line":9,"column":15},"end":{"line":9,"column":74}},"3":{"start":{"line":11,"column":2},"end":{"line":11,"column":37}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":44}},"5":{"start":{"line":18,"column":24},"end":{"line":20,"column":1}},"6":{"start":{"line":21,"column":22},"end":{"line":21,"column":102}},"7":{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},"8":{"start":{"line":26,"column":6},"end":{"line":26,"column":94}},"9":{"start":{"line":29,"column":4},"end":{"line":29,"column":37}},"10":{"start":{"line":30,"column":4},"end":{"line":30,"column":16}},"11":{"start":{"line":34,"column":4},"end":{"line":41,"column":6}},"12":{"start":{"line":42,"column":4},"end":{"line":42,"column":23}},"13":{"start":{"line":46,"column":4},"end":{"line":53,"column":5}},"14":{"start":{"line":47,"column":22},"end":{"line":47,"column":46}},"15":{"start":{"line":49,"column":6},"end":{"line":49,"column":35}},"16":{"start":{"line":50,"column":6},"end":{"line":50,"column":72}},"17":{"start":{"line":51,"column":6},"end":{"line":51,"column":65}},"18":{"start":{"line":52,"column":6},"end":{"line":52,"column":36}},"19":{"start":{"line":55,"column":4},"end":{"line":55,"column":16}},"20":{"start":{"line":59,"column":25},"end":{"line":59,"column":27}},"21":{"start":{"line":60,"column":25},"end":{"line":60,"column":44}},"22":{"start":{"line":62,"column":4},"end":{"line":77,"column":5}},"23":{"start":{"line":63,"column":19},"end":{"line":63,"column":27}},"24":{"start":{"line":64,"column":22},"end":{"line":64,"column":54}},"25":{"start":{"line":66,"column":6},"end":{"line":76,"column":7}},"26":{"start":{"line":67,"column":23},"end":{"line":67,"column":33}},"27":{"start":{"line":68,"column":25},"end":{"line":68,"column":84}},"28":{"start":{"line":70,"column":8},"end":{"line":75,"column":9}},"29":{"start":{"line":71,"column":26},"end":{"line":71,"column":37}},"30":{"start":{"line":72,"column":10},"end":{"line":72,"column":62}},"31":{"start":{"line":73,"column":10},"end":{"line":73,"column":78}},"32":{"start":{"line":74,"column":10},"end":{"line":74,"column":68}},"33":{"start":{"line":79,"column":4},"end":{"line":79,"column":24}},"34":{"start":{"line":83,"column":20},"end":{"line":83,"column":73}},"35":{"start":{"line":84,"column":24},"end":{"line":84,"column":43}},"36":{"start":{"line":86,"column":4},"end":{"line":92,"column":16}},"37":{"start":{"line":87,"column":6},"end":{"line":89,"column":7}},"38":{"start":{"line":88,"column":8},"end":{"line":88,"column":68}},"39":{"start":{"line":91,"column":6},"end":{"line":91,"column":22}},"40":{"start":{"line":96,"column":4},"end":{"line":96,"column":45}},"41":{"start":{"line":100,"column":24},"end":{"line":100,"column":64}},"42":{"start":{"line":101,"column":18},"end":{"line":101,"column":48}},"43":{"start":{"line":103,"column":4},"end":{"line":105,"column":5}},"44":{"start":{"line":104,"column":6},"end":{"line":104,"column":52}},"45":{"start":{"line":107,"column":4},"end":{"line":111,"column":5}},"46":{"start":{"line":108,"column":6},"end":{"line":110,"column":7}},"47":{"start":{"line":109,"column":8},"end":{"line":109,"column":34}},"48":{"start":{"line":113,"column":4},"end":{"line":113,"column":17}},"49":{"start":{"line":117,"column":24},"end":{"line":117,"column":64}},"50":{"start":{"line":118,"column":22},"end":{"line":118,"column":41}},"51":{"start":{"line":119,"column":26},"end":{"line":119,"column":95}},"52":{"start":{"line":120,"column":25},"end":{"line":120,"column":79}},"53":{"start":{"line":122,"column":4},"end":{"line":122,"column":60}},"54":{"start":{"line":126,"column":4},"end":{"line":126,"column":38}},"55":{"start":{"line":130,"column":4},"end":{"line":132,"column":5}},"56":{"start":{"line":131,"column":6},"end":{"line":131,"column":110}},"57":{"start":{"line":136,"column":23},"end":{"line":136,"column":42}},"58":{"start":{"line":137,"column":21},"end":{"line":137,"column":25}},"59":{"start":{"line":139,"column":4},"end":{"line":141,"column":5}},"60":{"start":{"line":140,"column":6},"end":{"line":140,"column":25}},"61":{"start":{"line":143,"column":4},"end":{"line":143,"column":32}},"62":{"start":{"line":145,"column":4},"end":{"line":151,"column":6}},"63":{"start":{"line":146,"column":6},"end":{"line":150,"column":7}},"64":{"start":{"line":147,"column":22},"end":{"line":147,"column":52}},"65":{"start":{"line":148,"column":8},"end":{"line":148,"column":39}},"66":{"start":{"line":149,"column":8},"end":{"line":149,"column":27}},"67":{"start":{"line":155,"column":21},"end":{"line":155,"column":54}},"68":{"start":{"line":157,"column":4},"end":{"line":159,"column":5}},"69":{"start":{"line":158,"column":6},"end":{"line":158,"column":52}},"70":{"start":{"line":158,"column":34},"end":{"line":158,"column":50}}},"fnMap":{"0":{"name":"getSubjectName","decl":{"start":{"line":4,"column":9},"end":{"line":4,"column":23}},"loc":{"start":{"line":4,"column":33},"end":{"line":12,"column":1}},"line":4},"1":{"name":"clone","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":14}},"loc":{"start":{"line":14,"column":23},"end":{"line":16,"column":1}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":2},"end":{"line":24,"column":3}},"loc":{"start":{"line":24,"column":34},"end":{"line":31,"column":3}},"line":24},"3":{"name":"(anonymous_3)","decl":{"start":{"line":33,"column":2},"end":{"line":33,"column":3}},"loc":{"start":{"line":33,"column":77},"end":{"line":43,"column":3}},"line":33},"4":{"name":"(anonymous_4)","decl":{"start":{"line":45,"column":2},"end":{"line":45,"column":3}},"loc":{"start":{"line":45,"column":16},"end":{"line":56,"column":3}},"line":45},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":2},"end":{"line":58,"column":3}},"loc":{"start":{"line":58,"column":23},"end":{"line":80,"column":3}},"line":58},"6":{"name":"(anonymous_6)","decl":{"start":{"line":82,"column":2},"end":{"line":82,"column":3}},"loc":{"start":{"line":82,"column":28},"end":{"line":93,"column":3}},"line":82},"7":{"name":"(anonymous_7)","decl":{"start":{"line":86,"column":26},"end":{"line":86,"column":27}},"loc":{"start":{"line":86,"column":48},"end":{"line":92,"column":5}},"line":86},"8":{"name":"(anonymous_8)","decl":{"start":{"line":95,"column":2},"end":{"line":95,"column":3}},"loc":{"start":{"line":95,"column":14},"end":{"line":97,"column":3}},"line":95},"9":{"name":"(anonymous_9)","decl":{"start":{"line":99,"column":2},"end":{"line":99,"column":3}},"loc":{"start":{"line":99,"column":23},"end":{"line":114,"column":3}},"line":99},"10":{"name":"(anonymous_10)","decl":{"start":{"line":116,"column":2},"end":{"line":116,"column":3}},"loc":{"start":{"line":116,"column":28},"end":{"line":123,"column":3}},"line":116},"11":{"name":"(anonymous_11)","decl":{"start":{"line":125,"column":2},"end":{"line":125,"column":3}},"loc":{"start":{"line":125,"column":26},"end":{"line":127,"column":3}},"line":125},"12":{"name":"(anonymous_12)","decl":{"start":{"line":129,"column":2},"end":{"line":129,"column":3}},"loc":{"start":{"line":129,"column":34},"end":{"line":133,"column":3}},"line":129},"13":{"name":"(anonymous_13)","decl":{"start":{"line":135,"column":2},"end":{"line":135,"column":3}},"loc":{"start":{"line":135,"column":21},"end":{"line":152,"column":3}},"line":135},"14":{"name":"(anonymous_14)","decl":{"start":{"line":145,"column":11},"end":{"line":145,"column":12}},"loc":{"start":{"line":145,"column":17},"end":{"line":151,"column":5}},"line":145},"15":{"name":"(anonymous_15)","decl":{"start":{"line":154,"column":2},"end":{"line":154,"column":3}},"loc":{"start":{"line":154,"column":23},"end":{"line":160,"column":3}},"line":154},"16":{"name":"(anonymous_16)","decl":{"start":{"line":158,"column":23},"end":{"line":158,"column":24}},"loc":{"start":{"line":158,"column":34},"end":{"line":158,"column":50}},"line":158}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},"type":"if","locations":[{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},{"start":{"line":5,"column":2},"end":{"line":7,"column":3}}],"line":5},"1":{"loc":{"start":{"line":5,"column":6},"end":{"line":5,"column":45}},"type":"binary-expr","locations":[{"start":{"line":5,"column":6},"end":{"line":5,"column":14}},{"start":{"line":5,"column":18},"end":{"line":5,"column":45}}],"line":5},"2":{"loc":{"start":{"line":9,"column":15},"end":{"line":9,"column":74}},"type":"cond-expr","locations":[{"start":{"line":9,"column":45},"end":{"line":9,"column":64}},{"start":{"line":9,"column":67},"end":{"line":9,"column":74}}],"line":9},"3":{"loc":{"start":{"line":11,"column":9},"end":{"line":11,"column":36}},"type":"binary-expr","locations":[{"start":{"line":11,"column":9},"end":{"line":11,"column":23}},{"start":{"line":11,"column":27},"end":{"line":11,"column":36}}],"line":11},"4":{"loc":{"start":{"line":21,"column":22},"end":{"line":21,"column":102}},"type":"cond-expr","locations":[{"start":{"line":21,"column":54},"end":{"line":21,"column":75}},{"start":{"line":21,"column":78},"end":{"line":21,"column":102}}],"line":21},"5":{"loc":{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},{"start":{"line":25,"column":4},"end":{"line":27,"column":5}}],"line":25},"6":{"loc":{"start":{"line":25,"column":8},"end":{"line":25,"column":84}},"type":"binary-expr","locations":[{"start":{"line":25,"column":8},"end":{"line":25,"column":25}},{"start":{"line":25,"column":29},"end":{"line":25,"column":51}},{"start":{"line":25,"column":55},"end":{"line":25,"column":84}}],"line":25},"7":{"loc":{"start":{"line":33,"column":21},"end":{"line":33,"column":75}},"type":"default-arg","locations":[{"start":{"line":33,"column":73},"end":{"line":33,"column":75}}],"line":33},"8":{"loc":{"start":{"line":33,"column":23},"end":{"line":33,"column":38}},"type":"default-arg","locations":[{"start":{"line":33,"column":34},"end":{"line":33,"column":38}}],"line":33},"9":{"loc":{"start":{"line":33,"column":40},"end":{"line":33,"column":68}},"type":"default-arg","locations":[{"start":{"line":33,"column":54},"end":{"line":33,"column":68}}],"line":33},"10":{"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":53,"column":5}},{"start":{"line":46,"column":4},"end":{"line":53,"column":5}}],"line":46},"11":{"loc":{"start":{"line":68,"column":25},"end":{"line":68,"column":84}},"type":"cond-expr","locations":[{"start":{"line":68,"column":55},"end":{"line":68,"column":67}},{"start":{"line":68,"column":70},"end":{"line":68,"column":84}}],"line":68},"12":{"loc":{"start":{"line":72,"column":34},"end":{"line":72,"column":61}},"type":"binary-expr","locations":[{"start":{"line":72,"column":34},"end":{"line":72,"column":55}},{"start":{"line":72,"column":59},"end":{"line":72,"column":61}}],"line":72},"13":{"loc":{"start":{"line":73,"column":42},"end":{"line":73,"column":77}},"type":"binary-expr","locations":[{"start":{"line":73,"column":42},"end":{"line":73,"column":71}},{"start":{"line":73,"column":75},"end":{"line":73,"column":77}}],"line":73},"14":{"loc":{"start":{"line":83,"column":20},"end":{"line":83,"column":73}},"type":"cond-expr","locations":[{"start":{"line":83,"column":48},"end":{"line":83,"column":58}},{"start":{"line":83,"column":61},"end":{"line":83,"column":73}}],"line":83},"15":{"loc":{"start":{"line":87,"column":6},"end":{"line":89,"column":7}},"type":"if","locations":[{"start":{"line":87,"column":6},"end":{"line":89,"column":7}},{"start":{"line":87,"column":6},"end":{"line":89,"column":7}}],"line":87},"16":{"loc":{"start":{"line":103,"column":4},"end":{"line":105,"column":5}},"type":"if","locations":[{"start":{"line":103,"column":4},"end":{"line":105,"column":5}},{"start":{"line":103,"column":4},"end":{"line":105,"column":5}}],"line":103},"17":{"loc":{"start":{"line":104,"column":13},"end":{"line":104,"column":51}},"type":"binary-expr","locations":[{"start":{"line":104,"column":13},"end":{"line":104,"column":29}},{"start":{"line":104,"column":33},"end":{"line":104,"column":51}}],"line":104},"18":{"loc":{"start":{"line":108,"column":6},"end":{"line":110,"column":7}},"type":"if","locations":[{"start":{"line":108,"column":6},"end":{"line":110,"column":7}},{"start":{"line":108,"column":6},"end":{"line":110,"column":7}}],"line":108},"19":{"loc":{"start":{"line":119,"column":26},"end":{"line":119,"column":95}},"type":"cond-expr","locations":[{"start":{"line":119,"column":62},"end":{"line":119,"column":88}},{"start":{"line":119,"column":91},"end":{"line":119,"column":95}}],"line":119},"20":{"loc":{"start":{"line":120,"column":25},"end":{"line":120,"column":79}},"type":"cond-expr","locations":[{"start":{"line":120,"column":55},"end":{"line":120,"column":72}},{"start":{"line":120,"column":75},"end":{"line":120,"column":79}}],"line":120},"21":{"loc":{"start":{"line":122,"column":12},"end":{"line":122,"column":31}},"type":"binary-expr","locations":[{"start":{"line":122,"column":12},"end":{"line":122,"column":25}},{"start":{"line":122,"column":29},"end":{"line":122,"column":31}}],"line":122},"22":{"loc":{"start":{"line":122,"column":40},"end":{"line":122,"column":58}},"type":"binary-expr","locations":[{"start":{"line":122,"column":40},"end":{"line":122,"column":52}},{"start":{"line":122,"column":56},"end":{"line":122,"column":58}}],"line":122},"23":{"loc":{"start":{"line":130,"column":4},"end":{"line":132,"column":5}},"type":"if","locations":[{"start":{"line":130,"column":4},"end":{"line":132,"column":5}},{"start":{"line":130,"column":4},"end":{"line":132,"column":5}}],"line":130},"24":{"loc":{"start":{"line":139,"column":4},"end":{"line":141,"column":5}},"type":"if","locations":[{"start":{"line":139,"column":4},"end":{"line":141,"column":5}},{"start":{"line":139,"column":4},"end":{"line":141,"column":5}}],"line":139},"25":{"loc":{"start":{"line":146,"column":6},"end":{"line":150,"column":7}},"type":"if","locations":[{"start":{"line":146,"column":6},"end":{"line":150,"column":7}},{"start":{"line":146,"column":6},"end":{"line":150,"column":7}}],"line":146},"26":{"loc":{"start":{"line":157,"column":4},"end":{"line":159,"column":5}},"type":"if","locations":[{"start":{"line":157,"column":4},"end":{"line":159,"column":5}},{"start":{"line":157,"column":4},"end":{"line":159,"column":5}}],"line":157}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0,0],"7":[0],"8":[0],"9":[0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0]}},"/home/sergii/projects/casl/packages/ability/src/builder.js":{"path":"/home/sergii/projects/casl/packages/ability/src/builder.js","statementMap":{"0":{"start":{"line":4,"column":2},"end":{"line":4,"column":79}},"1":{"start":{"line":9,"column":20},"end":{"line":9,"column":62}},"2":{"start":{"line":10,"column":19},"end":{"line":10,"column":52}},"3":{"start":{"line":11,"column":20},"end":{"line":11,"column":30}},"4":{"start":{"line":12,"column":4},"end":{"line":12,"column":68}},"5":{"start":{"line":14,"column":4},"end":{"line":14,"column":47}},"6":{"start":{"line":18,"column":20},"end":{"line":18,"column":30}},"7":{"start":{"line":20,"column":4},"end":{"line":24,"column":6}},"8":{"start":{"line":28,"column":4},"end":{"line":28,"column":20}},"9":{"start":{"line":32,"column":4},"end":{"line":34,"column":5}},"10":{"start":{"line":33,"column":6},"end":{"line":33,"column":112}},"11":{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},"12":{"start":{"line":37,"column":6},"end":{"line":37,"column":123}},"13":{"start":{"line":40,"column":17},"end":{"line":40,"column":37}},"14":{"start":{"line":42,"column":4},"end":{"line":44,"column":5}},"15":{"start":{"line":43,"column":6},"end":{"line":43,"column":35}},"16":{"start":{"line":46,"column":4},"end":{"line":46,"column":26}},"17":{"start":{"line":48,"column":4},"end":{"line":48,"column":16}},"18":{"start":{"line":52,"column":17},"end":{"line":52,"column":34}},"19":{"start":{"line":53,"column":4},"end":{"line":53,"column":25}},"20":{"start":{"line":55,"column":4},"end":{"line":55,"column":16}}},"fnMap":{"0":{"name":"isStringOrNonEmptyArray","decl":{"start":{"line":3,"column":9},"end":{"line":3,"column":32}},"loc":{"start":{"line":3,"column":40},"end":{"line":5,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":2},"end":{"line":8,"column":3}},"loc":{"start":{"line":8,"column":29},"end":{"line":15,"column":3}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":17,"column":2},"end":{"line":17,"column":3}},"loc":{"start":{"line":17,"column":19},"end":{"line":25,"column":3}},"line":17},"3":{"name":"(anonymous_3)","decl":{"start":{"line":27,"column":2},"end":{"line":27,"column":3}},"loc":{"start":{"line":27,"column":16},"end":{"line":29,"column":3}},"line":27},"4":{"name":"(anonymous_4)","decl":{"start":{"line":31,"column":2},"end":{"line":31,"column":3}},"loc":{"start":{"line":31,"column":36},"end":{"line":49,"column":3}},"line":31},"5":{"name":"(anonymous_5)","decl":{"start":{"line":51,"column":2},"end":{"line":51,"column":3}},"loc":{"start":{"line":51,"column":18},"end":{"line":56,"column":3}},"line":51}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":9},"end":{"line":4,"column":78}},"type":"binary-expr","locations":[{"start":{"line":4,"column":9},"end":{"line":4,"column":34}},{"start":{"line":4,"column":38},"end":{"line":4,"column":58}},{"start":{"line":4,"column":62},"end":{"line":4,"column":78}}],"line":4},"1":{"loc":{"start":{"line":9,"column":20},"end":{"line":9,"column":62}},"type":"cond-expr","locations":[{"start":{"line":9,"column":51},"end":{"line":9,"column":53}},{"start":{"line":9,"column":56},"end":{"line":9,"column":62}}],"line":9},"2":{"loc":{"start":{"line":10,"column":19},"end":{"line":10,"column":52}},"type":"cond-expr","locations":[{"start":{"line":10,"column":40},"end":{"line":10,"column":43}},{"start":{"line":10,"column":46},"end":{"line":10,"column":52}}],"line":10},"3":{"loc":{"start":{"line":32,"column":4},"end":{"line":34,"column":5}},"type":"if","locations":[{"start":{"line":32,"column":4},"end":{"line":34,"column":5}},{"start":{"line":32,"column":4},"end":{"line":34,"column":5}}],"line":32},"4":{"loc":{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},{"start":{"line":36,"column":4},"end":{"line":38,"column":5}}],"line":36},"5":{"loc":{"start":{"line":42,"column":4},"end":{"line":44,"column":5}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":44,"column":5}},{"start":{"line":42,"column":4},"end":{"line":44,"column":5}}],"line":42},"6":{"loc":{"start":{"line":42,"column":8},"end":{"line":42,"column":52}},"type":"binary-expr","locations":[{"start":{"line":42,"column":8},"end":{"line":42,"column":38}},{"start":{"line":42,"column":42},"end":{"line":42,"column":52}}],"line":42}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0,0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0]}},"/home/sergii/projects/casl/packages/ability/src/error.js":{"path":"/home/sergii/projects/casl/packages/ability/src/error.js","statementMap":{"0":{"start":{"line":2,"column":2},"end":{"line":2,"column":19}},"1":{"start":{"line":3,"column":2},"end":{"line":3,"column":25}},"2":{"start":{"line":4,"column":2},"end":{"line":4,"column":36}},"3":{"start":{"line":6,"column":2},"end":{"line":11,"column":3}},"4":{"start":{"line":7,"column":4},"end":{"line":7,"column":38}},"5":{"start":{"line":8,"column":4},"end":{"line":8,"column":52}},"6":{"start":{"line":10,"column":4},"end":{"line":10,"column":47}},"7":{"start":{"line":14,"column":0},"end":{"line":14,"column":58}}},"fnMap":{"0":{"name":"ForbiddenError","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":30}},"loc":{"start":{"line":1,"column":40},"end":{"line":12,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":6,"column":2},"end":{"line":11,"column":3}},{"start":{"line":6,"column":2},"end":{"line":11,"column":3}}],"line":6}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0]}},"/home/sergii/projects/casl/packages/ability/src/index.js":{"path":"/home/sergii/projects/casl/packages/ability/src/index.js","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{}},"/home/sergii/projects/casl/packages/ability/src/query.js":{"path":"/home/sergii/projects/casl/packages/ability/src/query.js","statementMap":{"0":{"start":{"line":2,"column":16},"end":{"line":2,"column":18}},"1":{"start":{"line":3,"column":26},"end":{"line":3,"column":28}},"2":{"start":{"line":5,"column":2},"end":{"line":23,"column":3}},"3":{"start":{"line":6,"column":17},"end":{"line":6,"column":25}},"4":{"start":{"line":7,"column":15},"end":{"line":7,"column":45}},"5":{"start":{"line":9,"column":4},"end":{"line":22,"column":5}},"6":{"start":{"line":10,"column":6},"end":{"line":12,"column":7}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":20}},"8":{"start":{"line":14,"column":6},"end":{"line":16,"column":7}},"9":{"start":{"line":15,"column":8},"end":{"line":15,"column":25}},"10":{"start":{"line":18,"column":6},"end":{"line":18,"column":33}},"11":{"start":{"line":19,"column":11},"end":{"line":22,"column":5}},"12":{"start":{"line":20,"column":6},"end":{"line":20,"column":34}},"13":{"start":{"line":21,"column":6},"end":{"line":21,"column":36}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":41}}},"fnMap":{"0":{"name":"rulesToQuery","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":28}},"loc":{"start":{"line":1,"column":45},"end":{"line":26,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":15},"end":{"line":7,"column":45}},"type":"cond-expr","locations":[{"start":{"line":7,"column":31},"end":{"line":7,"column":37}},{"start":{"line":7,"column":40},"end":{"line":7,"column":45}}],"line":7},"1":{"loc":{"start":{"line":9,"column":4},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":9,"column":4},"end":{"line":22,"column":5}},{"start":{"line":9,"column":4},"end":{"line":22,"column":5}}],"line":9},"2":{"loc":{"start":{"line":10,"column":6},"end":{"line":12,"column":7}},"type":"if","locations":[{"start":{"line":10,"column":6},"end":{"line":12,"column":7}},{"start":{"line":10,"column":6},"end":{"line":12,"column":7}}],"line":10},"3":{"loc":{"start":{"line":14,"column":6},"end":{"line":16,"column":7}},"type":"if","locations":[{"start":{"line":14,"column":6},"end":{"line":16,"column":7}},{"start":{"line":14,"column":6},"end":{"line":16,"column":7}}],"line":14},"4":{"loc":{"start":{"line":19,"column":11},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":19,"column":11},"end":{"line":22,"column":5}},{"start":{"line":19,"column":11},"end":{"line":22,"column":5}}],"line":19},"5":{"loc":{"start":{"line":20,"column":18},"end":{"line":20,"column":33}},"type":"binary-expr","locations":[{"start":{"line":20,"column":18},"end":{"line":20,"column":27}},{"start":{"line":20,"column":31},"end":{"line":20,"column":33}}],"line":20},"6":{"loc":{"start":{"line":25,"column":9},"end":{"line":25,"column":40}},"type":"cond-expr","locations":[{"start":{"line":25,"column":28},"end":{"line":25,"column":33}},{"start":{"line":25,"column":36},"end":{"line":25,"column":40}}],"line":25}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0]}},"/home/sergii/projects/casl/packages/ability/src/rule.js":{"path":"/home/sergii/projects/casl/packages/ability/src/rule.js","statementMap":{"0":{"start":{"line":5,"column":4},"end":{"line":5,"column":40}},"1":{"start":{"line":6,"column":4},"end":{"line":6,"column":34}},"2":{"start":{"line":7,"column":4},"end":{"line":7,"column":34}},"3":{"start":{"line":8,"column":4},"end":{"line":8,"column":38}},"4":{"start":{"line":9,"column":4},"end":{"line":9,"column":67}},"5":{"start":{"line":13,"column":4},"end":{"line":13,"column":51}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":2},"end":{"line":4,"column":3}},"loc":{"start":{"line":4,"column":22},"end":{"line":10,"column":3}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":2},"end":{"line":12,"column":3}},"loc":{"start":{"line":12,"column":18},"end":{"line":14,"column":3}},"line":12}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":20},"end":{"line":9,"column":66}},"type":"cond-expr","locations":[{"start":{"line":9,"column":38},"end":{"line":9,"column":59}},{"start":{"line":9,"column":62},"end":{"line":9,"column":66}}],"line":9},"1":{"loc":{"start":{"line":13,"column":11},"end":{"line":13,"column":50}},"type":"binary-expr","locations":[{"start":{"line":13,"column":11},"end":{"line":13,"column":25}},{"start":{"line":13,"column":29},"end":{"line":13,"column":50}}],"line":13}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0]}}}
{"/home/sergii/projects/casl/packages/ability/src/index.js":{"path":"/home/sergii/projects/casl/packages/ability/src/index.js","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"6c7bfcfb63d405d70ac9169400f3b8a66c6a4915","contentHash":"11bc2ed99e775ad401d4edf0d6577c52_11.4.1"},"/home/sergii/projects/casl/packages/ability/src/ability.js":{"path":"/home/sergii/projects/casl/packages/ability/src/ability.js","statementMap":{"0":{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},"1":{"start":{"line":6,"column":4},"end":{"line":6,"column":19}},"2":{"start":{"line":9,"column":15},"end":{"line":9,"column":74}},"3":{"start":{"line":11,"column":2},"end":{"line":11,"column":37}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":44}},"5":{"start":{"line":18,"column":24},"end":{"line":20,"column":1}},"6":{"start":{"line":21,"column":22},"end":{"line":21,"column":102}},"7":{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},"8":{"start":{"line":26,"column":6},"end":{"line":26,"column":94}},"9":{"start":{"line":29,"column":4},"end":{"line":29,"column":37}},"10":{"start":{"line":30,"column":4},"end":{"line":30,"column":16}},"11":{"start":{"line":34,"column":4},"end":{"line":41,"column":6}},"12":{"start":{"line":42,"column":4},"end":{"line":42,"column":23}},"13":{"start":{"line":46,"column":4},"end":{"line":53,"column":5}},"14":{"start":{"line":47,"column":22},"end":{"line":47,"column":46}},"15":{"start":{"line":49,"column":6},"end":{"line":49,"column":35}},"16":{"start":{"line":50,"column":6},"end":{"line":50,"column":72}},"17":{"start":{"line":51,"column":6},"end":{"line":51,"column":65}},"18":{"start":{"line":52,"column":6},"end":{"line":52,"column":36}},"19":{"start":{"line":55,"column":4},"end":{"line":55,"column":16}},"20":{"start":{"line":59,"column":25},"end":{"line":59,"column":27}},"21":{"start":{"line":60,"column":25},"end":{"line":60,"column":44}},"22":{"start":{"line":62,"column":4},"end":{"line":77,"column":5}},"23":{"start":{"line":63,"column":19},"end":{"line":63,"column":27}},"24":{"start":{"line":64,"column":22},"end":{"line":64,"column":54}},"25":{"start":{"line":66,"column":6},"end":{"line":76,"column":7}},"26":{"start":{"line":67,"column":23},"end":{"line":67,"column":33}},"27":{"start":{"line":68,"column":25},"end":{"line":68,"column":84}},"28":{"start":{"line":70,"column":8},"end":{"line":75,"column":9}},"29":{"start":{"line":71,"column":26},"end":{"line":71,"column":37}},"30":{"start":{"line":72,"column":10},"end":{"line":72,"column":62}},"31":{"start":{"line":73,"column":10},"end":{"line":73,"column":78}},"32":{"start":{"line":74,"column":10},"end":{"line":74,"column":68}},"33":{"start":{"line":79,"column":4},"end":{"line":79,"column":24}},"34":{"start":{"line":83,"column":20},"end":{"line":83,"column":73}},"35":{"start":{"line":84,"column":24},"end":{"line":84,"column":43}},"36":{"start":{"line":86,"column":4},"end":{"line":92,"column":16}},"37":{"start":{"line":87,"column":6},"end":{"line":89,"column":7}},"38":{"start":{"line":88,"column":8},"end":{"line":88,"column":68}},"39":{"start":{"line":91,"column":6},"end":{"line":91,"column":22}},"40":{"start":{"line":96,"column":4},"end":{"line":96,"column":45}},"41":{"start":{"line":100,"column":24},"end":{"line":100,"column":64}},"42":{"start":{"line":101,"column":18},"end":{"line":101,"column":48}},"43":{"start":{"line":103,"column":4},"end":{"line":105,"column":5}},"44":{"start":{"line":104,"column":6},"end":{"line":104,"column":52}},"45":{"start":{"line":107,"column":4},"end":{"line":111,"column":5}},"46":{"start":{"line":108,"column":6},"end":{"line":110,"column":7}},"47":{"start":{"line":109,"column":8},"end":{"line":109,"column":34}},"48":{"start":{"line":113,"column":4},"end":{"line":113,"column":17}},"49":{"start":{"line":117,"column":24},"end":{"line":117,"column":64}},"50":{"start":{"line":118,"column":22},"end":{"line":118,"column":41}},"51":{"start":{"line":119,"column":26},"end":{"line":119,"column":95}},"52":{"start":{"line":120,"column":25},"end":{"line":120,"column":79}},"53":{"start":{"line":122,"column":4},"end":{"line":122,"column":60}},"54":{"start":{"line":126,"column":4},"end":{"line":126,"column":38}},"55":{"start":{"line":130,"column":4},"end":{"line":132,"column":5}},"56":{"start":{"line":131,"column":6},"end":{"line":131,"column":110}},"57":{"start":{"line":136,"column":23},"end":{"line":136,"column":42}},"58":{"start":{"line":137,"column":21},"end":{"line":137,"column":25}},"59":{"start":{"line":139,"column":4},"end":{"line":141,"column":5}},"60":{"start":{"line":140,"column":6},"end":{"line":140,"column":25}},"61":{"start":{"line":143,"column":4},"end":{"line":143,"column":32}},"62":{"start":{"line":145,"column":4},"end":{"line":151,"column":6}},"63":{"start":{"line":146,"column":6},"end":{"line":150,"column":7}},"64":{"start":{"line":147,"column":22},"end":{"line":147,"column":52}},"65":{"start":{"line":148,"column":8},"end":{"line":148,"column":39}},"66":{"start":{"line":149,"column":8},"end":{"line":149,"column":27}},"67":{"start":{"line":155,"column":21},"end":{"line":155,"column":54}},"68":{"start":{"line":157,"column":4},"end":{"line":159,"column":5}},"69":{"start":{"line":158,"column":6},"end":{"line":158,"column":52}},"70":{"start":{"line":158,"column":34},"end":{"line":158,"column":50}}},"fnMap":{"0":{"name":"getSubjectName","decl":{"start":{"line":4,"column":9},"end":{"line":4,"column":23}},"loc":{"start":{"line":4,"column":33},"end":{"line":12,"column":1}},"line":4},"1":{"name":"clone","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":14}},"loc":{"start":{"line":14,"column":23},"end":{"line":16,"column":1}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":2},"end":{"line":24,"column":3}},"loc":{"start":{"line":24,"column":34},"end":{"line":31,"column":3}},"line":24},"3":{"name":"(anonymous_3)","decl":{"start":{"line":33,"column":2},"end":{"line":33,"column":3}},"loc":{"start":{"line":33,"column":77},"end":{"line":43,"column":3}},"line":33},"4":{"name":"(anonymous_4)","decl":{"start":{"line":45,"column":2},"end":{"line":45,"column":3}},"loc":{"start":{"line":45,"column":16},"end":{"line":56,"column":3}},"line":45},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":2},"end":{"line":58,"column":3}},"loc":{"start":{"line":58,"column":23},"end":{"line":80,"column":3}},"line":58},"6":{"name":"(anonymous_6)","decl":{"start":{"line":82,"column":2},"end":{"line":82,"column":3}},"loc":{"start":{"line":82,"column":28},"end":{"line":93,"column":3}},"line":82},"7":{"name":"(anonymous_7)","decl":{"start":{"line":86,"column":26},"end":{"line":86,"column":27}},"loc":{"start":{"line":86,"column":48},"end":{"line":92,"column":5}},"line":86},"8":{"name":"(anonymous_8)","decl":{"start":{"line":95,"column":2},"end":{"line":95,"column":3}},"loc":{"start":{"line":95,"column":14},"end":{"line":97,"column":3}},"line":95},"9":{"name":"(anonymous_9)","decl":{"start":{"line":99,"column":2},"end":{"line":99,"column":3}},"loc":{"start":{"line":99,"column":23},"end":{"line":114,"column":3}},"line":99},"10":{"name":"(anonymous_10)","decl":{"start":{"line":116,"column":2},"end":{"line":116,"column":3}},"loc":{"start":{"line":116,"column":28},"end":{"line":123,"column":3}},"line":116},"11":{"name":"(anonymous_11)","decl":{"start":{"line":125,"column":2},"end":{"line":125,"column":3}},"loc":{"start":{"line":125,"column":26},"end":{"line":127,"column":3}},"line":125},"12":{"name":"(anonymous_12)","decl":{"start":{"line":129,"column":2},"end":{"line":129,"column":3}},"loc":{"start":{"line":129,"column":34},"end":{"line":133,"column":3}},"line":129},"13":{"name":"(anonymous_13)","decl":{"start":{"line":135,"column":2},"end":{"line":135,"column":3}},"loc":{"start":{"line":135,"column":21},"end":{"line":152,"column":3}},"line":135},"14":{"name":"(anonymous_14)","decl":{"start":{"line":145,"column":11},"end":{"line":145,"column":12}},"loc":{"start":{"line":145,"column":17},"end":{"line":151,"column":5}},"line":145},"15":{"name":"(anonymous_15)","decl":{"start":{"line":154,"column":2},"end":{"line":154,"column":3}},"loc":{"start":{"line":154,"column":23},"end":{"line":160,"column":3}},"line":154},"16":{"name":"(anonymous_16)","decl":{"start":{"line":158,"column":23},"end":{"line":158,"column":24}},"loc":{"start":{"line":158,"column":34},"end":{"line":158,"column":50}},"line":158}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},"type":"if","locations":[{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},{"start":{"line":5,"column":2},"end":{"line":7,"column":3}}],"line":5},"1":{"loc":{"start":{"line":5,"column":6},"end":{"line":5,"column":45}},"type":"binary-expr","locations":[{"start":{"line":5,"column":6},"end":{"line":5,"column":14}},{"start":{"line":5,"column":18},"end":{"line":5,"column":45}}],"line":5},"2":{"loc":{"start":{"line":9,"column":15},"end":{"line":9,"column":74}},"type":"cond-expr","locations":[{"start":{"line":9,"column":45},"end":{"line":9,"column":64}},{"start":{"line":9,"column":67},"end":{"line":9,"column":74}}],"line":9},"3":{"loc":{"start":{"line":11,"column":9},"end":{"line":11,"column":36}},"type":"binary-expr","locations":[{"start":{"line":11,"column":9},"end":{"line":11,"column":23}},{"start":{"line":11,"column":27},"end":{"line":11,"column":36}}],"line":11},"4":{"loc":{"start":{"line":21,"column":22},"end":{"line":21,"column":102}},"type":"cond-expr","locations":[{"start":{"line":21,"column":54},"end":{"line":21,"column":75}},{"start":{"line":21,"column":78},"end":{"line":21,"column":102}}],"line":21},"5":{"loc":{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},{"start":{"line":25,"column":4},"end":{"line":27,"column":5}}],"line":25},"6":{"loc":{"start":{"line":25,"column":8},"end":{"line":25,"column":84}},"type":"binary-expr","locations":[{"start":{"line":25,"column":8},"end":{"line":25,"column":25}},{"start":{"line":25,"column":29},"end":{"line":25,"column":51}},{"start":{"line":25,"column":55},"end":{"line":25,"column":84}}],"line":25},"7":{"loc":{"start":{"line":33,"column":21},"end":{"line":33,"column":75}},"type":"default-arg","locations":[{"start":{"line":33,"column":73},"end":{"line":33,"column":75}}],"line":33},"8":{"loc":{"start":{"line":33,"column":23},"end":{"line":33,"column":38}},"type":"default-arg","locations":[{"start":{"line":33,"column":34},"end":{"line":33,"column":38}}],"line":33},"9":{"loc":{"start":{"line":33,"column":40},"end":{"line":33,"column":68}},"type":"default-arg","locations":[{"start":{"line":33,"column":54},"end":{"line":33,"column":68}}],"line":33},"10":{"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":53,"column":5}},{"start":{"line":46,"column":4},"end":{"line":53,"column":5}}],"line":46},"11":{"loc":{"start":{"line":68,"column":25},"end":{"line":68,"column":84}},"type":"cond-expr","locations":[{"start":{"line":68,"column":55},"end":{"line":68,"column":67}},{"start":{"line":68,"column":70},"end":{"line":68,"column":84}}],"line":68},"12":{"loc":{"start":{"line":72,"column":34},"end":{"line":72,"column":61}},"type":"binary-expr","locations":[{"start":{"line":72,"column":34},"end":{"line":72,"column":55}},{"start":{"line":72,"column":59},"end":{"line":72,"column":61}}],"line":72},"13":{"loc":{"start":{"line":73,"column":42},"end":{"line":73,"column":77}},"type":"binary-expr","locations":[{"start":{"line":73,"column":42},"end":{"line":73,"column":71}},{"start":{"line":73,"column":75},"end":{"line":73,"column":77}}],"line":73},"14":{"loc":{"start":{"line":83,"column":20},"end":{"line":83,"column":73}},"type":"cond-expr","locations":[{"start":{"line":83,"column":48},"end":{"line":83,"column":58}},{"start":{"line":83,"column":61},"end":{"line":83,"column":73}}],"line":83},"15":{"loc":{"start":{"line":87,"column":6},"end":{"line":89,"column":7}},"type":"if","locations":[{"start":{"line":87,"column":6},"end":{"line":89,"column":7}},{"start":{"line":87,"column":6},"end":{"line":89,"column":7}}],"line":87},"16":{"loc":{"start":{"line":103,"column":4},"end":{"line":105,"column":5}},"type":"if","locations":[{"start":{"line":103,"column":4},"end":{"line":105,"column":5}},{"start":{"line":103,"column":4},"end":{"line":105,"column":5}}],"line":103},"17":{"loc":{"start":{"line":104,"column":13},"end":{"line":104,"column":51}},"type":"binary-expr","locations":[{"start":{"line":104,"column":13},"end":{"line":104,"column":29}},{"start":{"line":104,"column":33},"end":{"line":104,"column":51}}],"line":104},"18":{"loc":{"start":{"line":108,"column":6},"end":{"line":110,"column":7}},"type":"if","locations":[{"start":{"line":108,"column":6},"end":{"line":110,"column":7}},{"start":{"line":108,"column":6},"end":{"line":110,"column":7}}],"line":108},"19":{"loc":{"start":{"line":119,"column":26},"end":{"line":119,"column":95}},"type":"cond-expr","locations":[{"start":{"line":119,"column":62},"end":{"line":119,"column":88}},{"start":{"line":119,"column":91},"end":{"line":119,"column":95}}],"line":119},"20":{"loc":{"start":{"line":120,"column":25},"end":{"line":120,"column":79}},"type":"cond-expr","locations":[{"start":{"line":120,"column":55},"end":{"line":120,"column":72}},{"start":{"line":120,"column":75},"end":{"line":120,"column":79}}],"line":120},"21":{"loc":{"start":{"line":122,"column":12},"end":{"line":122,"column":31}},"type":"binary-expr","locations":[{"start":{"line":122,"column":12},"end":{"line":122,"column":25}},{"start":{"line":122,"column":29},"end":{"line":122,"column":31}}],"line":122},"22":{"loc":{"start":{"line":122,"column":40},"end":{"line":122,"column":58}},"type":"binary-expr","locations":[{"start":{"line":122,"column":40},"end":{"line":122,"column":52}},{"start":{"line":122,"column":56},"end":{"line":122,"column":58}}],"line":122},"23":{"loc":{"start":{"line":130,"column":4},"end":{"line":132,"column":5}},"type":"if","locations":[{"start":{"line":130,"column":4},"end":{"line":132,"column":5}},{"start":{"line":130,"column":4},"end":{"line":132,"column":5}}],"line":130},"24":{"loc":{"start":{"line":139,"column":4},"end":{"line":141,"column":5}},"type":"if","locations":[{"start":{"line":139,"column":4},"end":{"line":141,"column":5}},{"start":{"line":139,"column":4},"end":{"line":141,"column":5}}],"line":139},"25":{"loc":{"start":{"line":146,"column":6},"end":{"line":150,"column":7}},"type":"if","locations":[{"start":{"line":146,"column":6},"end":{"line":150,"column":7}},{"start":{"line":146,"column":6},"end":{"line":150,"column":7}}],"line":146},"26":{"loc":{"start":{"line":157,"column":4},"end":{"line":159,"column":5}},"type":"if","locations":[{"start":{"line":157,"column":4},"end":{"line":159,"column":5}},{"start":{"line":157,"column":4},"end":{"line":159,"column":5}}],"line":157}},"s":{"0":141,"1":55,"2":86,"3":86,"4":40,"5":1,"6":1,"7":5,"8":2,"9":3,"10":3,"11":40,"12":40,"13":45,"14":45,"15":45,"16":45,"17":45,"18":45,"19":45,"20":45,"21":45,"22":45,"23":87,"24":87,"25":87,"26":128,"27":128,"28":128,"29":130,"30":130,"31":130,"32":130,"33":45,"34":95,"35":95,"36":95,"37":128,"38":8,"39":120,"40":47,"41":70,"42":70,"43":70,"44":27,"45":43,"46":49,"47":29,"48":14,"49":70,"50":70,"51":70,"52":70,"53":70,"54":3,"55":3,"56":1,"57":5,"58":5,"59":5,"60":4,"61":5,"62":5,"63":3,"64":2,"65":2,"66":2,"67":90,"68":90,"69":4,"70":3},"f":{"0":141,"1":40,"2":5,"3":40,"4":45,"5":45,"6":95,"7":128,"8":47,"9":70,"10":70,"11":3,"12":3,"13":5,"14":3,"15":90,"16":3},"b":{"0":[55,86],"1":[141,139],"2":[84,2],"3":[86,86],"4":[1,0],"5":[2,3],"6":[5,4,3],"7":[0],"8":[40],"9":[40],"10":[45,0],"11":[2,126],"12":[130,47],"13":[130,122],"14":[24,71],"15":[8,120],"16":[27,43],"17":[27,19],"18":[29,20],"19":[64,6],"20":[3,67],"21":[70,11],"22":[70,67],"23":[1,2],"24":[4,1],"25":[2,1],"26":[4,86]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"926cd66cd69f1be57dbd2083e972e62d24712528","contentHash":"2151621e45ffbba033b9e355f61de901_11.4.1"},"/home/sergii/projects/casl/packages/ability/src/error.js":{"path":"/home/sergii/projects/casl/packages/ability/src/error.js","statementMap":{"0":{"start":{"line":2,"column":2},"end":{"line":2,"column":19}},"1":{"start":{"line":3,"column":2},"end":{"line":3,"column":25}},"2":{"start":{"line":4,"column":2},"end":{"line":4,"column":36}},"3":{"start":{"line":6,"column":2},"end":{"line":11,"column":3}},"4":{"start":{"line":7,"column":4},"end":{"line":7,"column":38}},"5":{"start":{"line":8,"column":4},"end":{"line":8,"column":52}},"6":{"start":{"line":10,"column":4},"end":{"line":10,"column":47}},"7":{"start":{"line":14,"column":0},"end":{"line":14,"column":58}}},"fnMap":{"0":{"name":"ForbiddenError","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":30}},"loc":{"start":{"line":1,"column":40},"end":{"line":12,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":6,"column":2},"end":{"line":11,"column":3}},{"start":{"line":6,"column":2},"end":{"line":11,"column":3}}],"line":6}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":1},"f":{"0":1},"b":{"0":[1,0]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"86a9e2c7c5cc51c5ce8ae63bbb7b93a3223d5020","contentHash":"caf6bff2575866d7d6790e0e99f1ea69_11.4.1"},"/home/sergii/projects/casl/packages/ability/src/rule.js":{"path":"/home/sergii/projects/casl/packages/ability/src/rule.js","statementMap":{"0":{"start":{"line":5,"column":4},"end":{"line":5,"column":40}},"1":{"start":{"line":6,"column":4},"end":{"line":6,"column":34}},"2":{"start":{"line":7,"column":4},"end":{"line":7,"column":34}},"3":{"start":{"line":8,"column":4},"end":{"line":8,"column":38}},"4":{"start":{"line":9,"column":4},"end":{"line":9,"column":67}},"5":{"start":{"line":13,"column":4},"end":{"line":13,"column":51}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":2},"end":{"line":4,"column":3}},"loc":{"start":{"line":4,"column":22},"end":{"line":10,"column":3}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":2},"end":{"line":12,"column":3}},"loc":{"start":{"line":12,"column":18},"end":{"line":14,"column":3}},"line":12}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":20},"end":{"line":9,"column":66}},"type":"cond-expr","locations":[{"start":{"line":9,"column":38},"end":{"line":9,"column":59}},{"start":{"line":9,"column":62},"end":{"line":9,"column":66}}],"line":9},"1":{"loc":{"start":{"line":13,"column":11},"end":{"line":13,"column":50}},"type":"binary-expr","locations":[{"start":{"line":13,"column":11},"end":{"line":13,"column":25}},{"start":{"line":13,"column":29},"end":{"line":13,"column":50}}],"line":13}},"s":{"0":130,"1":130,"2":130,"3":130,"4":130,"5":49},"f":{"0":130,"1":49},"b":{"0":[42,88],"1":[49,44]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"e88ed2d27a629e3186f7d65375ea195ec8314097","contentHash":"8408ed09fc09edd3059f6ee0ec8ee0de_11.4.1"},"/home/sergii/projects/casl/packages/ability/src/builder.js":{"path":"/home/sergii/projects/casl/packages/ability/src/builder.js","statementMap":{"0":{"start":{"line":4,"column":2},"end":{"line":4,"column":79}},"1":{"start":{"line":9,"column":20},"end":{"line":9,"column":62}},"2":{"start":{"line":10,"column":19},"end":{"line":10,"column":52}},"3":{"start":{"line":11,"column":20},"end":{"line":11,"column":30}},"4":{"start":{"line":12,"column":4},"end":{"line":12,"column":68}},"5":{"start":{"line":14,"column":4},"end":{"line":14,"column":47}},"6":{"start":{"line":18,"column":20},"end":{"line":18,"column":30}},"7":{"start":{"line":20,"column":4},"end":{"line":24,"column":6}},"8":{"start":{"line":28,"column":4},"end":{"line":28,"column":20}},"9":{"start":{"line":32,"column":4},"end":{"line":34,"column":5}},"10":{"start":{"line":33,"column":6},"end":{"line":33,"column":112}},"11":{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},"12":{"start":{"line":37,"column":6},"end":{"line":37,"column":123}},"13":{"start":{"line":40,"column":17},"end":{"line":40,"column":37}},"14":{"start":{"line":42,"column":4},"end":{"line":44,"column":5}},"15":{"start":{"line":43,"column":6},"end":{"line":43,"column":35}},"16":{"start":{"line":46,"column":4},"end":{"line":46,"column":26}},"17":{"start":{"line":48,"column":4},"end":{"line":48,"column":16}},"18":{"start":{"line":52,"column":17},"end":{"line":52,"column":34}},"19":{"start":{"line":53,"column":4},"end":{"line":53,"column":25}},"20":{"start":{"line":55,"column":4},"end":{"line":55,"column":16}}},"fnMap":{"0":{"name":"isStringOrNonEmptyArray","decl":{"start":{"line":3,"column":9},"end":{"line":3,"column":32}},"loc":{"start":{"line":3,"column":40},"end":{"line":5,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":2},"end":{"line":8,"column":3}},"loc":{"start":{"line":8,"column":29},"end":{"line":15,"column":3}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":17,"column":2},"end":{"line":17,"column":3}},"loc":{"start":{"line":17,"column":19},"end":{"line":25,"column":3}},"line":17},"3":{"name":"(anonymous_3)","decl":{"start":{"line":27,"column":2},"end":{"line":27,"column":3}},"loc":{"start":{"line":27,"column":16},"end":{"line":29,"column":3}},"line":27},"4":{"name":"(anonymous_4)","decl":{"start":{"line":31,"column":2},"end":{"line":31,"column":3}},"loc":{"start":{"line":31,"column":36},"end":{"line":49,"column":3}},"line":31},"5":{"name":"(anonymous_5)","decl":{"start":{"line":51,"column":2},"end":{"line":51,"column":3}},"loc":{"start":{"line":51,"column":18},"end":{"line":56,"column":3}},"line":51}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":9},"end":{"line":4,"column":78}},"type":"binary-expr","locations":[{"start":{"line":4,"column":9},"end":{"line":4,"column":34}},{"start":{"line":4,"column":38},"end":{"line":4,"column":58}},{"start":{"line":4,"column":62},"end":{"line":4,"column":78}}],"line":4},"1":{"loc":{"start":{"line":9,"column":20},"end":{"line":9,"column":62}},"type":"cond-expr","locations":[{"start":{"line":9,"column":51},"end":{"line":9,"column":53}},{"start":{"line":9,"column":56},"end":{"line":9,"column":62}}],"line":9},"2":{"loc":{"start":{"line":10,"column":19},"end":{"line":10,"column":52}},"type":"cond-expr","locations":[{"start":{"line":10,"column":40},"end":{"line":10,"column":43}},{"start":{"line":10,"column":46},"end":{"line":10,"column":52}}],"line":10},"3":{"loc":{"start":{"line":32,"column":4},"end":{"line":34,"column":5}},"type":"if","locations":[{"start":{"line":32,"column":4},"end":{"line":34,"column":5}},{"start":{"line":32,"column":4},"end":{"line":34,"column":5}}],"line":32},"4":{"loc":{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},{"start":{"line":36,"column":4},"end":{"line":38,"column":5}}],"line":36},"5":{"loc":{"start":{"line":42,"column":4},"end":{"line":44,"column":5}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":44,"column":5}},{"start":{"line":42,"column":4},"end":{"line":44,"column":5}}],"line":42},"6":{"loc":{"start":{"line":42,"column":8},"end":{"line":42,"column":52}},"type":"binary-expr","locations":[{"start":{"line":42,"column":8},"end":{"line":42,"column":38}},{"start":{"line":42,"column":42},"end":{"line":42,"column":52}}],"line":42}},"s":{"0":206,"1":40,"2":40,"3":40,"4":40,"5":40,"6":1,"7":1,"8":41,"9":103,"10":0,"11":103,"12":0,"13":103,"14":103,"15":50,"16":103,"17":103,"18":33,"19":33,"20":33},"f":{"0":206,"1":40,"2":1,"3":41,"4":103,"5":33},"b":{"0":[206,19,19],"1":[40,0],"2":[0,40],"3":[0,103],"4":[0,103],"5":[50,53],"6":[103,50]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"a2080b8e3621a061ce7fc35fab8f0dbf562bf6a8","contentHash":"31e5a7526a784160db091228f54bbded_11.4.1"},"/home/sergii/projects/casl/packages/ability/src/query.js":{"path":"/home/sergii/projects/casl/packages/ability/src/query.js","statementMap":{"0":{"start":{"line":2,"column":16},"end":{"line":2,"column":18}},"1":{"start":{"line":3,"column":26},"end":{"line":3,"column":28}},"2":{"start":{"line":5,"column":2},"end":{"line":23,"column":3}},"3":{"start":{"line":6,"column":17},"end":{"line":6,"column":25}},"4":{"start":{"line":7,"column":15},"end":{"line":7,"column":45}},"5":{"start":{"line":9,"column":4},"end":{"line":22,"column":5}},"6":{"start":{"line":10,"column":6},"end":{"line":12,"column":7}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":20}},"8":{"start":{"line":14,"column":6},"end":{"line":16,"column":7}},"9":{"start":{"line":15,"column":8},"end":{"line":15,"column":25}},"10":{"start":{"line":18,"column":6},"end":{"line":18,"column":33}},"11":{"start":{"line":19,"column":11},"end":{"line":22,"column":5}},"12":{"start":{"line":20,"column":6},"end":{"line":20,"column":34}},"13":{"start":{"line":21,"column":6},"end":{"line":21,"column":36}},"14":{"start":{"line":25,"column":2},"end":{"line":25,"column":41}}},"fnMap":{"0":{"name":"rulesToQuery","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":28}},"loc":{"start":{"line":1,"column":45},"end":{"line":26,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":15},"end":{"line":7,"column":45}},"type":"cond-expr","locations":[{"start":{"line":7,"column":31},"end":{"line":7,"column":37}},{"start":{"line":7,"column":40},"end":{"line":7,"column":45}}],"line":7},"1":{"loc":{"start":{"line":9,"column":4},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":9,"column":4},"end":{"line":22,"column":5}},{"start":{"line":9,"column":4},"end":{"line":22,"column":5}}],"line":9},"2":{"loc":{"start":{"line":10,"column":6},"end":{"line":12,"column":7}},"type":"if","locations":[{"start":{"line":10,"column":6},"end":{"line":12,"column":7}},{"start":{"line":10,"column":6},"end":{"line":12,"column":7}}],"line":10},"3":{"loc":{"start":{"line":14,"column":6},"end":{"line":16,"column":7}},"type":"if","locations":[{"start":{"line":14,"column":6},"end":{"line":16,"column":7}},{"start":{"line":14,"column":6},"end":{"line":16,"column":7}}],"line":14},"4":{"loc":{"start":{"line":19,"column":11},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":19,"column":11},"end":{"line":22,"column":5}},{"start":{"line":19,"column":11},"end":{"line":22,"column":5}}],"line":19},"5":{"loc":{"start":{"line":20,"column":18},"end":{"line":20,"column":33}},"type":"binary-expr","locations":[{"start":{"line":20,"column":18},"end":{"line":20,"column":27}},{"start":{"line":20,"column":31},"end":{"line":20,"column":33}}],"line":20},"6":{"loc":{"start":{"line":25,"column":9},"end":{"line":25,"column":40}},"type":"cond-expr","locations":[{"start":{"line":25,"column":28},"end":{"line":25,"column":33}},{"start":{"line":25,"column":36},"end":{"line":25,"column":40}}],"line":25}},"s":{"0":7,"1":7,"2":7,"3":16,"4":16,"5":16,"6":4,"7":2,"8":2,"9":1,"10":2,"11":12,"12":12,"13":12,"14":5},"f":{"0":7},"b":{"0":[8,8],"1":[4,12],"2":[2,2],"3":[1,1],"4":[12,0],"5":[12,8],"6":[5,0]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"d9bb3007bddc4c2d0d9a4ab0b02c8fa2b41161dc","contentHash":"84c229c73d594b400e8259581428ce60_11.4.1"}}
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for ability.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> ability.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>71/71</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">94.23% </span>
<span class="quiet">Branches</span>
<span class='fraction'>49/52</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>17/17</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>70/70</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">141x</span>
<span class="cline-any cline-yes">55x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">128x</span>
<span class="cline-any cline-yes">128x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">128x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">95x</span>
<span class="cline-any cline-yes">95x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">95x</span>
<span class="cline-any cline-yes">128x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">120x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">70x</span>
<span class="cline-any cline-yes">70x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">70x</span>
<span class="cline-any cline-yes">27x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">49x</span>
<span class="cline-any cline-yes">29x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">14x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">70x</span>
<span class="cline-any cline-yes">70x</span>
<span class="cline-any cline-yes">70x</span>
<span class="cline-any cline-yes">70x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">70x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">90x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">90x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ForbiddenError } from './error';
import { Rule } from './rule';
&nbsp;
function getSubjectName(subject) {
if (!subject || typeof subject === 'string') {
return subject;
}
&nbsp;
const Type = typeof subject === 'object' ? subject.constructor : subject;
&nbsp;
return Type.modelName || Type.name;
}
&nbsp;
function clone(object) {
return JSON.parse(JSON.stringify(object));
}
&nbsp;
const DEFAULT_ALIASES = {
manage: ['create', 'read', 'update', 'delete'],
};
const PRIVATE_FIELD = typeof Symbol !== 'undefined' ? Symbol.for('private') : <span class="branch-1 cbranch-no" title="branch not covered" >`__private${Date.now()}`;</span>
&nbsp;
export class Ability {
static addAlias(alias, actions) {
if (alias === actions || Array.isArray(actions) &amp;&amp; actions.indexOf(alias) !== -1) {
throw new Error(`Attempt to alias action to itself: ${alias} -&gt; ${actions.toString()}`);
}
&nbsp;
DEFAULT_ALIASES[alias] = actions;
return this;
}
&nbsp;
constructor(rules, { RuleType = Rule, subjectName = getSubjectName } = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
this[PRIVATE_FIELD] = {
RuleType,
subjectName,
originalRules: rules,
rules: {},
events: {},
aliases: clone(DEFAULT_ALIASES)
};
this.update(rules);
}
&nbsp;
update(rules) {
<span class="missing-if-branch" title="else path not taken" >E</span>if (Array.isArray(rules)) {
const payload = { rules, ability: this };
&nbsp;
this.emit('update', payload);
this[PRIVATE_FIELD].originalRules = Object.freeze(rules.slice(0));
this[PRIVATE_FIELD].rules = this.buildIndexFor(this.rules);
this.emit('updated', payload);
}
&nbsp;
return this;
}
&nbsp;
buildIndexFor(rules) {
const indexedRules = {};
const { RuleType } = this[PRIVATE_FIELD];
&nbsp;
for (let i = 0; i &lt; rules.length; i++) {
const rule = rules[i];
const actions = this.expandActions(rule.actions);
&nbsp;
for (let j = 0; j &lt; actions.length; j++) {
const action = actions[j];
const subjects = Array.isArray(rule.subject) ? rule.subject : [rule.subject];
&nbsp;
for (let k = 0; k &lt; subjects.length; k++) {
const subject = subjects[k];
indexedRules[subject] = indexedRules[subject] || {};
indexedRules[subject][action] = indexedRules[subject][action] || [];
indexedRules[subject][action].unshift(new RuleType(rule));
}
}
}
&nbsp;
return indexedRules;
}
&nbsp;
expandActions(rawActions) {
const actions = Array.isArray(rawActions) ? rawActions : [rawActions];
const { aliases } = this[PRIVATE_FIELD];
&nbsp;
return actions.reduce((expanded, action) =&gt; {
if (aliases.hasOwnProperty(action)) {
return expanded.concat(this.expandActions(aliases[action]));
}
&nbsp;
return expanded;
}, actions);
}
&nbsp;
get rules() {
return this[PRIVATE_FIELD].originalRules;
}
&nbsp;
can(action, subject) {
const subjectName = this[PRIVATE_FIELD].subjectName(subject);
const rules = this.rulesFor(action, subject);
&nbsp;
if (subject === subjectName) {
return rules.length &gt; 0 &amp;&amp; !rules[0].inverted;
}
&nbsp;
for (let i = 0; i &lt; rules.length; i++) {
if (rules[i].matches(subject)) {
return !rules[i].inverted;
}
}
&nbsp;
return false;
}
&nbsp;
rulesFor(action, subject) {
const subjectName = this[PRIVATE_FIELD].subjectName(subject);
const { rules } = this[PRIVATE_FIELD];
const specificRules = rules.hasOwnProperty(subjectName) ? rules[subjectName][action] : null;
const generalRules = rules.hasOwnProperty('all') ? rules.all[action] : null;
&nbsp;
return (specificRules || []).concat(generalRules || []);
}
&nbsp;
cannot(action, subject) {
return !this.can(action, subject);
}
&nbsp;
throwUnlessCan(action, subject) {
if (this.cannot(action, subject)) {
throw new ForbiddenError(`Cannot execute "${action}" on "${this[PRIVATE_FIELD].subjectName(subject)}"`);
}
}
&nbsp;
on(event, handler) {
const { events } = this[PRIVATE_FIELD];
let isAttached = true;
&nbsp;
if (!events[event]) {
events[event] = [];
}
&nbsp;
events[event].push(handler);
&nbsp;
return () =&gt; {
if (isAttached) {
const index = events[event].indexOf(handler);
events[event].splice(index, 1);
isAttached = false;
}
};
}
&nbsp;
emit(event, payload) {
const handlers = this[PRIVATE_FIELD].events[event];
&nbsp;
if (handlers) {
handlers.forEach(handler =&gt; handler(payload));
}
}
}
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 22:00:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
body, html {
margin:0; padding: 0;
height: 100%;
}
body {
font-family: Helvetica Neue, Helvetica, Arial;
font-size: 14px;
color:#333;
}
.small { font-size: 12px; }
*, *:after, *:before {
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
h1 { font-size: 20px; margin: 0;}
h2 { font-size: 14px; }
pre {
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
margin: 0;
padding: 0;
-moz-tab-size: 2;
-o-tab-size: 2;
tab-size: 2;
}
a { color:#0074D9; text-decoration:none; }
a:hover { text-decoration:underline; }
.strong { font-weight: bold; }
.space-top1 { padding: 10px 0 0 0; }
.pad2y { padding: 20px 0; }
.pad1y { padding: 10px 0; }
.pad2x { padding: 0 20px; }
.pad2 { padding: 20px; }
.pad1 { padding: 10px; }
.space-left2 { padding-left:55px; }
.space-right2 { padding-right:20px; }
.center { text-align:center; }
.clearfix { display:block; }
.clearfix:after {
content:'';
display:block;
height:0;
clear:both;
visibility:hidden;
}
.fl { float: left; }
@media only screen and (max-width:640px) {
.col3 { width:100%; max-width:100%; }
.hide-mobile { display:none!important; }
}
.quiet {
color: #7f7f7f;
color: rgba(0,0,0,0.5);
}
.quiet a { opacity: 0.7; }
.fraction {
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
font-size: 10px;
color: #555;
background: #E8E8E8;
padding: 4px 5px;
border-radius: 3px;
vertical-align: middle;
}
div.path a:link, div.path a:visited { color: #333; }
table.coverage {
border-collapse: collapse;
margin: 10px 0 0 0;
padding: 0;
}
table.coverage td {
margin: 0;
padding: 0;
vertical-align: top;
}
table.coverage td.line-count {
text-align: right;
padding: 0 5px 0 20px;
}
table.coverage td.line-coverage {
text-align: right;
padding-right: 10px;
min-width:20px;
}
table.coverage td span.cline-any {
display: inline-block;
padding: 0 5px;
width: 100%;
}
.missing-if-branch {
display: inline-block;
margin-right: 5px;
border-radius: 3px;
position: relative;
padding: 0 4px;
background: #333;
color: yellow;
}
.skip-if-branch {
display: none;
margin-right: 10px;
position: relative;
padding: 0 4px;
background: #ccc;
color: white;
}
.missing-if-branch .typ, .skip-if-branch .typ {
color: inherit !important;
}
.coverage-summary {
border-collapse: collapse;
width: 100%;
}
.coverage-summary tr { border-bottom: 1px solid #bbb; }
.keyline-all { border: 1px solid #ddd; }
.coverage-summary td, .coverage-summary th { padding: 10px; }
.coverage-summary tbody { border: 1px solid #bbb; }
.coverage-summary td { border-right: 1px solid #bbb; }
.coverage-summary td:last-child { border-right: none; }
.coverage-summary th {
text-align: left;
font-weight: normal;
white-space: nowrap;
}
.coverage-summary th.file { border-right: none !important; }
.coverage-summary th.pct { }
.coverage-summary th.pic,
.coverage-summary th.abs,
.coverage-summary td.pct,
.coverage-summary td.abs { text-align: right; }
.coverage-summary td.file { white-space: nowrap; }
.coverage-summary td.pic { min-width: 120px !important; }
.coverage-summary tfoot td { }
.coverage-summary .sorter {
height: 10px;
width: 7px;
display: inline-block;
margin-left: 0.5em;
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
}
.coverage-summary .sorted .sorter {
background-position: 0 -20px;
}
.coverage-summary .sorted-desc .sorter {
background-position: 0 -10px;
}
.status-line { height: 10px; }
/* dark red */
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
.low .chart { border:1px solid #C21F39 }
/* medium red */
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
/* light red */
.low, .cline-no { background:#FCE1E5 }
/* light green */
.high, .cline-yes { background:rgb(230,245,208) }
/* medium green */
.cstat-yes { background:rgb(161,215,106) }
/* dark green */
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
.high .chart { border:1px solid rgb(77,146,33) }
.medium .chart { border:1px solid #666; }
.medium .cover-fill { background: #666; }
.cbranch-no { background: yellow !important; color: #111; }
.cstat-skip { background: #ddd; color: #111; }
.fstat-skip { background: #ddd; color: #111 !important; }
.cbranch-skip { background: #ddd !important; color: #111; }
span.cline-neutral { background: #eaeaea; }
.medium { background: #eaeaea; }
.cover-fill, .cover-empty {
display:inline-block;
height: 12px;
}
.chart {
line-height: 0;
}
.cover-empty {
background: white;
}
.cover-full {
border-right: none !important;
}
pre.prettyprint {
border: none !important;
padding: 0 !important;
margin: 0 !important;
}
.com { color: #999 !important; }
.ignore-none { color: #999; font-weight: normal; }
.wrapper {
min-height: 100%;
height: auto !important;
height: 100%;
margin: 0 auto -48px;
}
.footer, .push {
height: 48px;
}
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for builder.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> builder.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">90.48% </span>
<span class="quiet">Statements</span>
<span class='fraction'>19/21</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">73.33% </span>
<span class="quiet">Branches</span>
<span class='fraction'>11/15</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>6/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">90.48% </span>
<span class="quiet">Lines</span>
<span class='fraction'>19/21</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">206x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">41x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">33x</span>
<span class="cline-any cline-yes">33x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">33x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Ability } from './ability';
&nbsp;
function isStringOrNonEmptyArray(value) {
return typeof value === 'string' || Array.isArray(value) &amp;&amp; value.length &gt; 0;
}
&nbsp;
export class AbilityBuilder {
static define(params, dsl) {
const options = typeof params === 'function' ? {} : <span class="branch-1 cbranch-no" title="branch not covered" >params;</span>
const define = params === options ? <span class="branch-0 cbranch-no" title="branch not covered" >dsl </span>: params;
const builder = new this();
define(builder.can.bind(builder), builder.cannot.bind(builder));
&nbsp;
return new Ability(builder.rules, options);
}
&nbsp;
static extract() {
const builder = new this();
&nbsp;
return {
can: builder.can.bind(builder),
cannot: builder.cannot.bind(builder),
rules: builder.rules
};
}
&nbsp;
constructor() {
this.rules = [];
}
&nbsp;
can(actions, subject, conditions) {
<span class="missing-if-branch" title="if path not taken" >I</span>if (!isStringOrNonEmptyArray(actions)) {
<span class="cstat-no" title="statement not covered" > throw new TypeError('AbilityBuilder#can expects the first parameter to be an action or array of actions');</span>
}
&nbsp;
<span class="missing-if-branch" title="if path not taken" >I</span>if (!isStringOrNonEmptyArray(subject)) {
<span class="cstat-no" title="statement not covered" > throw new TypeError('AbilityBuilder#can expects the second argument to be a subject name or array of subject names');</span>
}
&nbsp;
const rule = { actions, subject };
&nbsp;
if (typeof conditions === 'object' &amp;&amp; conditions) {
rule.conditions = conditions;
}
&nbsp;
this.rules.push(rule);
&nbsp;
return rule;
}
&nbsp;
cannot(...args) {
const rule = this.can(...args);
rule.inverted = true;
&nbsp;
return rule;
}
}
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 22:00:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for error.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> error.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">87.5% </span>
<span class="quiet">Statements</span>
<span class='fraction'>7/8</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">50% </span>
<span class="quiet">Branches</span>
<span class='fraction'>1/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">87.5% </span>
<span class="quiet">Lines</span>
<span class='fraction'>7/8</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export function ForbiddenError(message) {
Error.call(this);
this.message = message;
this.constructor = ForbiddenError;
&nbsp;
<span class="missing-if-branch" title="else path not taken" >E</span>if (typeof Error.captureStackTrace === 'function') {
this.name = this.constructor.name;
Error.captureStackTrace(this, this.constructor);
} else {
<span class="cstat-no" title="statement not covered" > this.stack = new Error(this.message).stack;</span>
}
}
&nbsp;
ForbiddenError.prototype = Object.create(Error.prototype);
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 22:00:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for All files</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
All files
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">97.52% </span>
<span class="quiet">Statements</span>
<span class='fraction'>118/121</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">88.51% </span>
<span class="quiet">Branches</span>
<span class='fraction'>77/87</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>27/27</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">97.5% </span>
<span class="quiet">Lines</span>
<span class='fraction'>117/120</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file high" data-value="ability.js"><a href="ability.js.html">ability.js</a></td>
<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
<td data-value="100" class="pct high">100%</td>
<td data-value="71" class="abs high">71/71</td>
<td data-value="94.23" class="pct high">94.23%</td>
<td data-value="52" class="abs high">49/52</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="17" class="abs high">17/17</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="70" class="abs high">70/70</td>
</tr>
<tr>
<td class="file high" data-value="builder.js"><a href="builder.js.html">builder.js</a></td>
<td data-value="90.48" class="pic high"><div class="chart"><div class="cover-fill" style="width: 90%;"></div><div class="cover-empty" style="width:10%;"></div></div></td>
<td data-value="90.48" class="pct high">90.48%</td>
<td data-value="21" class="abs high">19/21</td>
<td data-value="73.33" class="pct medium">73.33%</td>
<td data-value="15" class="abs medium">11/15</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="6" class="abs high">6/6</td>
<td data-value="90.48" class="pct high">90.48%</td>
<td data-value="21" class="abs high">19/21</td>
</tr>
<tr>
<td class="file high" data-value="error.js"><a href="error.js.html">error.js</a></td>
<td data-value="87.5" class="pic high"><div class="chart"><div class="cover-fill" style="width: 87%;"></div><div class="cover-empty" style="width:13%;"></div></div></td>
<td data-value="87.5" class="pct high">87.5%</td>
<td data-value="8" class="abs high">7/8</td>
<td data-value="50" class="pct medium">50%</td>
<td data-value="2" class="abs medium">1/2</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="1" class="abs high">1/1</td>
<td data-value="87.5" class="pct high">87.5%</td>
<td data-value="8" class="abs high">7/8</td>
</tr>
<tr>
<td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td>
<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
</tr>
<tr>
<td class="file high" data-value="query.js"><a href="query.js.html">query.js</a></td>
<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
<td data-value="100" class="pct high">100%</td>
<td data-value="15" class="abs high">15/15</td>
<td data-value="85.71" class="pct high">85.71%</td>
<td data-value="14" class="abs high">12/14</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="1" class="abs high">1/1</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="15" class="abs high">15/15</td>
</tr>
<tr>
<td class="file high" data-value="rule.js"><a href="rule.js.html">rule.js</a></td>
<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
<td data-value="100" class="pct high">100%</td>
<td data-value="6" class="abs high">6/6</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="4" class="abs high">4/4</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="2" class="abs high">2/2</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="6" class="abs high">6/6</td>
</tr>
</tbody>
</table>
</div><div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 22:00:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for index.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> index.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/0</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export * from './ability';
export * from './rule';
export * from './builder';
export * from './error';
export * from './query';
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 22:00:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for ability.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> ability.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>71/71</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">94.23% </span>
<span class="quiet">Branches</span>
<span class='fraction'>49/52</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>17/17</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>70/70</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">139x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">86x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">87x</span>
<span class="cline-any cline-yes">128x</span>
<span class="cline-any cline-yes">128x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">128x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">45x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">95x</span>
<span class="cline-any cline-yes">95x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">95x</span>
<span class="cline-any cline-yes">128x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">120x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-yes">26x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">43x</span>
<span class="cline-any cline-yes">49x</span>
<span class="cline-any cline-yes">29x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">14x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">69x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">90x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">90x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ForbiddenError } from './error';
import { Rule } from './rule';
&nbsp;
function getSubjectName(subject) {
if (!subject || typeof subject === 'string') {
return subject;
}
&nbsp;
const Type = typeof subject === 'object' ? subject.constructor : subject;
&nbsp;
return Type.modelName || Type.name;
}
&nbsp;
function clone(object) {
return JSON.parse(JSON.stringify(object));
}
&nbsp;
const DEFAULT_ALIASES = {
manage: ['create', 'read', 'update', 'delete'],
};
const PRIVATE_FIELD = typeof Symbol !== 'undefined' ? Symbol.for('private') : <span class="branch-1 cbranch-no" title="branch not covered" >`__private${Date.now()}`;</span>
&nbsp;
export class Ability {
static addAlias(alias, actions) {
if (alias === actions || Array.isArray(actions) &amp;&amp; actions.indexOf(alias) !== -1) {
throw new Error(`Attempt to alias action to itself: ${alias} -&gt; ${actions.toString()}`);
}
&nbsp;
DEFAULT_ALIASES[alias] = actions;
return this;
}
&nbsp;
constructor(rules, { RuleType = Rule, subjectName = getSubjectName } = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
this[PRIVATE_FIELD] = {
RuleType,
subjectName,
originalRules: rules,
rules: {},
events: {},
aliases: clone(DEFAULT_ALIASES)
};
this.update(rules);
}
&nbsp;
update(rules) {
<span class="missing-if-branch" title="else path not taken" >E</span>if (Array.isArray(rules)) {
const payload = { rules, ability: this };
&nbsp;
this.emit('update', payload);
this[PRIVATE_FIELD].originalRules = Object.freeze(rules.slice(0));
this[PRIVATE_FIELD].rules = this.buildIndexFor(this.rules);
this.emit('updated', payload);
}
&nbsp;
return this;
}
&nbsp;
buildIndexFor(rules) {
const indexedRules = {};
const { RuleType } = this[PRIVATE_FIELD];
&nbsp;
for (let i = 0; i &lt; rules.length; i++) {
const rule = rules[i];
const actions = this.expandActions(rule.actions);
&nbsp;
for (let j = 0; j &lt; actions.length; j++) {
const action = actions[j];
const subjects = Array.isArray(rule.subject) ? rule.subject : [rule.subject];
&nbsp;
for (let k = 0; k &lt; subjects.length; k++) {
const subject = subjects[k];
indexedRules[subject] = indexedRules[subject] || {};
indexedRules[subject][action] = indexedRules[subject][action] || [];
indexedRules[subject][action].unshift(new RuleType(rule));
}
}
}
&nbsp;
return indexedRules;
}
&nbsp;
expandActions(rawActions) {
const actions = Array.isArray(rawActions) ? rawActions : [rawActions];
const { aliases } = this[PRIVATE_FIELD];
&nbsp;
return actions.reduce((expanded, action) =&gt; {
if (aliases.hasOwnProperty(action)) {
return expanded.concat(this.expandActions(aliases[action]));
}
&nbsp;
return expanded;
}, actions);
}
&nbsp;
get rules() {
return this[PRIVATE_FIELD].originalRules;
}
&nbsp;
can(action, subject) {
const subjectName = this[PRIVATE_FIELD].subjectName(subject);
const rules = this.rulesFor(action, subject);
&nbsp;
if (subject === subjectName) {
return rules.length &gt; 0 &amp;&amp; !rules[0].inverted;
}
&nbsp;
for (let i = 0; i &lt; rules.length; i++) {
if (rules[i].matches(subject)) {
return !rules[i].inverted;
}
}
&nbsp;
return false;
}
&nbsp;
rulesFor(action, subject) {
const subjectName = this[PRIVATE_FIELD].subjectName(subject);
const { rules } = this[PRIVATE_FIELD];
const specificRules = rules.hasOwnProperty(subjectName) ? rules[subjectName][action] : null;
const generalRules = rules.hasOwnProperty('all') ? rules.all[action] : null;
&nbsp;
return (generalRules || []).concat(specificRules || []);
}
&nbsp;
cannot(action, subject) {
return !this.can(action, subject);
}
&nbsp;
throwUnlessCan(action, subject) {
if (this.cannot(action, subject)) {
throw new ForbiddenError(`Cannot execute "${action}" on "${this[PRIVATE_FIELD].subjectName(subject)}"`);
}
}
&nbsp;
on(event, handler) {
const { events } = this[PRIVATE_FIELD];
let isAttached = true;
&nbsp;
if (!events[event]) {
events[event] = [];
}
&nbsp;
events[event].push(handler);
&nbsp;
return () =&gt; {
if (isAttached) {
const index = events[event].indexOf(handler);
events[event].splice(index, 1);
isAttached = false;
}
};
}
&nbsp;
emit(event, payload) {
const handlers = this[PRIVATE_FIELD].events[event];
&nbsp;
if (handlers) {
handlers.forEach(handler =&gt; handler(payload));
}
}
}
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 21:52:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
body, html {
margin:0; padding: 0;
height: 100%;
}
body {
font-family: Helvetica Neue, Helvetica, Arial;
font-size: 14px;
color:#333;
}
.small { font-size: 12px; }
*, *:after, *:before {
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
h1 { font-size: 20px; margin: 0;}
h2 { font-size: 14px; }
pre {
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
margin: 0;
padding: 0;
-moz-tab-size: 2;
-o-tab-size: 2;
tab-size: 2;
}
a { color:#0074D9; text-decoration:none; }
a:hover { text-decoration:underline; }
.strong { font-weight: bold; }
.space-top1 { padding: 10px 0 0 0; }
.pad2y { padding: 20px 0; }
.pad1y { padding: 10px 0; }
.pad2x { padding: 0 20px; }
.pad2 { padding: 20px; }
.pad1 { padding: 10px; }
.space-left2 { padding-left:55px; }
.space-right2 { padding-right:20px; }
.center { text-align:center; }
.clearfix { display:block; }
.clearfix:after {
content:'';
display:block;
height:0;
clear:both;
visibility:hidden;
}
.fl { float: left; }
@media only screen and (max-width:640px) {
.col3 { width:100%; max-width:100%; }
.hide-mobile { display:none!important; }
}
.quiet {
color: #7f7f7f;
color: rgba(0,0,0,0.5);
}
.quiet a { opacity: 0.7; }
.fraction {
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
font-size: 10px;
color: #555;
background: #E8E8E8;
padding: 4px 5px;
border-radius: 3px;
vertical-align: middle;
}
div.path a:link, div.path a:visited { color: #333; }
table.coverage {
border-collapse: collapse;
margin: 10px 0 0 0;
padding: 0;
}
table.coverage td {
margin: 0;
padding: 0;
vertical-align: top;
}
table.coverage td.line-count {
text-align: right;
padding: 0 5px 0 20px;
}
table.coverage td.line-coverage {
text-align: right;
padding-right: 10px;
min-width:20px;
}
table.coverage td span.cline-any {
display: inline-block;
padding: 0 5px;
width: 100%;
}
.missing-if-branch {
display: inline-block;
margin-right: 5px;
border-radius: 3px;
position: relative;
padding: 0 4px;
background: #333;
color: yellow;
}
.skip-if-branch {
display: none;
margin-right: 10px;
position: relative;
padding: 0 4px;
background: #ccc;
color: white;
}
.missing-if-branch .typ, .skip-if-branch .typ {
color: inherit !important;
}
.coverage-summary {
border-collapse: collapse;
width: 100%;
}
.coverage-summary tr { border-bottom: 1px solid #bbb; }
.keyline-all { border: 1px solid #ddd; }
.coverage-summary td, .coverage-summary th { padding: 10px; }
.coverage-summary tbody { border: 1px solid #bbb; }
.coverage-summary td { border-right: 1px solid #bbb; }
.coverage-summary td:last-child { border-right: none; }
.coverage-summary th {
text-align: left;
font-weight: normal;
white-space: nowrap;
}
.coverage-summary th.file { border-right: none !important; }
.coverage-summary th.pct { }
.coverage-summary th.pic,
.coverage-summary th.abs,
.coverage-summary td.pct,
.coverage-summary td.abs { text-align: right; }
.coverage-summary td.file { white-space: nowrap; }
.coverage-summary td.pic { min-width: 120px !important; }
.coverage-summary tfoot td { }
.coverage-summary .sorter {
height: 10px;
width: 7px;
display: inline-block;
margin-left: 0.5em;
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
}
.coverage-summary .sorted .sorter {
background-position: 0 -20px;
}
.coverage-summary .sorted-desc .sorter {
background-position: 0 -10px;
}
.status-line { height: 10px; }
/* dark red */
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
.low .chart { border:1px solid #C21F39 }
/* medium red */
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
/* light red */
.low, .cline-no { background:#FCE1E5 }
/* light green */
.high, .cline-yes { background:rgb(230,245,208) }
/* medium green */
.cstat-yes { background:rgb(161,215,106) }
/* dark green */
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
.high .chart { border:1px solid rgb(77,146,33) }
.medium .chart { border:1px solid #666; }
.medium .cover-fill { background: #666; }
.cbranch-no { background: yellow !important; color: #111; }
.cstat-skip { background: #ddd; color: #111; }
.fstat-skip { background: #ddd; color: #111 !important; }
.cbranch-skip { background: #ddd !important; color: #111; }
span.cline-neutral { background: #eaeaea; }
.medium { background: #eaeaea; }
.cover-fill, .cover-empty {
display:inline-block;
height: 12px;
}
.chart {
line-height: 0;
}
.cover-empty {
background: white;
}
.cover-full {
border-right: none !important;
}
pre.prettyprint {
border: none !important;
padding: 0 !important;
margin: 0 !important;
}
.com { color: #999 !important; }
.ignore-none { color: #999; font-weight: normal; }
.wrapper {
min-height: 100%;
height: auto !important;
height: 100%;
margin: 0 auto -48px;
}
.footer, .push {
height: 48px;
}
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for builder.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> builder.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">90.48% </span>
<span class="quiet">Statements</span>
<span class='fraction'>19/21</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">73.33% </span>
<span class="quiet">Branches</span>
<span class='fraction'>11/15</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>6/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">90.48% </span>
<span class="quiet">Lines</span>
<span class='fraction'>19/21</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">206x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">40x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">41x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">33x</span>
<span class="cline-any cline-yes">33x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">33x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Ability } from './ability';
&nbsp;
function isStringOrNonEmptyArray(value) {
return typeof value === 'string' || Array.isArray(value) &amp;&amp; value.length &gt; 0;
}
&nbsp;
export class AbilityBuilder {
static define(params, dsl) {
const options = typeof params === 'function' ? {} : <span class="branch-1 cbranch-no" title="branch not covered" >params;</span>
const define = params === options ? <span class="branch-0 cbranch-no" title="branch not covered" >dsl </span>: params;
const builder = new this();
define(builder.can.bind(builder), builder.cannot.bind(builder));
&nbsp;
return new Ability(builder.rules, options);
}
&nbsp;
static extract() {
const builder = new this();
&nbsp;
return {
can: builder.can.bind(builder),
cannot: builder.cannot.bind(builder),
rules: builder.rules
};
}
&nbsp;
constructor() {
this.rules = [];
}
&nbsp;
can(actions, subject, conditions) {
<span class="missing-if-branch" title="if path not taken" >I</span>if (!isStringOrNonEmptyArray(actions)) {
<span class="cstat-no" title="statement not covered" > throw new TypeError('AbilityBuilder#can expects the first parameter to be an action or array of actions');</span>
}
&nbsp;
<span class="missing-if-branch" title="if path not taken" >I</span>if (!isStringOrNonEmptyArray(subject)) {
<span class="cstat-no" title="statement not covered" > throw new TypeError('AbilityBuilder#can expects the second argument to be a subject name or array of subject names');</span>
}
&nbsp;
const rule = { actions, subject };
&nbsp;
if (typeof conditions === 'object' &amp;&amp; conditions) {
rule.conditions = conditions;
}
&nbsp;
this.rules.push(rule);
&nbsp;
return rule;
}
&nbsp;
cannot(...args) {
const rule = this.can(...args);
rule.inverted = true;
&nbsp;
return rule;
}
}
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 21:52:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for error.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> error.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">87.5% </span>
<span class="quiet">Statements</span>
<span class='fraction'>7/8</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">50% </span>
<span class="quiet">Branches</span>
<span class='fraction'>1/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">87.5% </span>
<span class="quiet">Lines</span>
<span class='fraction'>7/8</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export function ForbiddenError(message) {
Error.call(this);
this.message = message;
this.constructor = ForbiddenError;
&nbsp;
<span class="missing-if-branch" title="else path not taken" >E</span>if (typeof Error.captureStackTrace === 'function') {
this.name = this.constructor.name;
Error.captureStackTrace(this, this.constructor);
} else {
<span class="cstat-no" title="statement not covered" > this.stack = new Error(this.message).stack;</span>
}
}
&nbsp;
ForbiddenError.prototype = Object.create(Error.prototype);
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 21:52:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for All files</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
All files
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">97.52% </span>
<span class="quiet">Statements</span>
<span class='fraction'>118/121</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">88.51% </span>
<span class="quiet">Branches</span>
<span class='fraction'>77/87</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>27/27</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">97.5% </span>
<span class="quiet">Lines</span>
<span class='fraction'>117/120</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file high" data-value="ability.js"><a href="ability.js.html">ability.js</a></td>
<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
<td data-value="100" class="pct high">100%</td>
<td data-value="71" class="abs high">71/71</td>
<td data-value="94.23" class="pct high">94.23%</td>
<td data-value="52" class="abs high">49/52</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="17" class="abs high">17/17</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="70" class="abs high">70/70</td>
</tr>
<tr>
<td class="file high" data-value="builder.js"><a href="builder.js.html">builder.js</a></td>
<td data-value="90.48" class="pic high"><div class="chart"><div class="cover-fill" style="width: 90%;"></div><div class="cover-empty" style="width:10%;"></div></div></td>
<td data-value="90.48" class="pct high">90.48%</td>
<td data-value="21" class="abs high">19/21</td>
<td data-value="73.33" class="pct medium">73.33%</td>
<td data-value="15" class="abs medium">11/15</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="6" class="abs high">6/6</td>
<td data-value="90.48" class="pct high">90.48%</td>
<td data-value="21" class="abs high">19/21</td>
</tr>
<tr>
<td class="file high" data-value="error.js"><a href="error.js.html">error.js</a></td>
<td data-value="87.5" class="pic high"><div class="chart"><div class="cover-fill" style="width: 87%;"></div><div class="cover-empty" style="width:13%;"></div></div></td>
<td data-value="87.5" class="pct high">87.5%</td>
<td data-value="8" class="abs high">7/8</td>
<td data-value="50" class="pct medium">50%</td>
<td data-value="2" class="abs medium">1/2</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="1" class="abs high">1/1</td>
<td data-value="87.5" class="pct high">87.5%</td>
<td data-value="8" class="abs high">7/8</td>
</tr>
<tr>
<td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td>
<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
</tr>
<tr>
<td class="file high" data-value="query.js"><a href="query.js.html">query.js</a></td>
<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
<td data-value="100" class="pct high">100%</td>
<td data-value="15" class="abs high">15/15</td>
<td data-value="85.71" class="pct high">85.71%</td>
<td data-value="14" class="abs high">12/14</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="1" class="abs high">1/1</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="15" class="abs high">15/15</td>
</tr>
<tr>
<td class="file high" data-value="rule.js"><a href="rule.js.html">rule.js</a></td>
<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
<td data-value="100" class="pct high">100%</td>
<td data-value="6" class="abs high">6/6</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="4" class="abs high">4/4</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="2" class="abs high">2/2</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="6" class="abs high">6/6</td>
</tr>
</tbody>
</table>
</div><div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 21:52:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for index.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> index.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/0</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export * from './ability';
export * from './rule';
export * from './builder';
export * from './error';
export * from './query';
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 21:52:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for query.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> query.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>15/15</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">85.71% </span>
<span class="quiet">Branches</span>
<span class='fraction'>12/14</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>15/15</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export function rulesToQuery(rules, convert) {
const query = {};
const ignoreOperators = {};
&nbsp;
for (let i = 0; i &lt; rules.length; i++) {
const rule = rules[i];
const op = rule.inverted ? '$and' : '$or';
&nbsp;
if (!rule.conditions) {
if (rule.inverted) {
return null;
}
&nbsp;
if (query[op]) {
delete query[op];
}
&nbsp;
ignoreOperators[op] = true;
} else <span class="missing-if-branch" title="else path not taken" >E</span>if (!ignoreOperators.hasOwnProperty(op)) {
query[op] = query[op] || [];
query[op].push(convert(rule));
}
}
&nbsp;
return rules.length &gt; 0 ? query : <span class="branch-1 cbranch-no" title="branch not covered" >null;</span>
}
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 21:52:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for rule.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> rule.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>6/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>4/4</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>2/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>6/6</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">49x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import sift from 'sift';
&nbsp;
export class Rule {
constructor(params) {
this.conditions = params.conditions;
this.actions = params.actions;
this.subject = params.subject;
this.inverted = !!params.inverted;
this._matches = this.conditions ? sift(this.conditions) : null;
}
&nbsp;
matches(object) {
return !this._matches || this._matches(object);
}
}
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 21:52:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>

Sorry, the diff of this file is not supported yet

var addSorting = (function () {
"use strict";
var cols,
currentSort = {
index: 0,
desc: false
};
// returns the summary table element
function getTable() { return document.querySelector('.coverage-summary'); }
// returns the thead element of the summary table
function getTableHeader() { return getTable().querySelector('thead tr'); }
// returns the tbody element of the summary table
function getTableBody() { return getTable().querySelector('tbody'); }
// returns the th element for nth column
function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; }
// loads all columns
function loadColumns() {
var colNodes = getTableHeader().querySelectorAll('th'),
colNode,
cols = [],
col,
i;
for (i = 0; i < colNodes.length; i += 1) {
colNode = colNodes[i];
col = {
key: colNode.getAttribute('data-col'),
sortable: !colNode.getAttribute('data-nosort'),
type: colNode.getAttribute('data-type') || 'string'
};
cols.push(col);
if (col.sortable) {
col.defaultDescSort = col.type === 'number';
colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>';
}
}
return cols;
}
// attaches a data attribute to every tr element with an object
// of data values keyed by column name
function loadRowData(tableRow) {
var tableCols = tableRow.querySelectorAll('td'),
colNode,
col,
data = {},
i,
val;
for (i = 0; i < tableCols.length; i += 1) {
colNode = tableCols[i];
col = cols[i];
val = colNode.getAttribute('data-value');
if (col.type === 'number') {
val = Number(val);
}
data[col.key] = val;
}
return data;
}
// loads all row data
function loadData() {
var rows = getTableBody().querySelectorAll('tr'),
i;
for (i = 0; i < rows.length; i += 1) {
rows[i].data = loadRowData(rows[i]);
}
}
// sorts the table using the data for the ith column
function sortByIndex(index, desc) {
var key = cols[index].key,
sorter = function (a, b) {
a = a.data[key];
b = b.data[key];
return a < b ? -1 : a > b ? 1 : 0;
},
finalSorter = sorter,
tableBody = document.querySelector('.coverage-summary tbody'),
rowNodes = tableBody.querySelectorAll('tr'),
rows = [],
i;
if (desc) {
finalSorter = function (a, b) {
return -1 * sorter(a, b);
};
}
for (i = 0; i < rowNodes.length; i += 1) {
rows.push(rowNodes[i]);
tableBody.removeChild(rowNodes[i]);
}
rows.sort(finalSorter);
for (i = 0; i < rows.length; i += 1) {
tableBody.appendChild(rows[i]);
}
}
// removes sort indicators for current column being sorted
function removeSortIndicators() {
var col = getNthColumn(currentSort.index),
cls = col.className;
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
col.className = cls;
}
// adds sort indicators for current column being sorted
function addSortIndicators() {
getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted';
}
// adds event listeners for all sorter widgets
function enableUI() {
var i,
el,
ithSorter = function ithSorter(i) {
var col = cols[i];
return function () {
var desc = col.defaultDescSort;
if (currentSort.index === i) {
desc = !currentSort.desc;
}
sortByIndex(i, desc);
removeSortIndicators();
currentSort.index = i;
currentSort.desc = desc;
addSortIndicators();
};
};
for (i =0 ; i < cols.length; i += 1) {
if (cols[i].sortable) {
// add the click event handler on the th so users
// dont have to click on those tiny arrows
el = getNthColumn(i).querySelector('.sorter').parentElement;
if (el.addEventListener) {
el.addEventListener('click', ithSorter(i));
} else {
el.attachEvent('onclick', ithSorter(i));
}
}
}
}
// adds sorting functionality to the UI
return function () {
if (!getTable()) {
return;
}
cols = loadColumns();
loadData(cols);
addSortIndicators();
enableUI();
};
})();
window.addEventListener('load', addSorting);

Sorry, the diff of this file is not supported yet

.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for query.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> query.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>15/15</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">85.71% </span>
<span class="quiet">Branches</span>
<span class='fraction'>12/14</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>15/15</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export function rulesToQuery(rules, convert) {
const query = {};
const ignoreOperators = {};
&nbsp;
for (let i = 0; i &lt; rules.length; i++) {
const rule = rules[i];
const op = rule.inverted ? '$and' : '$or';
&nbsp;
if (!rule.conditions) {
if (rule.inverted) {
return null;
}
&nbsp;
if (query[op]) {
delete query[op];
}
&nbsp;
ignoreOperators[op] = true;
} else <span class="missing-if-branch" title="else path not taken" >E</span>if (!ignoreOperators.hasOwnProperty(op)) {
query[op] = query[op] || [];
query[op].push(convert(rule));
}
}
&nbsp;
return rules.length &gt; 0 ? query : <span class="branch-1 cbranch-no" title="branch not covered" >null;</span>
}
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 22:00:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for rule.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="index.html">All files</a> rule.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>6/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>4/4</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>2/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>6/6</span>
</div>
</div>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-yes">130x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">49x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import sift from 'sift';
&nbsp;
export class Rule {
constructor(params) {
this.conditions = params.conditions;
this.actions = params.actions;
this.subject = params.subject;
this.inverted = !!params.inverted;
this._matches = this.conditions ? sift(this.conditions) : null;
}
&nbsp;
matches(object) {
return !this._matches || this._matches(object);
}
}
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Feb 22 2018 22:00:09 GMT+0200 (EET)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>

Sorry, the diff of this file is not supported yet

var addSorting = (function () {
"use strict";
var cols,
currentSort = {
index: 0,
desc: false
};
// returns the summary table element
function getTable() { return document.querySelector('.coverage-summary'); }
// returns the thead element of the summary table
function getTableHeader() { return getTable().querySelector('thead tr'); }
// returns the tbody element of the summary table
function getTableBody() { return getTable().querySelector('tbody'); }
// returns the th element for nth column
function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; }
// loads all columns
function loadColumns() {
var colNodes = getTableHeader().querySelectorAll('th'),
colNode,
cols = [],
col,
i;
for (i = 0; i < colNodes.length; i += 1) {
colNode = colNodes[i];
col = {
key: colNode.getAttribute('data-col'),
sortable: !colNode.getAttribute('data-nosort'),
type: colNode.getAttribute('data-type') || 'string'
};
cols.push(col);
if (col.sortable) {
col.defaultDescSort = col.type === 'number';
colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>';
}
}
return cols;
}
// attaches a data attribute to every tr element with an object
// of data values keyed by column name
function loadRowData(tableRow) {
var tableCols = tableRow.querySelectorAll('td'),
colNode,
col,
data = {},
i,
val;
for (i = 0; i < tableCols.length; i += 1) {
colNode = tableCols[i];
col = cols[i];
val = colNode.getAttribute('data-value');
if (col.type === 'number') {
val = Number(val);
}
data[col.key] = val;
}
return data;
}
// loads all row data
function loadData() {
var rows = getTableBody().querySelectorAll('tr'),
i;
for (i = 0; i < rows.length; i += 1) {
rows[i].data = loadRowData(rows[i]);
}
}
// sorts the table using the data for the ith column
function sortByIndex(index, desc) {
var key = cols[index].key,
sorter = function (a, b) {
a = a.data[key];
b = b.data[key];
return a < b ? -1 : a > b ? 1 : 0;
},
finalSorter = sorter,
tableBody = document.querySelector('.coverage-summary tbody'),
rowNodes = tableBody.querySelectorAll('tr'),
rows = [],
i;
if (desc) {
finalSorter = function (a, b) {
return -1 * sorter(a, b);
};
}
for (i = 0; i < rowNodes.length; i += 1) {
rows.push(rowNodes[i]);
tableBody.removeChild(rowNodes[i]);
}
rows.sort(finalSorter);
for (i = 0; i < rows.length; i += 1) {
tableBody.appendChild(rows[i]);
}
}
// removes sort indicators for current column being sorted
function removeSortIndicators() {
var col = getNthColumn(currentSort.index),
cls = col.className;
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
col.className = cls;
}
// adds sort indicators for current column being sorted
function addSortIndicators() {
getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted';
}
// adds event listeners for all sorter widgets
function enableUI() {
var i,
el,
ithSorter = function ithSorter(i) {
var col = cols[i];
return function () {
var desc = col.defaultDescSort;
if (currentSort.index === i) {
desc = !currentSort.desc;
}
sortByIndex(i, desc);
removeSortIndicators();
currentSort.index = i;
currentSort.desc = desc;
addSortIndicators();
};
};
for (i =0 ; i < cols.length; i += 1) {
if (cols[i].sortable) {
// add the click event handler on the th so users
// dont have to click on those tiny arrows
el = getNthColumn(i).querySelector('.sorter').parentElement;
if (el.addEventListener) {
el.addEventListener('click', ithSorter(i));
} else {
el.attachEvent('onclick', ithSorter(i));
}
}
}
}
// adds sorting functionality to the UI
return function () {
if (!getTable()) {
return;
}
cols = loadColumns();
loadData(cols);
addSortIndicators();
enableUI();
};
})();
window.addEventListener('load', addSorting);
(function(factory) {
if (typeof window === 'object') {
window.global = window;
factory(window.chai, window);
} else if (typeof require === 'function' && typeof module !== 'undefined') {
require('chai').use(require('chai-spies'));
factory(require('chai'), global);
}
})(function(chai, global) {
global.expect = chai.expect;
global.spy = chai.spy;
chai.Assertion.addMethod('allow', function(action, subject) {
const subjectRepresantation = prettifyObject(subject)
this.assert(
this._obj.can(action, subject),
`expected ability to allow ${action} on ${subjectRepresantation}`,
`expected ability to not allow ${action} on ${subjectRepresantation}`
);
});
function prettifyObject(object) {
if (!object || typeof object === 'string') {
return object;
}
if (typeof object === 'function') {
return object.name;
}
const attrs = JSON.stringify(object);
return `${object.constructor.name} { ${attrs[0] === '{' ? attrs.slice(1, -1) : attrs} }`
}
});