express-restify-mt-mongoose
Version:
Easily create a flexible REST interface for mongoose models
167 lines (132 loc) • 21 kB
JavaScript
'use strict';
var util = require('util');
var _ = require('lodash');
var Filter = require('./resource_filter');
var customDefaults = null;
var excludedMap = {};
function getDefaults() {
return _.defaults(customDefaults || {}, {
prefix: '/api',
version: '/v1',
idProperty: '_id',
findOneAndUpdate: true,
findOneAndRemove: true,
lean: true,
restify: false,
runValidators: false,
allowRegex: true,
private: [],
protected: []
});
}
var restify = function restify(app, model) {
var opts = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
var options = {};
_.assign(options, getDefaults(), opts);
var access = require('./middleware/access');
var ensureContentType = require('./middleware/ensureContentType')(options);
var filterAndFindById = require('./middleware/filterAndFindById')(model, options);
var onError = require('./middleware/onError');
var outputFn = require('./middleware/outputFn');
var prepareQuery = require('./middleware/prepareQuery')(options);
var prepareOutput = require('./middleware/prepareOutput')(options, excludedMap);
if (!_.isArray(options.private)) {
throw new Error('"options.private" must be an array of fields');
}
if (!_.isArray(options.protected)) {
throw new Error('"options.protected" must be an array of fields');
}
model.schema.eachPath(function (name, path) {
if (path.options.access) {
switch (path.options.access.toLowerCase()) {
case 'private':
options.private.push(name);
break;
case 'protected':
options.protected.push(name);
break;
}
}
});
options.filter = new Filter({
model: model, excludedMap: excludedMap, filteredKeys: {
private: options.private,
protected: options.protected
}
});
excludedMap[model.modelName] = options.filter.filteredKeys;
if (!_.isArray(options.preMiddleware)) {
options.preMiddleware = options.preMiddleware ? [options.preMiddleware] : [];
}
if (!_.isArray(options.preCreate)) {
options.preCreate = options.preCreate ? [options.preCreate] : [];
}
if (!_.isArray(options.preRead)) {
options.preRead = options.preRead ? [options.preRead] : [];
}
if (!_.isArray(options.preUpdate)) {
options.preUpdate = options.preUpdate ? [options.preUpdate] : [];
}
if (!_.isArray(options.preDelete)) {
options.preDelete = options.preDelete ? [options.preDelete] : [];
}
if (!options.contextFilter) {
options.contextFilter = function (model, req, done) {
return done(model);
};
}
if (!_.isArray(options.postCreate)) {
options.postCreate = options.postCreate ? [options.postCreate] : [];
}
if (!_.isArray(options.postRead)) {
options.postRead = options.postRead ? [options.postRead] : [];
}
if (!_.isArray(options.postUpdate)) {
options.postUpdate = options.postUpdate ? [options.postUpdate] : [];
}
if (!_.isArray(options.postDelete)) {
options.postDelete = options.postDelete ? [options.postDelete] : [];
}
if (!options.onError) {
options.onError = onError(!options.restify);
}
if (!options.outputFn) {
options.outputFn = outputFn(!options.restify);
}
options.name = options.name || model.modelName;
var ops = require('./operations')(model, options, excludedMap);
var uri_item = '' + options.prefix + options.version + '/' + options.name;
if (uri_item.indexOf('/:id') === -1) {
uri_item += '/:id';
}
var uri_items = uri_item.replace('/:id', '');
var uri_count = uri_items + '/count';
var uri_shallow = uri_item + '/shallow';
if (_.isUndefined(app.delete)) {
app.delete = app.del;
}
app.use(function (req, res, next) {
req.erm = { model: model };
next();
});
var accessMiddleware = options.access ? access(options) : [];
app.get(uri_items, prepareQuery, options.preMiddleware, options.preRead, accessMiddleware, ops.getItems, prepareOutput);
app.get(uri_count, prepareQuery, options.preMiddleware, options.preRead, accessMiddleware, ops.getCount, prepareOutput);
app.get(uri_item, prepareQuery, options.preMiddleware, options.preRead, accessMiddleware, ops.getItem, prepareOutput);
app.get(uri_shallow, prepareQuery, options.preMiddleware, options.preRead, accessMiddleware, ops.getShallow, prepareOutput);
app.post(uri_items, prepareQuery, ensureContentType, options.preMiddleware, options.preCreate, accessMiddleware, ops.createObject, prepareOutput);
app.post(uri_item, util.deprecate(prepareQuery, 'Warning: in a future major version, the POST method to update resources will be removed. Use PATCH instead.'), ensureContentType, options.preMiddleware, options.findOneAndUpdate ? [] : filterAndFindById, options.preUpdate, accessMiddleware, ops.modifyObject, prepareOutput);
app.put(uri_item, util.deprecate(prepareQuery, 'Warning: in a future major version, the PUT method will replace rather than update a resource. Use PATCH instead.'), ensureContentType, options.preMiddleware, options.findOneAndUpdate ? [] : filterAndFindById, options.preUpdate, accessMiddleware, ops.modifyObject, prepareOutput);
app.patch(uri_item, prepareQuery, ensureContentType, options.preMiddleware, options.findOneAndUpdate ? [] : filterAndFindById, options.preUpdate, accessMiddleware, ops.modifyObject, prepareOutput);
app.delete(uri_items, prepareQuery, options.preMiddleware, options.preDelete, ops.deleteItems, prepareOutput);
app.delete(uri_item, prepareQuery, options.preMiddleware, options.findOneAndRemove ? [] : filterAndFindById, options.preDelete, ops.deleteItem, prepareOutput);
return uri_items;
};
module.exports = {
defaults: function defaults(options) {
customDefaults = options;
},
serve: restify
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzLXJlc3RpZnktbW9uZ29vc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNLE9BQU8sUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNLElBQUksUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNLFNBQVMsUUFBUSxtQkFBUixDQUFmO0FBQ0EsSUFBSSxpQkFBaUIsSUFBckI7QUFDQSxJQUFJLGNBQWMsRUFBbEI7O0FBRUEsU0FBUyxXQUFULEdBQXdCO0FBQ3RCLFNBQU8sRUFBRSxRQUFGLENBQVcsa0JBQWtCLEVBQTdCLEVBQWlDO0FBQ3RDLFlBQVEsTUFEOEI7QUFFdEMsYUFBUyxLQUY2QjtBQUd0QyxnQkFBWSxLQUgwQjtBQUl0QyxzQkFBa0IsSUFKb0I7QUFLdEMsc0JBQWtCLElBTG9CO0FBTXRDLFVBQU0sSUFOZ0M7QUFPdEMsYUFBUyxLQVA2QjtBQVF0QyxtQkFBZSxLQVJ1QjtBQVN0QyxnQkFBWSxJQVQwQjtBQVV0QyxhQUFTLEVBVjZCO0FBV3RDLGVBQVc7QUFYMkIsR0FBakMsQ0FBUDtBQWFEOztBQUVELElBQU0sVUFBVSxTQUFWLE9BQVUsQ0FBVSxHQUFWLEVBQWUsS0FBZixFQUFpQztBQUFBLE1BQVgsSUFBVyx5REFBSixFQUFJOztBQUMvQyxNQUFJLFVBQVUsRUFBZDtBQUNBLElBQUUsTUFBRixDQUFTLE9BQVQsRUFBa0IsYUFBbEIsRUFBaUMsSUFBakM7O0FBRUEsTUFBTSxTQUFTLFFBQVEscUJBQVIsQ0FBZjtBQUNBLE1BQU0sb0JBQW9CLFFBQVEsZ0NBQVIsRUFBMEMsT0FBMUMsQ0FBMUI7QUFDQSxNQUFNLG9CQUFvQixRQUFRLGdDQUFSLEVBQTBDLEtBQTFDLEVBQWlELE9BQWpELENBQTFCO0FBQ0EsTUFBTSxVQUFVLFFBQVEsc0JBQVIsQ0FBaEI7QUFDQSxNQUFNLFdBQVcsUUFBUSx1QkFBUixDQUFqQjtBQUNBLE1BQU0sZUFBZSxRQUFRLDJCQUFSLEVBQXFDLE9BQXJDLENBQXJCO0FBQ0EsTUFB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U0FBTCxDQUFlLFlBQWYsRUFBNkIsbUhBQTdCLENBQWxCLEVBQXFLLGlCQUFySyxFQUF3TCxRQUFRLGFBQWhNLEVBQStNLFFBQVEsZ0JBQVIsR0FBMkIsRUFBM0IsR0FBZ0MsaUJBQS9PLEVBQWtRLFFBQVEsU0FBMVEsRUFBcVIsZ0JBQXJSLEVBQXVTLElBQUksWUFBM1MsRUFBeVQsYUFBelQ7QUFDQSxNQUFJLEtBQUosQ0FBVSxRQUFWLEVBQW9CLFlBQXBCLEVBQWtDLGlCQUFsQyxFQUFxRCxRQUFRLGFBQTdELEVBQTRFLFFBQVEsZ0JBQVIsR0FBMkIsRUFBM0IsR0FBZ0MsaUJBQTVHLEVBQStILFFBQVEsU0FBdkksRUFBa0osZ0JBQWxKLEVBQW9LLElBQUksWUFBeEssRUFBc0wsYUFBdEw7O0FBRUEsTUFBSSxNQUFKLENBQVcsU0FBWCxFQUFzQixZQUF0QixFQUFvQyxRQUFRLGFBQTVDLEVBQTJELFFBQVEsU0FBbkUsRUFBOEUsSUFBSSxXQUFsRixFQUErRixhQUEvRjtBQUNBLE1BQUksTUFBSixDQUFXLFFBQVgsRUFBcUIsWUFBckIsRUFBbUMsUUFBUSxhQUEzQyxFQUEwRCxRQUFRLGdCQUFSLEdBQTJCLEVBQTNCLEdBQWdDLGlCQUExRixFQUE2RyxRQUFRLFNBQXJILEVBQWdJLElBQUksVUFBcEksRUFBZ0osYUFBaEo7O0FBRUEsU0FBTyxTQUFQO0FBQ0QsQ0FqSUQ7O0FBbUlBLE9BQU8sT0FBUCxHQUFpQjtBQUNmLFlBQVUsa0JBQVUsT0FBVixFQUFtQjtBQUMzQixxQkFBaUIsT0FBakI7QUFDRCxHQUhjO0FBSWYsU0FBTztBQUpRLENBQWpCIiwiZmlsZSI6ImV4cHJlc3MtcmVzdGlmeS1tb25nb29zZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJylcclxuY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpXHJcbmNvbnN0IEZpbHRlciA9IHJlcXVpcmUoJy4vcmVzb3VyY2VfZmlsdGVyJylcclxubGV0IGN1c3RvbURlZmF1bHRzID0gbnVsbFxyXG5sZXQgZXhjbHVkZWRNYXAgPSB7fVxyXG5cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdHMgKCkge1xyXG4gIHJldHVybiBfLmRlZmF1bHRzKGN1c3RvbURlZmF1bHRzIHx8IHt9LCB7XHJcbiAgICBwcmVmaXg6ICcvYXBpJyxcclxuICAgIHZlcnNpb246ICcvdjEnLFxyXG4gICAgaWRQcm9wZXJ0eTogJ19pZCcsXHJcbiAgICBmaW5kT25lQW5kVXBkYXRlOiB0cnVlLFxyXG4gICAgZmluZE9uZUFuZFJlbW92ZTogdHJ1ZSxcclxuICAgIGxlYW46IHRydWUsXHJcbiAgICByZXN0aWZ5OiBmYWxzZSxcclxuICAgIHJ1blZhbGlkYXRvcnM6IGZhbHNlLFxyXG4gICAgYWxsb3dSZWdleDogdHJ1ZSxcclxuICAgIHByaXZhdGU6IFtdLFxyXG4gICAgcHJvdGVjdGVkOiBbXVxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IHJlc3RpZnkgPSBmdW5jdGlvbiAoYXBwLCBtb2RlbCwgb3B0cyA9IHt9KSB7XHJcbiAgbGV0IG9wdGlvbnMgPSB7fVxyXG4gIF8uYXNzaWduKG9wdGlvbnMsIGdldERlZmF1bHRzKCksIG9wdHMpXHJcblxyXG4gIGNvbnN0IGFjY2VzcyA9IHJlcXVpcmUoJy4vbWlkZGxld2FyZS9hY2Nlc3MnKVxyXG4gIGNvbnN0IGVuc3VyZUNvbnRlbnRUeXBlID0gcmVxdWlyZSgnLi9taWRkbGV3YXJlL2Vuc3VyZUNvbnRlbnRUeXBlJykob3B0aW9ucylcclxuICBjb25zdCBmaWx0ZXJBbmRGaW5kQnlJZCA9IHJlcXVpcmUoJy4vbWlkZGxld2FyZS9maWx0ZXJBbmRGaW5kQnlJZCcpKG1vZGVsLCBvcHRpb25zKVxyXG4gIGNvbnN0IG9uRXJyb3IgPSByZXF1aXJlKCcuL21pZGRsZXdhcmUvb25FcnJvcicpXHJcbiAgY29uc3Qgb3V0cHV0Rm4gPSByZXF1aXJlKCcuL21pZGRsZXdhcmUvb3V0cHV0Rm4nKVxyXG4gIGNvbnN0IHByZXBhcmVRdWVyeSA9IHJlcXVpcmUoJy4vbWlkZGxld2FyZS9wcmVwYXJlUXVlcnknKShvcHRpb25zKVxyXG4gIGNvbnN0IHByZXBhcmVPdXRwdXQgPSByZXF1aXJlKCcuL21pZGRsZXdhcmUvcHJlcGFyZU91dHB1dCcpKG9wdGlvbnMsIGV4Y2x1ZGVkTWFwKVxyXG5cclxuICBpZiAoIV8uaXNBcnJheShvcHRpb25zLnByaXZhdGUpKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wib3B0aW9ucy5wcml2YXRlXCIgbXVzdCBiZSBhbiBhcnJheSBvZiBmaWVsZHMnKVxyXG4gIH1cclxuXHJcbiAgaWYgKCFfLmlzQXJyYXkob3B0aW9ucy5wcm90ZWN0ZWQpKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wib3B0aW9ucy5wcm90ZWN0ZWRcIiBtdXN0IGJlIGFuIGFycmF5IG9mIGZpZWxkcycpXHJcbiAgfVxyXG5cclxuICBtb2RlbC5zY2hlbWEuZWFjaFBhdGgoKG5hbWUsIHBhdGgpID0+IHtcclxuICAgIGlmIChwYXRoLm9wdGlvbnMuYWNjZXNzKSB7XHJcbiAgICAgIHN3aXRjaCAocGF0aC5vcHRpb25zLmFjY2Vzcy50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgY2FzZSAncHJpdmF0ZSc6XHJcbiAgICAgICAgICBvcHRpb25zLnByaXZhdGUucHVzaChuYW1lKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICdwcm90ZWN0ZWQnOlxyXG4gICAgICAgICAgb3B0aW9ucy5wcm90ZWN0ZWQucHVzaChuYW1lKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIG9wdGlvbnMuZmlsdGVyID0gbmV3IEZpbHRlcih7XHJcbiAgICBtb2RlbCwgZXhjbHVkZWRNYXAsIGZpbHRlcmVkS2V5czoge1xyXG4gICAgICBwcml2YXRlOiBvcHRpb25zLnByaXZhdGUsXHJcbiAgICAgIHByb3RlY3RlZDogb3B0aW9ucy5wcm90ZWN0ZWRcclxuICAgIH1cclxuICB9KVxyXG5cclxuICBleGNsdWRlZE1hcFttb2RlbC5tb2RlbE5hbWVdID0gb3B0aW9ucy5maWx0ZXIuZmlsdGVyZWRLZXlzXHJcblxyXG4gIGlmICghXy5pc0FycmF5KG9wdGlvbnMucHJlTWlkZGxld2FyZSkpIHtcclxuICAgIG9wdGlvbnMucHJlTWlkZGxld2FyZSA9IG9wdGlvbnMucHJlTWlkZGxld2FyZSA/IFtvcHRpb25zLnByZU1pZGRsZXdhcmVdIDogW11cclxuICB9XHJcblxyXG4gIGlmICghXy5pc0FycmF5KG9wdGlvbnMucHJlQ3JlYXRlKSkge1xyXG4gICAgb3B0aW9ucy5wcmVDcmVhdGUgPSBvcHRpb25zLnByZUNyZWF0ZSA/IFtvcHRpb25zLnByZUNyZWF0ZV0gOiBbXVxyXG4gIH1cclxuXHJcbiAgaWYgKCFfLmlzQXJyYXkob3B0aW9ucy5wcmVSZWFkKSkge1xyXG4gICAgb3B0aW9ucy5wcmVSZWFkID0gb3B0aW9ucy5wcmVSZWFkID8gW29wdGlvbnMucHJlUmVhZF0gOiBbXVxyXG4gIH1cclxuXHJcbiAgaWYgKCFfLmlzQXJyYXkob3B0aW9ucy5wcmVVcGRhdGUpKSB7XHJcbiAgICBvcHRpb25zLnByZVVwZGF0ZSA9IG9wdGlvbnMucHJlVXBkYXRlID8gW29wdGlvbnMucHJlVXBkYXRlXSA6IFtdXHJcbiAgfVxyXG5cclxuICBpZiAoIV8uaXNBcnJheShvcHRpb25zLnByZURlbGV0ZSkpIHtcclxuICAgIG9wdGlvbnMucHJlRGVsZXRlID0gb3B0aW9ucy5wcmVEZWxldGUgPyBbb3B0aW9ucy5wcmVEZWxldGVdIDogW11cclxuICB9XHJcblxyXG4gIGlmICghb3B0aW9ucy5jb250ZXh0RmlsdGVyKSB7XHJcbiAgICBvcHRpb25zLmNvbnRleHRGaWx0ZXIgPSAobW9kZWwsIHJlcSwgZG9uZSkgPT4gZG9uZShtb2RlbClcclxuICB9XHJcblxyXG4gIGlmICghXy5pc0FycmF5KG9wdGlvbnMucG9zdENyZWF0ZSkpIHtcclxuICAgIG9wdGlvbnMucG9zdENyZWF0ZSA9IG9wdGlvbnMucG9zdENyZWF0ZSA/IFtvcHRpb25zLnBvc3RDcmVhdGVdIDogW11cclxuICB9XHJcblxyXG4gIGlmICghXy5pc0FycmF5KG9wdGlvbnMucG9zdFJlYWQpKSB7XHJcbiAgICBvcHRpb25zLnBvc3RSZWFkID0gb3B0aW9ucy5wb3N0UmVhZCA/IFtvcHRpb25zLnBvc3RSZWFkXSA6IFtdXHJcbiAgfVxyXG5cclxuICBpZiAoIV8uaXNBcnJheShvcHRpb25zLnBvc3RVcGRhdGUpKSB7XHJcbiAgICBvcHRpb25zLnBvc3RVcGRhdGUgPSBvcHRpb25zLnBvc3RVcGRhdGUgPyBbb3B0aW9ucy5wb3N0VXBkYXRlXSA6IFtdXHJcbiAgfVxyXG5cclxuICBpZiAoIV8uaXNBcnJheShvcHRpb25zLnBvc3REZWxldGUpKSB7XHJcbiAgICBvcHRpb25zLnBvc3REZWxldGUgPSBvcHRpb25zLnBvc3REZWxldGUgPyBbb3B0aW9ucy5wb3N0RGVsZXRlXSA6IFtdXHJcbiAgfVxyXG5cclxuICBpZiAoIW9wdGlvbnMub25FcnJvcikge1xyXG4gICAgb3B0aW9ucy5vbkVycm9yID0gb25FcnJvcighb3B0aW9ucy5yZXN0aWZ5KVxyXG4gIH1cclxuXHJcbiAgaWYgKCFvcHRpb25zLm91dHB1dEZuKSB7XHJcbiAgICBvcHRpb25zLm91dHB1dEZuID0gb3V0cHV0Rm4oIW9wdGlvbnMucmVzdGlmeSlcclxuICB9XHJcblxyXG4gIG9wdGlvbnMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCBtb2RlbC5tb2RlbE5hbWVcclxuXHJcbiAgY29uc3Qgb3BzID0gcmVxdWlyZSgnLi9vcGVyYXRpb25zJykobW9kZWwsIG9wdGlvbnMsIGV4Y2x1ZGVkTWFwKVxyXG5cclxuICBsZXQgdXJpX2l0ZW0gPSBgJHtvcHRpb25zLnByZWZpeH0ke29wdGlvbnMudmVyc2lvbn0vJHtvcHRpb25zLm5hbWV9YFxyXG4gIGlmICh1cmlfaXRlbS5pbmRleE9mKCcvOmlkJykgPT09IC0xKSB7XHJcbiAgICB1cmlfaXRlbSArPSAnLzppZCdcclxuICB9XHJcblxyXG4gIGNvbnN0IHVyaV9pdGVtcyA9IHVyaV9pdGVtLnJlcGxhY2UoJy86aWQnLCAnJylcclxuICBjb25zdCB1cmlfY291bnQgPSB1cmlfaXRlbXMgKyAnL2NvdW50J1xyXG4gIGNvbnN0IHVyaV9zaGFsbG93ID0gdXJpX2l0ZW0gKyAnL3NoYWxsb3cnXHJcblxyXG4gIGlmIChfLmlzVW5kZWZpbmVkKGFwcC5kZWxldGUpKSB7XHJcbiAgICBhcHAuZGVsZXRlID0gYXBwLmRlbFxyXG4gIH1cclxuXHJcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcclxuICAgIHJlcS5lcm0gPSB7IG1vZGVsIH1cclxuICAgIG5leHQoKVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IGFjY2Vzc01pZGRsZXdhcmUgPSBvcHRpb25zLmFjY2VzcyA/IGFjY2VzcyhvcHRpb25zKSA6IFtdXHJcblxyXG4gIGFwcC5nZXQodXJpX2l0ZW1zLCBwcmVwYXJlUXVlcnksIG9wdGlvbnMucHJlTWlkZGxld2FyZSwgb3B0aW9ucy5wcmVSZWFkLCBhY2Nlc3NNaWRkbGV3YXJlLCBvcHMuZ2V0SXRlbXMsIHByZXBhcmVPdXRwdXQpXHJcbiAgYXBwLmdldCh1cmlfY291bnQsIHByZXBhcmVRdWVyeSwgb3B0aW9ucy5wcmVNaWRkbGV3YXJlLCBvcHRpb25zLnByZVJlYWQsIGFjY2Vzc01pZGRsZXdhcmUsIG9wcy5nZXRDb3VudCwgcHJlcGFyZU91dHB1dClcclxuICBhcHAuZ2V0KHVyaV9pdGVtLCBwcmVwYXJlUXVlcnksIG9wdGlvbnMucHJlTWlkZGxld2FyZSwgb3B0aW9ucy5wcmVSZWFkLCBhY2Nlc3NNaWRkbGV3YXJlLCBvcHMuZ2V0SXRlbSwgcHJlcGFyZU91dHB1dClcclxuICBhcHAuZ2V0KHVyaV9zaGFsbG93LCBwcmVwYXJlUXVlcnksIG9wdGlvbnMucHJlTWlkZGxld2FyZSwgb3B0aW9ucy5wcmVSZWFkLCBhY2Nlc3NNaWRkbGV3YXJlLCBvcHMuZ2V0U2hhbGxvdywgcHJlcGFyZU91dHB1dClcclxuXHJcbiAgYXBwLnBvc3QodXJpX2l0ZW1zLCBwcmVwYXJlUXVlcnksIGVuc3VyZUNvbnRlbnRUeXBlLCBvcHRpb25zLnByZU1pZGRsZXdhcmUsIG9wdGlvbnMucHJlQ3JlYXRlLCBhY2Nlc3NNaWRkbGV3YXJlLCBvcHMuY3JlYXRlT2JqZWN0LCBwcmVwYXJlT3V0cHV0KVxyXG4gIGFwcC5wb3N0KHVyaV9pdGVtLCB1dGlsLmRlcHJlY2F0ZShwcmVwYXJlUXVlcnksICdXYXJuaW5nOiBpbiBhIGZ1dHVyZSBtYWpvciB2ZXJzaW9uLCB0aGUgUE9TVCBtZXRob2QgdG8gdXBkYXRlIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuIFVzZSBQQVRDSCBpbnN0ZWFkLicpLCBlbnN1cmVDb250ZW50VHlwZSwgb3B0aW9ucy5wcmVNaWRkbGV3YXJlLCBvcHRpb25zLmZpbmRPbmVBbmRVcGRhdGUgPyBbXSA6IGZpbHRlckFuZEZpbmRCeUlkLCBvcHRpb25zLnByZVVwZGF0ZSwgYWNjZXNzTWlkZGxld2FyZSwgb3BzLm1vZGlmeU9iamVjdCwgcHJlcGFyZU91dHB1dClcclxuXHJcbiAgYXBwLnB1dCh1cmlfaXRlbSwgdXRpbC5kZXByZWNhdGUocHJlcGFyZVF1ZXJ5LCAnV2FybmluZzogaW4gYSBmdXR1cmUgbWFqb3IgdmVyc2lvbiwgdGhlIFBVVCBtZXRob2Qgd2lsbCByZXBsYWNlIHJhdGhlciB0aGFuIHVwZGF0ZSBhIHJlc291cmNlLiBVc2UgUEFUQ0ggaW5zdGVhZC4nKSwgZW5zdXJlQ29udGVudFR5cGUsIG9wdGlvbnMucHJlTWlkZGxld2FyZSwgb3B0aW9ucy5maW5kT25lQW5kVXBkYXRlID8gW10gOiBmaWx0ZXJBbmRGaW5kQnlJZCwgb3B0aW9ucy5wcmVVcGRhdGUsIGFjY2Vzc01pZGRsZXdhcmUsIG9wcy5tb2RpZnlPYmplY3QsIHByZXBhcmVPdXRwdXQpXHJcbiAgYXBwLnBhdGNoKHVyaV9pdGVtLCBwcmVwYXJlUXVlcnksIGVuc3VyZUNvbnRlbnRUeXBlLCBvcHRpb25zLnByZU1pZGRsZXdhcmUsIG9wdGlvbnMuZmluZE9uZUFuZFVwZGF0ZSA/IFtdIDogZmlsdGVyQW5kRmluZEJ5SWQsIG9wdGlvbnMucHJlVXBkYXRlLCBhY2Nlc3NNaWRkbGV3YXJlLCBvcHMubW9kaWZ5T2JqZWN0LCBwcmVwYXJlT3V0cHV0KVxyXG5cclxuICBhcHAuZGVsZXRlKHVyaV9pdGVtcywgcHJlcGFyZVF1ZXJ5LCBvcHRpb25zLnByZU1pZGRsZXdhcmUsIG9wdGlvbnMucHJlRGVsZXRlLCBvcHMuZGVsZXRlSXRlbXMsIHByZXBhcmVPdXRwdXQpXHJcbiAgYXBwLmRlbGV0ZSh1cmlfaXRlbSwgcHJlcGFyZVF1ZXJ5LCBvcHRpb25zLnByZU1pZGRsZXdhcmUsIG9wdGlvbnMuZmluZE9uZUFuZFJlbW92ZSA/IFtdIDogZmlsdGVyQW5kRmluZEJ5SWQsIG9wdGlvbnMucHJlRGVsZXRlLCBvcHMuZGVsZXRlSXRlbSwgcHJlcGFyZU91dHB1dClcclxuXHJcbiAgcmV0dXJuIHVyaV9pdGVtc1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICBkZWZhdWx0czogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgIGN1c3RvbURlZmF1bHRzID0gb3B0aW9uc1xyXG4gIH0sXHJcbiAgc2VydmU6IHJlc3RpZnlcclxufVxyXG4iXX0=
//# sourceMappingURL=express-restify-mongoose.js.map