express-restify-mt-mongoose
Version:
Easily create a flexible REST interface for mongoose models
192 lines (162 loc) • 18.3 kB
JavaScript
'use strict';
var _ = require('lodash');
var detective = require('mongoose-detective');
var weedout = require('weedout');
/**
* Represents a filter.
* @constructor
* @param {Object} opts - Options
* @param {Object} opts.model - Mongoose model
* @param {Object} opts.excludedMap {} - Filtered keys for related models
* @param {Object} opts.filteredKeys {} - Keys to filter for the current model
*/
function Filter(opts) {
this.model = opts.model;
this.filteredKeys = _.isPlainObject(opts.filteredKeys) ? {
private: opts.filteredKeys.private || [],
protected: opts.filteredKeys.protected || []
} : {
private: [],
protected: []
};
if (this.model && this.model.discriminators && _.isPlainObject(opts.excludedMap)) {
for (var modelName in this.model.discriminators) {
if (opts.excludedMap[modelName]) {
this.filteredKeys.private = this.filteredKeys.private.concat(opts.excludedMap[modelName].private);
this.filteredKeys.protected = this.filteredKeys.protected.concat(opts.excludedMap[modelName].protected);
}
}
}
}
/**
* Gets excluded keys for a given model and access.
* @memberof Filter
* @param {Object} - Options.
* @param {String} opts.access {public} - Access level (private, protected or public).
* @param {Object} opts.excludedMap {} - Filtered keys for related models
* @param {Object} opts.filteredKeys {} - Keys to filter for the current model
* @returns {Array} - Keys to filter.
*/
Filter.prototype.getExcluded = function (opts) {
if (opts.access === 'private') {
return [];
}
var entry = opts.excludedMap && opts.modelName ? opts.excludedMap[opts.modelName] : null;
if (!entry) {
entry = _.isPlainObject(opts.filteredKeys) ? {
private: opts.filteredKeys.private || [],
protected: opts.filteredKeys.protected || []
} : {
private: [],
protected: []
};
}
return opts.access === 'protected' ? entry.private : entry.private.concat(entry.protected);
};
Filter.prototype.isExcluded = function (field, opts) {
if (!field) {
return false;
}
opts = _.defaults(opts, {
access: 'public',
excludedMap: {},
filteredKeys: this.filteredKeys,
modelName: this.model.modelName
});
return this.getExcluded(opts).indexOf(field) >= 0;
};
/**
* Removes excluded keys from a document.
* @memberof Filter
* @param {Object} - Source document.
* @param {Array} - Keys to filter.
* @returns {Object} - Filtered document.
*/
Filter.prototype.filterItem = function (item, excluded) {
var _this = this;
if (_.isArray(item)) {
return item.map(function (i) {
return _this.filterItem(i, excluded);
});
}
if (item && excluded) {
if (_.isFunction(item.toObject)) {
item = item.toObject();
}
for (var i = 0, length = excluded.length; i < length; i++) {
if (excluded[i].indexOf('.') > 0) {
weedout(item, excluded[i]);
} else {
delete item[excluded[i]];
}
}
}
return item;
};
/**
* Removes excluded keys from a document with populated subdocuments.
* @memberof Filter
* @param {Object} - Source document.
* @param {Object} - Keys to filter.
* @param {Array} opts.populate - Paths to populated subdocuments.
* @param {String} opts.access - Access level (private, protected or public).
* @param {Object} opts.excludedMap {} - Filtered keys for related models
* @returns {Object} - Filtered document.
*/
Filter.prototype.filterPopulatedItem = function (item, opts) {
var _this2 = this;
if (_.isArray(item)) {
return item.map(function (i) {
return _this2.filterPopulatedItem(i, opts);
});
}
for (var i = 0; i < opts.populate.length; i++) {
if (!opts.populate[i].path) {
continue;
}
var excluded = this.getExcluded({
access: opts.access,
excludedMap: opts.excludedMap,
modelName: detective(this.model, opts.populate[i].path)
});
if (_.has(item, opts.populate[i].path)) {
this.filterItem(_.get(item, opts.populate[i].path), excluded);
} else {
var pathToArray = opts.populate[i].path.split('.').slice(0, -1).join('.');
if (_.has(item, pathToArray)) {
var array = _.get(item, pathToArray);
var pathToObject = opts.populate[i].path.split('.').slice(-1).join('.');
this.filterItem(_.map(array, pathToObject), excluded);
}
}
}
return item;
};
/**
* Removes excluded keys from a document.
* @memberof Filter
* @access public
* @param {Object} - Source document.
* @param {Object} - Options.
* @param {String} opts.access {public} - Access level (private, protected or public).
* @param {Object} opts.excludedMap {} - Filtered keys for related models
* @param {Array} opts.populate - Paths to populated subdocuments.
* @returns {Object} - Filtered document.
*/
Filter.prototype.filterObject = function (resource) {
var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
opts = _.defaults(opts, {
access: 'public',
excludedMap: {},
filteredKeys: this.filteredKeys,
modelName: this.model.modelName
});
var filtered = this.filterItem(resource, this.getExcluded(opts));
if (opts.populate) {
this.filterPopulatedItem(filtered, opts);
}
return filtered;
};
module.exports = Filter;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXNvdXJjZV9maWx0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNLElBQUksUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNLFlBQVksUUFBUSxvQkFBUixDQUFsQjtBQUNBLElBQU0sVUFBVSxRQUFRLFNBQVIsQ0FBaEI7Ozs7Ozs7Ozs7QUFVQSxTQUFTLE1BQVQsQ0FBaUIsSUFBakIsRUFBdUI7QUFDckIsT0FBSyxLQUFMLEdBQWEsS0FBSyxLQUFsQjs7QUFFQSxPQUFLLFlBQUwsR0FBb0IsRUFBRSxhQUFGLENBQWdCLEtBQUssWUFBckIsSUFBcUM7QUFDdkQsYUFBUyxLQUFLLFlBQUwsQ0FBa0IsT0FBbEIsSUFBNkIsRUFEaUI7QUFFdkQsZUFBVyxLQUFLLFlBQUwsQ0FBa0IsU0FBbEIsSUFBK0I7QUFGYSxHQUFyQyxHQUdoQjtBQUNGLGFBQVMsRUFEUDtBQUVGLGVBQVc7QUFGVCxHQUhKOztBQVFBLE1BQUksS0FBSyxLQUFMLElBQWMsS0FBSyxLQUFMLENBQVcsY0FBekIsSUFBMkMsRUFBRSxhQUFGLENBQWdCLEtBQUssV0FBckIsQ0FBL0MsRUFBa0Y7QUFDaEYsU0FBSyxJQUFJLFNBQVQsSUFBc0IsS0FBSyxLQUFMLENBQVcsY0FBakMsRUFBaUQ7QUFDL0MsVUFBSSxLQUFLLFdBQUwsQ0FBaUIsU0FBakIsQ0FBSixFQUFpQztBQUMvQixhQUFLLFlBQUwsQ0FBa0IsT0FBbEIsR0FBNEIsS0FBSyxZQUFMLENBQWtCLE9BQWxCLENBQTBCLE1BQTFCLENBQWlDLEtBQUssV0FBTCxDQUFpQixTQUFqQixFQUE0QixPQUE3RCxDQUE1QjtBQUNBLGFBQUssWUFBTCxDQUFrQixTQUFsQixHQUE4QixLQUFLLFlBQUwsQ0FBa0IsU0FBbEIsQ0FBNEIsTUFBNUIsQ0FBbUMsS0FBSyxXQUFMLENBQWlCLFNBQWpCLEVBQTRCLFNBQS9ELENBQTlCO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7Ozs7Ozs7Ozs7O0FBV0QsT0FBTyxTQUFQLENB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QSxNQUFYLElBQVcseURBQUosRUFBSTs7QUFDN0QsU0FBTyxFQUFFLFFBQUYsQ0FBVyxJQUFYLEVBQWlCO0FBQ3RCLFlBQVEsUUFEYztBQUV0QixpQkFBYSxFQUZTO0FBR3RCLGtCQUFjLEtBQUssWUFIRztBQUl0QixlQUFXLEtBQUssS0FBTCxDQUFXO0FBSkEsR0FBakIsQ0FBUDs7QUFPQSxNQUFJLFdBQVcsS0FBSyxVQUFMLENBQWdCLFFBQWhCLEVBQTBCLEtBQUssV0FBTCxDQUFpQixJQUFqQixDQUExQixDQUFmOztBQUVBLE1BQUksS0FBSyxRQUFULEVBQW1CO0FBQ2pCLFNBQUssbUJBQUwsQ0FBeUIsUUFBekIsRUFBbUMsSUFBbkM7QUFDRDs7QUFFRCxTQUFPLFFBQVA7QUFDRCxDQWZEOztBQWlCQSxPQUFPLE9BQVAsR0FBaUIsTUFBakIiLCJmaWxlIjoicmVzb3VyY2VfZmlsdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpXHJcbmNvbnN0IGRldGVjdGl2ZSA9IHJlcXVpcmUoJ21vbmdvb3NlLWRldGVjdGl2ZScpXHJcbmNvbnN0IHdlZWRvdXQgPSByZXF1aXJlKCd3ZWVkb3V0JylcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgZmlsdGVyLlxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzLm1vZGVsIC0gTW9uZ29vc2UgbW9kZWxcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMuZXhjbHVkZWRNYXAge30gLSBGaWx0ZXJlZCBrZXlzIGZvciByZWxhdGVkIG1vZGVsc1xyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cy5maWx0ZXJlZEtleXMge30gLSBLZXlzIHRvIGZpbHRlciBmb3IgdGhlIGN1cnJlbnQgbW9kZWxcclxuICovXHJcbmZ1bmN0aW9uIEZpbHRlciAob3B0cykge1xyXG4gIHRoaXMubW9kZWwgPSBvcHRzLm1vZGVsXHJcblxyXG4gIHRoaXMuZmlsdGVyZWRLZXlzID0gXy5pc1BsYWluT2JqZWN0KG9wdHMuZmlsdGVyZWRLZXlzKSA/IHtcclxuICAgIHByaXZhdGU6IG9wdHMuZmlsdGVyZWRLZXlzLnByaXZhdGUgfHwgW10sXHJcbiAgICBwcm90ZWN0ZWQ6IG9wdHMuZmlsdGVyZWRLZXlzLnByb3RlY3RlZCB8fCBbXVxyXG4gIH0gOiB7XHJcbiAgICBwcml2YXRlOiBbXSxcclxuICAgIHByb3RlY3RlZDogW11cclxuICB9XHJcblxyXG4gIGlmICh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuZGlzY3JpbWluYXRvcnMgJiYgXy5pc1BsYWluT2JqZWN0KG9wdHMuZXhjbHVkZWRNYXApKSB7XHJcbiAgICBmb3IgKGxldCBtb2RlbE5hbWUgaW4gdGhpcy5tb2RlbC5kaXNjcmltaW5hdG9ycykge1xyXG4gICAgICBpZiAob3B0cy5leGNsdWRlZE1hcFttb2RlbE5hbWVdKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEtleXMucHJpdmF0ZSA9IHRoaXMuZmlsdGVyZWRLZXlzLnByaXZhdGUuY29uY2F0KG9wdHMuZXhjbHVkZWRNYXBbbW9kZWxOYW1lXS5wcml2YXRlKVxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRLZXlzLnByb3RlY3RlZCA9IHRoaXMuZmlsdGVyZWRLZXlzLnByb3RlY3RlZC5jb25jYXQob3B0cy5leGNsdWRlZE1hcFttb2RlbE5hbWVdLnByb3RlY3RlZClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgZXhjbHVkZWQga2V5cyBmb3IgYSBnaXZlbiBtb2RlbCBhbmQgYWNjZXNzLlxyXG4gKiBAbWVtYmVyb2YgRmlsdGVyXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSAtIE9wdGlvbnMuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRzLmFjY2VzcyB7cHVibGljfSAtIEFjY2VzcyBsZXZlbCAocHJpdmF0ZSwgcHJvdGVjdGVkIG9yIHB1YmxpYykuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzLmV4Y2x1ZGVkTWFwIHt9IC0gRmlsdGVyZWQga2V5cyBmb3IgcmVsYXRlZCBtb2RlbHNcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMuZmlsdGVyZWRLZXlzIHt9IC0gS2V5cyB0byBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IG1vZGVsXHJcbiAqIEByZXR1cm5zIHtBcnJheX0gLSBLZXlzIHRvIGZpbHRlci5cclxuICovXHJcbkZpbHRlci5wcm90b3R5cGUuZ2V0RXhjbHVkZWQgPSBmdW5jdGlvbiAob3B0cykge1xyXG4gIGlmIChvcHRzLmFjY2VzcyA9PT0gJ3ByaXZhdGUnKSB7XHJcbiAgICByZXR1cm4gW11cclxuICB9XHJcblxyXG4gIGxldCBlbnRyeSA9IG9wdHMuZXhjbHVkZWRNYXAgJiYgb3B0cy5tb2RlbE5hbWUgPyBvcHRzLmV4Y2x1ZGVkTWFwW29wdHMubW9kZWxOYW1lXSA6IG51bGxcclxuXHJcbiAgaWYgKCFlbnRyeSkge1xyXG4gICAgZW50cnkgPSBfLmlzUGxhaW5PYmplY3Qob3B0cy5maWx0ZXJlZEtleXMpID8ge1xyXG4gICAgICBwcml2YXRlOiBvcHRzLmZpbHRlcmVkS2V5cy5wcml2YXRlIHx8IFtdLFxyXG4gICAgICBwcm90ZWN0ZWQ6IG9wdHMuZmlsdGVyZWRLZXlzLnByb3RlY3RlZCB8fCBbXVxyXG4gICAgfSA6IHtcclxuICAgICAgcHJpdmF0ZTogW10sXHJcbiAgICAgIHByb3RlY3RlZDogW11cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBvcHRzLmFjY2VzcyA9PT0gJ3Byb3RlY3RlZCcgPyBlbnRyeS5wcml2YXRlIDogZW50cnkucHJpdmF0ZS5jb25jYXQoZW50cnkucHJvdGVjdGVkKVxyXG59XHJcblxyXG5GaWx0ZXIucHJvdG90eXBlLmlzRXhjbHVkZWQgPSBmdW5jdGlvbiAoZmllbGQsIG9wdHMpIHtcclxuICBpZiAoIWZpZWxkKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIG9wdHMgPSBfLmRlZmF1bHRzKG9wdHMsIHtcclxuICAgIGFjY2VzczogJ3B1YmxpYycsXHJcbiAgICBleGNsdWRlZE1hcDoge30sXHJcbiAgICBmaWx0ZXJlZEtleXM6IHRoaXMuZmlsdGVyZWRLZXlzLFxyXG4gICAgbW9kZWxOYW1lOiB0aGlzLm1vZGVsLm1vZGVsTmFtZVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB0aGlzLmdldEV4Y2x1ZGVkKG9wdHMpLmluZGV4T2YoZmllbGQpID49IDBcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZXMgZXhjbHVkZWQga2V5cyBmcm9tIGEgZG9jdW1lbnQuXHJcbiAqIEBtZW1iZXJvZiBGaWx0ZXJcclxuICogQHBhcmFtIHtPYmplY3R9IC0gU291cmNlIGRvY3VtZW50LlxyXG4gKiBAcGFyYW0ge0FycmF5fSAtIEtleXMgdG8gZmlsdGVyLlxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIEZpbHRlcmVkIGRvY3VtZW50LlxyXG4gKi9cclxuRmlsdGVyLnByb3RvdHlwZS5maWx0ZXJJdGVtID0gZnVuY3Rpb24gKGl0ZW0sIGV4Y2x1ZGVkKSB7XHJcbiAgaWYgKF8uaXNBcnJheShpdGVtKSkge1xyXG4gICAgcmV0dXJuIGl0ZW0ubWFwKChpKSA9PiB0aGlzLmZpbHRlckl0ZW0oaSwgZXhjbHVkZWQpKVxyXG4gIH1cclxuXHJcbiAgaWYgKGl0ZW0gJiYgZXhjbHVkZWQpIHtcclxuICAgIGlmIChfLmlzRnVuY3Rpb24oaXRlbS50b09iamVjdCkpIHtcclxuICAgICAgaXRlbSA9IGl0ZW0udG9PYmplY3QoKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBleGNsdWRlZC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoZXhjbHVkZWRbaV0uaW5kZXhPZignLicpID4gMCkge1xyXG4gICAgICAgIHdlZWRvdXQoaXRlbSwgZXhjbHVkZWRbaV0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVsZXRlIGl0ZW1bZXhjbHVkZWRbaV1dXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBpdGVtXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmVzIGV4Y2x1ZGVkIGtleXMgZnJvbSBhIGRvY3VtZW50IHdpdGggcG9wdWxhdGVkIHN1YmRvY3VtZW50cy5cclxuICogQG1lbWJlcm9mIEZpbHRlclxyXG4gKiBAcGFyYW0ge09iamVjdH0gLSBTb3VyY2UgZG9jdW1lbnQuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSAtIEtleXMgdG8gZmlsdGVyLlxyXG4gKiBAcGFyYW0ge0FycmF5fSBvcHRzLnBvcHVsYXRlIC0gUGF0aHMgdG8gcG9wdWxhdGVkIHN1YmRvY3VtZW50cy5cclxuICogQHBhcmFtIHtTdHJpbmd9IG9wdHMuYWNjZXNzIC0gQWNjZXNzIGxldmVsIChwcml2YXRlLCBwcm90ZWN0ZWQgb3IgcHVibGljKS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMuZXhjbHVkZWRNYXAge30gLSBGaWx0ZXJlZCBrZXlzIGZvciByZWxhdGVkIG1vZGVsc1xyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIEZpbHRlcmVkIGRvY3VtZW50LlxyXG4gKi9cclxuRmlsdGVyLnByb3RvdHlwZS5maWx0ZXJQb3B1bGF0ZWRJdGVtID0gZnVuY3Rpb24gKGl0ZW0sIG9wdHMpIHtcclxuICBpZiAoXy5pc0FycmF5KGl0ZW0pKSB7XHJcbiAgICByZXR1cm4gaXRlbS5tYXAoKGkpID0+IHRoaXMuZmlsdGVyUG9wdWxhdGVkSXRlbShpLCBvcHRzKSlcclxuICB9XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0cy5wb3B1bGF0ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgaWYgKCFvcHRzLnBvcHVsYXRlW2ldLnBhdGgpIHtcclxuICAgICAgY29udGludWVcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBleGNsdWRlZCA9IHRoaXMuZ2V0RXhjbHVkZWQoe1xyXG4gICAgICBhY2Nlc3M6IG9wdHMuYWNjZXNzLFxyXG4gICAgICBleGNsdWRlZE1hcDogb3B0cy5leGNsdWRlZE1hcCxcclxuICAgICAgbW9kZWxOYW1lOiBkZXRlY3RpdmUodGhpcy5tb2RlbCwgb3B0cy5wb3B1bGF0ZVtpXS5wYXRoKVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAoXy5oYXMoaXRlbSwgb3B0cy5wb3B1bGF0ZVtpXS5wYXRoKSkge1xyXG4gICAgICB0aGlzLmZpbHRlckl0ZW0oXy5nZXQoaXRlbSwgb3B0cy5wb3B1bGF0ZVtpXS5wYXRoKSwgZXhjbHVkZWQpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBwYXRoVG9BcnJheSA9IG9wdHMucG9wdWxhdGVbaV0ucGF0aC5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKS5qb2luKCcuJylcclxuXHJcbiAgICAgIGlmIChfLmhhcyhpdGVtLCBwYXRoVG9BcnJheSkpIHtcclxuICAgICAgICBjb25zdCBhcnJheSA9IF8uZ2V0KGl0ZW0sIHBhdGhUb0FycmF5KVxyXG4gICAgICAgIGNvbnN0IHBhdGhUb09iamVjdCA9IG9wdHMucG9wdWxhdGVbaV0ucGF0aC5zcGxpdCgnLicpLnNsaWNlKC0xKS5qb2luKCcuJylcclxuXHJcbiAgICAgICAgdGhpcy5maWx0ZXJJdGVtKF8ubWFwKGFycmF5LCBwYXRoVG9PYmplY3QpLCBleGNsdWRlZClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGl0ZW1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZXMgZXhjbHVkZWQga2V5cyBmcm9tIGEgZG9jdW1lbnQuXHJcbiAqIEBtZW1iZXJvZiBGaWx0ZXJcclxuICogQGFjY2VzcyBwdWJsaWNcclxuICogQHBhcmFtIHtPYmplY3R9IC0gU291cmNlIGRvY3VtZW50LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gLSBPcHRpb25zLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0cy5hY2Nlc3Mge3B1YmxpY30gLSBBY2Nlc3MgbGV2ZWwgKHByaXZhdGUsIHByb3RlY3RlZCBvciBwdWJsaWMpLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cy5leGNsdWRlZE1hcCB7fSAtIEZpbHRlcmVkIGtleXMgZm9yIHJlbGF0ZWQgbW9kZWxzXHJcbiAqIEBwYXJhbSB7QXJyYXl9IG9wdHMucG9wdWxhdGUgLSBQYXRocyB0byBwb3B1bGF0ZWQgc3ViZG9jdW1lbnRzLlxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIEZpbHRlcmVkIGRvY3VtZW50LlxyXG4gKi9cclxuRmlsdGVyLnByb3RvdHlwZS5maWx0ZXJPYmplY3QgPSBmdW5jdGlvbiAocmVzb3VyY2UsIG9wdHMgPSB7fSkge1xyXG4gIG9wdHMgPSBfLmRlZmF1bHRzKG9wdHMsIHtcclxuICAgIGFjY2VzczogJ3B1YmxpYycsXHJcbiAgICBleGNsdWRlZE1hcDoge30sXHJcbiAgICBmaWx0ZXJlZEtleXM6IHRoaXMuZmlsdGVyZWRLZXlzLFxyXG4gICAgbW9kZWxOYW1lOiB0aGlzLm1vZGVsLm1vZGVsTmFtZVxyXG4gIH0pXHJcblxyXG4gIGxldCBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVySXRlbShyZXNvdXJjZSwgdGhpcy5nZXRFeGNsdWRlZChvcHRzKSlcclxuXHJcbiAgaWYgKG9wdHMucG9wdWxhdGUpIHtcclxuICAgIHRoaXMuZmlsdGVyUG9wdWxhdGVkSXRlbShmaWx0ZXJlZCwgb3B0cylcclxuICB9XHJcblxyXG4gIHJldHVybiBmaWx0ZXJlZFxyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZpbHRlclxyXG4iXX0=
//# sourceMappingURL=resource_filter.js.map