UNPKG

express-restify-mt-mongoose

Version:
192 lines (162 loc) 18.3 kB
'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