From e382d3c973c31be850c9bb19c572aba5cbcef262 Mon Sep 17 00:00:00 2001 From: Jonas Scheffner Date: Fri, 20 Apr 2018 14:22:02 +0200 Subject: [PATCH 1/2] Consistent use of promises (#80) * Fix linting errors * Make del return promise * Make reset return promise * Make TTL return promise * Make keys return promise * Make getClient return promise * Cleanup tests --- index.js | 164 +++-- package-lock.json | 1143 +++++++++++++++++++++++++++++ test/lib/redis-store-spec.js | 139 ++-- test/lib/redis-store-zlib-spec.js | 86 +-- 4 files changed, 1375 insertions(+), 157 deletions(-) create mode 100644 package-lock.json diff --git a/index.js b/index.js index 1bad90b..f715e2b 100644 --- a/index.js +++ b/index.js @@ -19,7 +19,7 @@ var zlib = require('zlib'); * Node zlib documentation for a list of valid options for gzip: * https://nodejs.org/dist/latest-v4.x/docs/api/zlib.html#zlib_class_options */ -function redisStore(args) { +function redisStore(args = {}) { var self = { name: 'redis', events: new EventEmitter() @@ -27,7 +27,7 @@ function redisStore(args) { // cache-manager should always pass in args /* istanbul ignore next */ - var redisOptions = getFromUrl(args) || args || {}; + var redisOptions = getFromUrl(args) || args; var poolSettings = redisOptions; var Promise = args.promiseDependency || global.Promise; @@ -216,20 +216,18 @@ function redisStore(args) { * @returns {Promise} */ self.set = function(key, value, options, cb) { + options = options || {}; + if (typeof options === 'function') { + cb = options; + options = {}; + } return new Promise(function(resolve, reject) { - if (typeof options === 'function') { - cb = options; - options = {}; - } - - cb = cb ? cb : (err, result) => err ? reject(err) : resolve(result); + cb = cb || ((err, result) => err ? reject(err) : resolve(result)); if (!self.isCacheableValue(value)) { return cb(new Error('value cannot be ' + value)); } - options = options || {}; - var ttl = (options.ttl || options.ttl === 0) ? options.ttl : redisOptions.ttl; var compress = (options.compress || options.compress === false) ? options.compress : redisOptions.compress; if (compress === true) { @@ -270,28 +268,33 @@ function redisStore(args) { * @param {String|Array} key - The cache key or array of keys to delete * @param {Object} [options] - The options (optional) * @param {Function} [cb] - A callback that returns a potential error, otherwise null + * @returns {Promise} */ self.del = function(key, options, cb) { - if (typeof options === 'function') { - cb = options; - options = {}; - } + return new Promise((resolve, reject) => { + cb = cb || ((err) => err ? reject(err) : resolve('OK')); - connect(function(err, conn) { - if (err) { - return cb && cb(err); + if (typeof options === 'function') { + cb = options; + options = {}; } - if (Array.isArray(key)) { - var multi = conn.multi(); - for (var i = 0, l = key.length; i < l; ++i) { - multi.del(key[i]); + connect(function(err, conn) { + if (err) { + return cb(err); + } + + if (Array.isArray(key)) { + var multi = conn.multi(); + for (var i = 0, l = key.length; i < l; ++i) { + multi.del(key[i]); + } + multi.exec(handleResponse(conn, cb)); } - multi.exec(handleResponse(conn, cb)); - } - else { - conn.del(key, handleResponse(conn, cb)); - } + else { + conn.del(key, handleResponse(conn, cb)); + } + }); }); }; @@ -299,13 +302,17 @@ function redisStore(args) { * Delete all the keys of the currently selected DB * @method reset * @param {Function} [cb] - A callback that returns a potential error, otherwise null + * @returns {Promise} */ self.reset = function(cb) { - connect(function(err, conn) { - if (err) { - return cb && cb(err); - } - conn.flushdb(handleResponse(conn, cb)); + return new Promise((resolve, reject) => { + cb = cb || (err => err ? reject(err) : resolve('OK')); + connect(function(err, conn) { + if (err) { + return cb(err); + } + conn.flushdb(handleResponse(conn, cb)); + }); }); }; @@ -314,13 +321,17 @@ function redisStore(args) { * @method ttl * @param {String} key - The cache key * @param {Function} cb - A callback that returns a potential error and the response + * @returns {Promise} */ self.ttl = function(key, cb) { - connect(function(err, conn) { - if (err) { - return cb && cb(err); - } - conn.ttl(key, handleResponse(conn, cb)); + return new Promise((resolve, reject) => { + cb = cb || ((err, res) => err ? reject(err) : resolve(res)); + connect(function(err, conn) { + if (err) { + return cb(err); + } + conn.ttl(key, handleResponse(conn, cb)); + }); }); }; @@ -331,8 +342,10 @@ function redisStore(args) { * @param {Object} [options] - The options (default: {}) * @param {number} [options.scanCount] - The number of keys to traverse with each call to SCAN (default: 100) * @param {Function} cb - A callback that returns a potential error and the response + * @returns {Promise} */ self.keys = function(pattern, options, cb) { + options = options || {}; // Account for all argument permutations. // Only cb supplied. @@ -353,35 +366,38 @@ function redisStore(args) { options = {}; } - connect(function(err, conn) { - if (err) { - return cb && cb(err); - } + return new Promise((resolve, reject) => { + cb = cb || ((err, res) => err ? reject(err) : resolve(res)); + connect(function(err, conn) { + if (err) { + return cb(err); + } - // Use an object to dedupe as scan can return duplicates - var keysObj = {}; - var scanCount = Number(options.scanCount) || 100; + // Use an object to dedupe as scan can return duplicates + var keysObj = {}; + var scanCount = Number(options.scanCount) || 100; - (function nextBatch(cursorId) { - conn.scan(cursorId, 'match', pattern, 'count', scanCount, function (err, result) { - if (err) { - handleResponse(conn, cb)(err); - } + (function nextBatch(cursorId) { + conn.scan(cursorId, 'match', pattern, 'count', scanCount, function (err, result) { + if (err) { + handleResponse(conn, cb)(err); + } - var nextCursorId = result[0]; - var keys = result[1]; + var nextCursorId = result[0]; + var keys = result[1]; - for (var i = 0, l = keys.length; i < l; ++i) { - keysObj[keys[i]] = 1; - } + for (var i = 0, l = keys.length; i < l; ++i) { + keysObj[keys[i]] = 1; + } - if (nextCursorId !== '0') { - return nextBatch(nextCursorId); - } + if (nextCursorId !== '0') { + return nextBatch(nextCursorId); + } - handleResponse(conn, cb)(null, Object.keys(keysObj)); - }); - })(0); + handleResponse(conn, cb)(null, Object.keys(keysObj)); + }); + })(0); + }); }); }; @@ -402,22 +418,26 @@ function redisStore(args) { * Returns the underlying redis client connection * @method getClient * @param {Function} cb - A callback that returns a potential error and an object containing the Redis client and a done method + * @returns {Promise} */ self.getClient = function(cb) { - connect(function(err, conn) { - if (err) { - return cb && cb(err); - } - cb(null, { - client: conn, - done: function(done) { - var args = Array.prototype.slice.call(arguments, 1); - pool.release(conn); - - if (done && typeof done === 'function') { - done.apply(null, args); - } + return new Promise((resolve, reject) => { + cb = cb || ((err, res) => err ? reject(err) : resolve(res)); + connect(function(err, conn) { + if (err) { + return cb(err); } + cb(null, { + client: conn, + done: function(done) { + var args = Array.prototype.slice.call(arguments, 1); + pool.release(conn); + + if (done && typeof done === 'function') { + done.apply(null, args); + } + } + }); }); }); }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..714923b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1143 @@ +{ + "name": "cache-manager-redis", + "version": "0.5.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "babylon": { + "version": "7.0.0-beta.19", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", + "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "cache-manager": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.9.0.tgz", + "integrity": "sha1-Xh9jF8oaJeQN3zZacWJ1evFSNT4=", + "requires": { + "async": "1.5.2", + "lru-cache": "4.0.0" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "catharsis": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", + "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", + "dev": true, + "requires": { + "underscore-contrib": "0.3.0" + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "optional": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "1.1.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "generic-pool": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.2.1.tgz", + "integrity": "sha1-dQrJlOyk5/h/YW4q3/AlP2RlmtY=" + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.11", + "js-yaml": "3.11.0", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.3.0", + "wordwrap": "1.0.0" + } + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + } + } + }, + "js2xmlparser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", + "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "dev": true, + "requires": { + "xmlcreate": "1.0.2" + } + }, + "jsdoc": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", + "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", + "dev": true, + "requires": { + "babylon": "7.0.0-beta.19", + "bluebird": "3.5.1", + "catharsis": "0.8.9", + "escape-string-regexp": "1.0.5", + "js2xmlparser": "3.0.0", + "klaw": "2.0.0", + "marked": "0.3.19", + "mkdirp": "0.5.1", + "requizzle": "0.2.1", + "strip-json-comments": "2.0.1", + "taffydb": "2.6.2", + "underscore": "1.8.3" + } + }, + "jshint": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", + "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", + "dev": true, + "requires": { + "cli": "1.0.1", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "3.7.0", + "minimatch": "3.0.4", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + }, + "dependencies": { + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + } + } + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "klaw": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", + "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "lodash": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lru-cache": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", + "integrity": "sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg=", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true + }, + "minami": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz", + "integrity": "sha1-mbbc37LwpU2hycj3qjoyd4eq+fg=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "redis": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "requires": { + "double-ended-queue": "2.1.0-0", + "redis-commands": "1.3.5", + "redis-parser": "2.6.0" + } + }, + "redis-commands": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", + "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==" + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" + }, + "redis-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/redis-url/-/redis-url-1.2.1.tgz", + "integrity": "sha1-GGcAlaOOmJ03k1ndTG5Kv/heLrE=", + "requires": { + "redis": "2.8.0" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "requizzle": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", + "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", + "dev": true, + "requires": { + "underscore": "1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": "0.10.3" + } + }, + "sol-redis-pool": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/sol-redis-pool/-/sol-redis-pool-0.3.3.tgz", + "integrity": "sha1-pxEdb4lCQTugrUczVmFnBS23Sms=", + "requires": { + "bluebird": "3.5.1", + "generic-pool": "2.2.1", + "redis": "2.8.0" + } + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "underscore-contrib": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", + "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", + "dev": true, + "requires": { + "underscore": "1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xmlcreate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", + "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } +} diff --git a/test/lib/redis-store-spec.js b/test/lib/redis-store-spec.js index 7293add..d89fa1f 100644 --- a/test/lib/redis-store-spec.js +++ b/test/lib/redis-store-spec.js @@ -3,8 +3,11 @@ var redisStore = require('../../index'); var sinon = require('sinon'); var assert = require('assert'); + var redisCache; var customRedisCache; +var sandbox; +var injectError; before(function () { redisCache = require('cache-manager').caching({ @@ -33,12 +36,21 @@ before(function () { return redisCache.store.isCacheableValue(val); } }); + + sandbox = sinon.sandbox.create(); + + injectError = () => { + var pool = redisCache.store._pool; + + sandbox.stub(pool, 'acquireDb').yieldsAsync('Something unexpected'); + sandbox.stub(pool, 'release'); + }; }); -beforeEach(function(done) { - redisCache.reset(function() { - done(); - }); +beforeEach(function() { + sandbox.restore(); + + return redisCache.reset(); }); describe ('initialization', function () { @@ -191,16 +203,10 @@ describe('get', function () { }); it('should reject promise on error', function (done) { - var pool = redisCache.store._pool; - sinon.stub(pool, 'acquireDb').yieldsAsync('Something unexpected'); - sinon.stub(pool, 'release'); + injectError(); redisCache.get('foo') .then(() => done(new Error ('Should reject'))) - .catch(() => done()) - .then(() => { - pool.acquireDb.restore(); - pool.release.restore(); - }) + .catch(() => done()); }); it('should retrieve a value for a given key', function (done) { @@ -234,12 +240,8 @@ describe('get', function () { }); it('should return an error if there is an error acquiring a connection', function (done) { - var pool = redisCache.store._pool; - sinon.stub(pool, 'acquireDb').yieldsAsync('Something unexpected'); - sinon.stub(pool, 'release'); + injectError(); redisCache.get('foo', function (err) { - pool.acquireDb.restore(); - pool.release.restore(); assert.notEqual(err, null); done(); }); @@ -247,6 +249,20 @@ describe('get', function () { }); describe('del', function () { + it('should return a promise', function () { + assert.ok(redisCache.del('foo', 'bar') instanceof Promise); + }); + + it('should resolve promise on success', function () { + return redisCache.del('foo', 'bar').then(result => assert.equal(result, 'OK')); + }); + + it('should reject promise on error', function () { + injectError(); + + return redisCache.del('foo').then(res => assert.fail(res), err => assert.notEqual(err, null)); + }); + it('should delete a value for a given key', function (done) { redisCache.set('foo', 'bar', function () { redisCache.del('foo', function (err) { @@ -288,13 +304,9 @@ describe('del', function () { }); it('should return an error if there is an error acquiring a connection', function (done) { - var pool = redisCache.store._pool; - sinon.stub(pool, 'acquireDb').yieldsAsync('Something unexpected'); - sinon.stub(pool, 'release'); + injectError(); redisCache.set('foo', 'bar', function () { redisCache.del('foo', function (err) { - pool.acquireDb.restore(); - pool.release.restore(); assert.notEqual(err, null); done(); }); @@ -303,6 +315,20 @@ describe('del', function () { }); describe('reset', function () { + it('should return a promise', function () { + assert.ok(redisCache.reset() instanceof Promise); + }); + + it('should resolve promise on success', function () { + return redisCache.reset().then(result => assert.equal(result, 'OK')); + }); + + it('should reject promise on error', function () { + injectError(); + + return redisCache.reset().then(res => assert.fail(res), err => assert.notEqual(err, null)); + }); + it('should flush underlying db', function (done) { redisCache.reset(function (err) { assert.equal(err, null); @@ -316,12 +342,8 @@ describe('reset', function () { }); it('should return an error if there is an error acquiring a connection', function (done) { - var pool = redisCache.store._pool; - sinon.stub(pool, 'acquireDb').yieldsAsync('Something unexpected'); - sinon.stub(pool, 'release'); + injectError(); redisCache.reset(function (err) { - pool.acquireDb.restore(); - pool.release.restore(); assert.notEqual(err, null); done(); }); @@ -329,6 +351,20 @@ describe('reset', function () { }); describe('ttl', function () { + it('should return a promise', function () { + assert.ok(redisCache.ttl('foo') instanceof Promise); + }); + + it('should resolve promise on success', function () { + return redisCache.ttl('foo').then(result => assert.ok(Number.isInteger(result))); + }); + + it('should reject promise on error', function () { + injectError(); + + return redisCache.ttl('foo').then(() => assert.fail(), err => assert.notEqual(err, null)); + }); + it('should retrieve ttl for a given key', function (done) { redisCache.set('foo', 'bar', function () { redisCache.ttl('foo', function (err, ttl) { @@ -348,13 +384,9 @@ describe('ttl', function () { }); it('should return an error if there is an error acquiring a connection', function (done) { - var pool = redisCache.store._pool; - sinon.stub(pool, 'acquireDb').yieldsAsync('Something unexpected'); - sinon.stub(pool, 'release'); + injectError(); redisCache.set('foo', 'bar', function () { redisCache.ttl('foo', function (err) { - pool.acquireDb.restore(); - pool.release.restore(); assert.notEqual(err, null); done(); }); @@ -363,6 +395,20 @@ describe('ttl', function () { }); describe('keys', function () { + it('should return a promise', function () { + assert.ok(redisCache.keys('f*') instanceof Promise); + }); + + it('should resolve promise on success', function () { + return redisCache.keys('f*').then(result => assert.ok(Array.isArray(result))); + }); + + it('should reject promise on error', function () { + injectError(); + + return redisCache.keys('f*').then(res => assert.fail(res), err => assert.notEqual(err, null)); + }); + it('should return an array of keys for the given pattern', function (done) { redisCache.set('foo', 'bar', function () { redisCache.set('far', 'boo', function () { @@ -428,13 +474,9 @@ describe('keys', function () { }); it('should return an error if there is an error acquiring a connection', function (done) { - var pool = redisCache.store._pool; - sinon.stub(pool, 'acquireDb').yieldsAsync('Something unexpected'); - sinon.stub(pool, 'release'); + injectError(); redisCache.set('foo', 'bar', function () { redisCache.keys('f*', function (err) { - pool.acquireDb.restore(); - pool.release.restore(); assert.notEqual(err, null); done(); }); @@ -463,6 +505,23 @@ describe('isCacheableValue', function () { }); describe('getClient', function () { + it('should return a promise', function () { + assert.ok(redisCache.store.getClient().then(redis => redis.done()) instanceof Promise); + }); + + it('should resolve promise on success', function () { + return redisCache.store.getClient().then(redis => { + assert.notEqual(redis, null); + redis.done(); + }); + }); + + it('should reject promise on error', function () { + injectError(); + + return redisCache.store.getClient().then(res => assert.fail(res), err => assert.notEqual(err, null)); + }); + it('should return redis client', function (done) { redisCache.store.getClient(function (err, redis) { assert.equal(err, null); @@ -483,12 +542,8 @@ describe('getClient', function () { }); it('should return an error if there is an error acquiring a connection', function (done) { - var pool = redisCache.store._pool; - sinon.stub(pool, 'acquireDb').yieldsAsync('Something unexpected'); - sinon.stub(pool, 'release'); + injectError(); redisCache.store.getClient(function (err) { - pool.acquireDb.restore(); - pool.release.restore(); assert.notEqual(err, null); done(); }); diff --git a/test/lib/redis-store-zlib-spec.js b/test/lib/redis-store-zlib-spec.js index 34f33e4..0e49cfb 100644 --- a/test/lib/redis-store-zlib-spec.js +++ b/test/lib/redis-store-zlib-spec.js @@ -76,7 +76,7 @@ describe('Compression Tests', function () { it('should not be able to store a null value', function (done) { try { - redisStore.set('foo2', null, function (err) { + redisStore.set('foo2', null, function () { done(new Error('Should not be able to store a null value')); }); } catch(e) { @@ -353,85 +353,85 @@ describe('Compression Tests', function () { var testObject = { - _id: "57d046876102e12cd5b83fb0", + _id: '57d046876102e12cd5b83fb0', index: 0, - guid: "1a18758b-fa38-4ced-8d05-44637bf4716e", + guid: '1a18758b-fa38-4ced-8d05-44637bf4716e', isActive: false, - balance: "$1,116.12", - picture: "http://placehold.it/32x32", + balance: '$1,116.12', + picture: 'http://placehold.it/32x32', age: 39, - eyeColor: "blue", - name: "Lara Crane", - gender: "female", - company: "BIOTICA", - email: "laracrane@biotica.com", - phone: "+1 (911) 538-2679", - address: "330 Church Avenue, Slovan, Kansas, 3416", - about: "Aliqua incididunt eiusmod Lorem minim nostrud aliquip reprehenderit culpa aute exercitation. In deserunt irure ad reprehenderit labore cupidatat qui cupidatat dolore ullamco et do ullamco ut. Laborum cupidatat nostrud quis non quis laborum aute nisi sint consequat tempor dolore voluptate. Cillum minim minim enim ea id aliqua laboris elit exercitation.\r\nCulpa in aute est pariatur quis. Tempor dolor ullamco ex Lorem deserunt commodo aliqua. Anim officia esse veniam minim veniam laboris nostrud ipsum ullamco esse nulla adipisicing minim. Eu minim occaecat deserunt eu est ex.\r\nDuis nostrud magna excepteur id officia mollit veniam ipsum. Lorem adipisicing ad esse ad ullamco et consectetur in ex tempor mollit consequat cillum. Adipisicing ex anim consequat anim non exercitation adipisicing ipsum exercitation aute reprehenderit esse ad aliqua. Ut duis consequat cupidatat eiusmod sint voluptate nulla fugiat sunt nulla eu. Excepteur labore proident laboris enim laborum esse reprehenderit fugiat. Cupidatat sit esse voluptate magna mollit fugiat velit Lorem elit pariatur id. Deserunt in ad laboris nulla cupidatat deserunt ullamco voluptate consequat veniam elit exercitation occaecat proident.\r\nEa occaecat ullamco exercitation elit Lorem pariatur reprehenderit. Et mollit proident excepteur enim tempor excepteur sunt laborum deserunt anim fugiat dolor sunt. Nostrud pariatur incididunt aliquip dolore in id elit fugiat.\r\nVeniam ullamco cupidatat mollit commodo fugiat nisi incididunt qui reprehenderit laboris esse Lorem sint mollit. Sunt qui consectetur anim aute culpa laboris ut cupidatat incididunt elit do nisi. Minim minim incididunt eu fugiat. Eiusmod et mollit aliquip minim tempor consectetur adipisicing id sunt. Cillum in mollit elit laborum. Dolore excepteur do consectetur aliqua. Laboris velit ad proident reprehenderit voluptate nulla ipsum nisi dolore dolor.\r\n", - registered: "2015-09-15T10:09:44 +07:00", + eyeColor: 'blue', + name: 'Lara Crane', + gender: 'female', + company: 'BIOTICA', + email: 'laracrane@biotica.com', + phone: '+1 (911) 538-2679', + address: '330 Church Avenue, Slovan, Kansas, 3416', + about: 'Aliqua incididunt eiusmod Lorem minim nostrud aliquip reprehenderit culpa aute exercitation. In deserunt irure ad reprehenderit labore cupidatat qui cupidatat dolore ullamco et do ullamco ut. Laborum cupidatat nostrud quis non quis laborum aute nisi sint consequat tempor dolore voluptate. Cillum minim minim enim ea id aliqua laboris elit exercitation.\r\nCulpa in aute est pariatur quis. Tempor dolor ullamco ex Lorem deserunt commodo aliqua. Anim officia esse veniam minim veniam laboris nostrud ipsum ullamco esse nulla adipisicing minim. Eu minim occaecat deserunt eu est ex.\r\nDuis nostrud magna excepteur id officia mollit veniam ipsum. Lorem adipisicing ad esse ad ullamco et consectetur in ex tempor mollit consequat cillum. Adipisicing ex anim consequat anim non exercitation adipisicing ipsum exercitation aute reprehenderit esse ad aliqua. Ut duis consequat cupidatat eiusmod sint voluptate nulla fugiat sunt nulla eu. Excepteur labore proident laboris enim laborum esse reprehenderit fugiat. Cupidatat sit esse voluptate magna mollit fugiat velit Lorem elit pariatur id. Deserunt in ad laboris nulla cupidatat deserunt ullamco voluptate consequat veniam elit exercitation occaecat proident.\r\nEa occaecat ullamco exercitation elit Lorem pariatur reprehenderit. Et mollit proident excepteur enim tempor excepteur sunt laborum deserunt anim fugiat dolor sunt. Nostrud pariatur incididunt aliquip dolore in id elit fugiat.\r\nVeniam ullamco cupidatat mollit commodo fugiat nisi incididunt qui reprehenderit laboris esse Lorem sint mollit. Sunt qui consectetur anim aute culpa laboris ut cupidatat incididunt elit do nisi. Minim minim incididunt eu fugiat. Eiusmod et mollit aliquip minim tempor consectetur adipisicing id sunt. Cillum in mollit elit laborum. Dolore excepteur do consectetur aliqua. Laboris velit ad proident reprehenderit voluptate nulla ipsum nisi dolore dolor.\r\n', + registered: '2015-09-15T10:09:44 +07:00', latitude: 52.954985, longitude: -159.875625, tags: [ - "ad", - "consectetur", - "occaecat", - "exercitation", - "ex", - "nisi", - "magna" + 'ad', + 'consectetur', + 'occaecat', + 'exercitation', + 'ex', + 'nisi', + 'magna' ], friends: [ { id: 0, - name: "Tabatha Reeves", - about: "Veniam id ea anim commodo aliqua non aliqua velit. Dolor cillum exercitation eu commodo ea amet irure aute ad. Magna officia tempor consequat irure magna sunt dolor et pariatur est.\r\nAliqua ut et commodo adipisicing in exercitation nisi. Officia in culpa velit voluptate do. Dolor deserunt ex tempor qui nulla labore exercitation nulla fugiat. Esse elit amet consectetur id ad tempor tempor. Ipsum eiusmod velit nostrud laboris in do velit occaecat eu commodo voluptate ea eu.\r\nAnim veniam commodo consectetur sit fugiat aliquip est Lorem tempor sunt. Proident laborum est commodo eiusmod irure occaecat nulla ipsum magna ullamco. Amet nisi voluptate elit quis cupidatat reprehenderit do excepteur amet sit et commodo officia.\r\nCillum dolore consectetur quis reprehenderit non laborum cillum ea minim non officia consectetur. In dolor adipisicing ea est qui enim mollit ea irure. Voluptate qui eiusmod aliqua cillum enim aliquip fugiat nostrud elit irure. Magna anim officia quis irure ut quis Lorem magna cillum voluptate et aute ad. Nostrud sit ipsum velit magna aliquip mollit incididunt velit commodo ea do cupidatat duis.\r\nEa non sint pariatur laborum deserunt veniam dolore irure ipsum voluptate. Ea ea deserunt officia sit ullamco ea. Irure in deserunt aliqua duis.\r\n" + name: 'Tabatha Reeves', + about: 'Veniam id ea anim commodo aliqua non aliqua velit. Dolor cillum exercitation eu commodo ea amet irure aute ad. Magna officia tempor consequat irure magna sunt dolor et pariatur est.\r\nAliqua ut et commodo adipisicing in exercitation nisi. Officia in culpa velit voluptate do. Dolor deserunt ex tempor qui nulla labore exercitation nulla fugiat. Esse elit amet consectetur id ad tempor tempor. Ipsum eiusmod velit nostrud laboris in do velit occaecat eu commodo voluptate ea eu.\r\nAnim veniam commodo consectetur sit fugiat aliquip est Lorem tempor sunt. Proident laborum est commodo eiusmod irure occaecat nulla ipsum magna ullamco. Amet nisi voluptate elit quis cupidatat reprehenderit do excepteur amet sit et commodo officia.\r\nCillum dolore consectetur quis reprehenderit non laborum cillum ea minim non officia consectetur. In dolor adipisicing ea est qui enim mollit ea irure. Voluptate qui eiusmod aliqua cillum enim aliquip fugiat nostrud elit irure. Magna anim officia quis irure ut quis Lorem magna cillum voluptate et aute ad. Nostrud sit ipsum velit magna aliquip mollit incididunt velit commodo ea do cupidatat duis.\r\nEa non sint pariatur laborum deserunt veniam dolore irure ipsum voluptate. Ea ea deserunt officia sit ullamco ea. Irure in deserunt aliqua duis.\r\n' }, { id: 1, - name: "Samantha Bowen", - about: "Commodo et adipisicing tempor ea. Fugiat ea aliquip occaecat ut commodo labore in magna laborum incididunt amet enim labore. Consectetur laborum exercitation veniam aliquip labore minim ipsum exercitation officia.\r\nEsse eu consequat dolor irure elit. Sint qui elit sint officia non incididunt sunt nulla. Labore occaecat aliquip dolor culpa aliqua irure voluptate excepteur mollit sit proident. Excepteur eu veniam eu nisi enim sit qui magna ut laboris magna. Cupidatat dolor laborum adipisicing aliqua id aliquip nostrud minim nostrud cupidatat ut quis dolore non. Id ad ea pariatur esse sint ad esse cillum.\r\nVoluptate aute laborum cupidatat non minim nulla proident. Consequat quis velit culpa proident ipsum. Enim in reprehenderit dolore dolor proident occaecat laborum sunt eiusmod adipisicing quis veniam ipsum. Magna ut cillum excepteur proident nisi cillum proident nostrud voluptate deserunt. Sit ex sint sunt eu labore cillum incididunt ad proident sint amet Lorem. In duis cupidatat in aute non fugiat occaecat minim anim Lorem sit ullamco est. Aliquip et ad enim adipisicing fugiat nulla enim.\r\nElit ipsum nulla mollit magna qui. Laborum et sint anim reprehenderit ea consectetur. Elit aliqua consequat ex nostrud in. Est excepteur pariatur id ad culpa enim elit labore commodo Lorem ipsum. Labore ad ipsum occaecat veniam in ut fugiat voluptate fugiat enim ex sit duis.\r\nExcepteur quis dolore ipsum ullamco sint consectetur Lorem. Culpa cillum minim id est. Aliquip incididunt velit exercitation culpa sint officia tempor excepteur eu.\r\n" + name: 'Samantha Bowen', + about: 'Commodo et adipisicing tempor ea. Fugiat ea aliquip occaecat ut commodo labore in magna laborum incididunt amet enim labore. Consectetur laborum exercitation veniam aliquip labore minim ipsum exercitation officia.\r\nEsse eu consequat dolor irure elit. Sint qui elit sint officia non incididunt sunt nulla. Labore occaecat aliquip dolor culpa aliqua irure voluptate excepteur mollit sit proident. Excepteur eu veniam eu nisi enim sit qui magna ut laboris magna. Cupidatat dolor laborum adipisicing aliqua id aliquip nostrud minim nostrud cupidatat ut quis dolore non. Id ad ea pariatur esse sint ad esse cillum.\r\nVoluptate aute laborum cupidatat non minim nulla proident. Consequat quis velit culpa proident ipsum. Enim in reprehenderit dolore dolor proident occaecat laborum sunt eiusmod adipisicing quis veniam ipsum. Magna ut cillum excepteur proident nisi cillum proident nostrud voluptate deserunt. Sit ex sint sunt eu labore cillum incididunt ad proident sint amet Lorem. In duis cupidatat in aute non fugiat occaecat minim anim Lorem sit ullamco est. Aliquip et ad enim adipisicing fugiat nulla enim.\r\nElit ipsum nulla mollit magna qui. Laborum et sint anim reprehenderit ea consectetur. Elit aliqua consequat ex nostrud in. Est excepteur pariatur id ad culpa enim elit labore commodo Lorem ipsum. Labore ad ipsum occaecat veniam in ut fugiat voluptate fugiat enim ex sit duis.\r\nExcepteur quis dolore ipsum ullamco sint consectetur Lorem. Culpa cillum minim id est. Aliquip incididunt velit exercitation culpa sint officia tempor excepteur eu.\r\n' }, { id: 2, - name: "Shelia Bray", - about: "Dolor quis duis aute excepteur ad. Aliqua aute velit excepteur voluptate labore Lorem veniam incididunt anim consequat eu. Non sint aliqua do Lorem. Esse commodo sint ullamco in tempor et est sit elit irure. Commodo ex in labore officia nulla non culpa reprehenderit in elit anim aliqua eu eiusmod.\r\nNostrud sit sunt do do. Veniam consequat laborum ullamco incididunt anim. Consequat ipsum ex laboris eu ut et enim.\r\nSint Lorem dolore duis pariatur ea amet anim. Dolore aliquip sunt exercitation labore sit deserunt enim velit labore aliqua incididunt eiusmod ipsum. Est dolore id sit nisi sint labore laborum. Consequat minim fugiat duis sint. Nulla est dolore est nostrud. Pariatur aute commodo consequat exercitation nisi elit sunt incididunt mollit.\r\nProident officia commodo anim et ut. Laboris do voluptate tempor anim commodo aliqua dolore ullamco aliqua anim cupidatat amet cupidatat. Sunt adipisicing qui quis occaecat voluptate anim ad ea enim nulla sit dolor ullamco mollit.\r\nAmet pariatur quis id consectetur anim labore occaecat aliquip incididunt tempor. Culpa veniam ut aliquip sint aute et mollit nostrud excepteur non. Eiusmod cillum reprehenderit occaecat cillum ut eiusmod culpa mollit mollit qui aliqua excepteur non. Consectetur dolore sit ad et do. Fugiat adipisicing ullamco sint ad pariatur aliqua labore adipisicing labore culpa magna consectetur nostrud. Nulla duis pariatur non ut eu tempor nisi deserunt.\r\n" + name: 'Shelia Bray', + about: 'Dolor quis duis aute excepteur ad. Aliqua aute velit excepteur voluptate labore Lorem veniam incididunt anim consequat eu. Non sint aliqua do Lorem. Esse commodo sint ullamco in tempor et est sit elit irure. Commodo ex in labore officia nulla non culpa reprehenderit in elit anim aliqua eu eiusmod.\r\nNostrud sit sunt do do. Veniam consequat laborum ullamco incididunt anim. Consequat ipsum ex laboris eu ut et enim.\r\nSint Lorem dolore duis pariatur ea amet anim. Dolore aliquip sunt exercitation labore sit deserunt enim velit labore aliqua incididunt eiusmod ipsum. Est dolore id sit nisi sint labore laborum. Consequat minim fugiat duis sint. Nulla est dolore est nostrud. Pariatur aute commodo consequat exercitation nisi elit sunt incididunt mollit.\r\nProident officia commodo anim et ut. Laboris do voluptate tempor anim commodo aliqua dolore ullamco aliqua anim cupidatat amet cupidatat. Sunt adipisicing qui quis occaecat voluptate anim ad ea enim nulla sit dolor ullamco mollit.\r\nAmet pariatur quis id consectetur anim labore occaecat aliquip incididunt tempor. Culpa veniam ut aliquip sint aute et mollit nostrud excepteur non. Eiusmod cillum reprehenderit occaecat cillum ut eiusmod culpa mollit mollit qui aliqua excepteur non. Consectetur dolore sit ad et do. Fugiat adipisicing ullamco sint ad pariatur aliqua labore adipisicing labore culpa magna consectetur nostrud. Nulla duis pariatur non ut eu tempor nisi deserunt.\r\n' }, { id: 3, - name: "Dollie Suarez", - about: "Deserunt mollit non incididunt labore ipsum veniam qui ipsum veniam excepteur consectetur quis. Ullamco amet reprehenderit qui tempor do ullamco commodo reprehenderit ut in fugiat officia sunt. Tempor reprehenderit ullamco ipsum occaecat laboris ad labore duis excepteur elit do reprehenderit ut occaecat. Consectetur veniam adipisicing mollit fugiat eu duis. Esse dolore adipisicing excepteur dolor laborum nulla.\r\nElit fugiat velit eiusmod nulla labore in mollit reprehenderit laboris. Voluptate labore ea ad eiusmod esse nostrud amet. Labore anim ex id id laboris reprehenderit.\r\nSit amet aute sit aute nostrud Lorem et ad qui pariatur et duis ad. Aute nulla culpa mollit est occaecat non laborum et cillum. Eiusmod nulla ut nostrud voluptate culpa consectetur incididunt magna ad anim. Cupidatat voluptate nisi voluptate non. Dolor deserunt culpa occaecat velit sit. Ea laboris ea aliqua deserunt consequat in incididunt ex nisi duis cupidatat ullamco nostrud nulla. Eu duis reprehenderit Lorem non irure nulla dolor commodo minim id sit.\r\nConsectetur aliquip reprehenderit ea est laborum et sint nostrud cupidatat in cillum eu. Dolore exercitation ullamco do qui laborum laborum consequat veniam tempor. Enim anim elit exercitation tempor aliquip qui amet sint eiusmod tempor sunt. Sit culpa culpa ex consectetur incididunt ea pariatur dolor ad.\r\nExcepteur amet adipisicing consequat cillum proident excepteur velit ut reprehenderit. Cupidatat consequat cillum cupidatat aliqua culpa sint elit sunt sit in. Tempor enim ex magna enim fugiat reprehenderit qui laborum.\r\n" + name: 'Dollie Suarez', + about: 'Deserunt mollit non incididunt labore ipsum veniam qui ipsum veniam excepteur consectetur quis. Ullamco amet reprehenderit qui tempor do ullamco commodo reprehenderit ut in fugiat officia sunt. Tempor reprehenderit ullamco ipsum occaecat laboris ad labore duis excepteur elit do reprehenderit ut occaecat. Consectetur veniam adipisicing mollit fugiat eu duis. Esse dolore adipisicing excepteur dolor laborum nulla.\r\nElit fugiat velit eiusmod nulla labore in mollit reprehenderit laboris. Voluptate labore ea ad eiusmod esse nostrud amet. Labore anim ex id id laboris reprehenderit.\r\nSit amet aute sit aute nostrud Lorem et ad qui pariatur et duis ad. Aute nulla culpa mollit est occaecat non laborum et cillum. Eiusmod nulla ut nostrud voluptate culpa consectetur incididunt magna ad anim. Cupidatat voluptate nisi voluptate non. Dolor deserunt culpa occaecat velit sit. Ea laboris ea aliqua deserunt consequat in incididunt ex nisi duis cupidatat ullamco nostrud nulla. Eu duis reprehenderit Lorem non irure nulla dolor commodo minim id sit.\r\nConsectetur aliquip reprehenderit ea est laborum et sint nostrud cupidatat in cillum eu. Dolore exercitation ullamco do qui laborum laborum consequat veniam tempor. Enim anim elit exercitation tempor aliquip qui amet sint eiusmod tempor sunt. Sit culpa culpa ex consectetur incididunt ea pariatur dolor ad.\r\nExcepteur amet adipisicing consequat cillum proident excepteur velit ut reprehenderit. Cupidatat consequat cillum cupidatat aliqua culpa sint elit sunt sit in. Tempor enim ex magna enim fugiat reprehenderit qui laborum.\r\n' }, { id: 4, - name: "Doris Hines", - about: "Enim irure fugiat nostrud sit in cupidatat qui. Aliquip labore dolor ea ea ea dolore est non anim esse elit excepteur. Nulla nulla velit ad aute mollit do irure minim ad. Anim deserunt velit cupidatat ipsum est commodo est dolor id aute veniam adipisicing ea enim. Aliquip duis labore cupidatat et occaecat laborum qui et. Eu aliquip adipisicing irure elit minim laborum sit sint non ea.\r\nEx laborum enim ut minim cillum deserunt magna ullamco dolore. Est mollit consectetur aliquip ad labore commodo laboris quis qui do officia cillum. Fugiat deserunt aute laboris commodo sunt do consectetur quis. Ullamco nulla sunt est Lorem incididunt nostrud nostrud nostrud.\r\nQuis aute qui id do exercitation deserunt laboris exercitation ad dolore. Occaecat exercitation ex excepteur adipisicing cillum excepteur sint dolor ut id. Incididunt velit est amet nostrud irure proident cupidatat eiusmod enim esse non in Lorem. Cillum nisi irure reprehenderit eiusmod adipisicing irure laboris eu deserunt. Duis sunt laborum incididunt est mollit anim eu proident Lorem reprehenderit quis. Quis magna deserunt excepteur aute nostrud non in nostrud enim exercitation ipsum incididunt velit. Lorem et do consequat ea dolor commodo mollit enim sunt non Lorem.\r\nDolor elit aliqua ad nostrud veniam cupidatat irure consectetur do. Qui sit est elit sunt incididunt cillum magna non et excepteur elit ullamco cupidatat. Pariatur cupidatat nisi velit ut do sint aliquip sit ullamco. Sit veniam et elit cupidatat pariatur consequat cupidatat sit elit dolor tempor in Lorem nulla. Elit in deserunt mollit quis voluptate enim proident mollit. Dolor fugiat magna reprehenderit do ullamco nisi proident. Minim pariatur laboris anim cupidatat aliquip ut pariatur.\r\nVelit nisi culpa ut esse qui adipisicing esse dolor occaecat Lorem. Nulla irure tempor occaecat dolore ullamco fugiat excepteur tempor. Aliqua quis pariatur officia sit aliqua ex minim. Eiusmod exercitation laborum Lorem eu et amet ex.\r\n" + name: 'Doris Hines', + about: 'Enim irure fugiat nostrud sit in cupidatat qui. Aliquip labore dolor ea ea ea dolore est non anim esse elit excepteur. Nulla nulla velit ad aute mollit do irure minim ad. Anim deserunt velit cupidatat ipsum est commodo est dolor id aute veniam adipisicing ea enim. Aliquip duis labore cupidatat et occaecat laborum qui et. Eu aliquip adipisicing irure elit minim laborum sit sint non ea.\r\nEx laborum enim ut minim cillum deserunt magna ullamco dolore. Est mollit consectetur aliquip ad labore commodo laboris quis qui do officia cillum. Fugiat deserunt aute laboris commodo sunt do consectetur quis. Ullamco nulla sunt est Lorem incididunt nostrud nostrud nostrud.\r\nQuis aute qui id do exercitation deserunt laboris exercitation ad dolore. Occaecat exercitation ex excepteur adipisicing cillum excepteur sint dolor ut id. Incididunt velit est amet nostrud irure proident cupidatat eiusmod enim esse non in Lorem. Cillum nisi irure reprehenderit eiusmod adipisicing irure laboris eu deserunt. Duis sunt laborum incididunt est mollit anim eu proident Lorem reprehenderit quis. Quis magna deserunt excepteur aute nostrud non in nostrud enim exercitation ipsum incididunt velit. Lorem et do consequat ea dolor commodo mollit enim sunt non Lorem.\r\nDolor elit aliqua ad nostrud veniam cupidatat irure consectetur do. Qui sit est elit sunt incididunt cillum magna non et excepteur elit ullamco cupidatat. Pariatur cupidatat nisi velit ut do sint aliquip sit ullamco. Sit veniam et elit cupidatat pariatur consequat cupidatat sit elit dolor tempor in Lorem nulla. Elit in deserunt mollit quis voluptate enim proident mollit. Dolor fugiat magna reprehenderit do ullamco nisi proident. Minim pariatur laboris anim cupidatat aliquip ut pariatur.\r\nVelit nisi culpa ut esse qui adipisicing esse dolor occaecat Lorem. Nulla irure tempor occaecat dolore ullamco fugiat excepteur tempor. Aliqua quis pariatur officia sit aliqua ex minim. Eiusmod exercitation laborum Lorem eu et amet ex.\r\n' }, { id: 5, - name: "Snider Blevins", - about: "Ut proident officia proident esse cillum irure anim Lorem non officia laborum. Labore duis quis eiusmod culpa Lorem commodo esse eu laborum elit. Pariatur quis cillum incididunt consequat ex laboris elit consectetur laborum ad laboris aliquip irure.\r\nId occaecat elit cillum nisi nulla amet. Elit sint eiusmod minim dolor ad magna voluptate. Ullamco nulla dolor aliqua labore amet anim. Consequat Lorem magna est eiusmod veniam amet esse nisi exercitation laboris ex reprehenderit. Quis dolor Lorem pariatur mollit esse sunt tempor labore deserunt velit tempor dolore esse.\r\nNostrud et aliqua duis excepteur mollit qui sunt esse ad deserunt. Cupidatat nulla sit velit tempor elit cillum officia. Adipisicing laborum dolor occaecat ad reprehenderit duis sunt esse esse elit deserunt. Nulla laborum ullamco mollit minim excepteur aliquip exercitation minim nisi cupidatat adipisicing ut aliqua. Cupidatat ullamco aliquip enim dolor incididunt commodo. Ullamco voluptate ut ex quis fugiat commodo.\r\nAliqua occaecat ex deserunt consequat esse cillum aliquip occaecat officia in. Magna laborum occaecat officia dolor ipsum eiusmod dolor ullamco consectetur occaecat ut. Ea dolore dolore id elit eiusmod velit mollit commodo esse sint exercitation commodo eiusmod tempor. Consequat et qui veniam culpa. Consectetur id aute ad eiusmod magna. Ex ad cillum est occaecat in dolor eiusmod officia nisi eu.\r\nEst nostrud sint non quis proident nulla nulla aliqua deserunt veniam non reprehenderit aliqua. Reprehenderit minim incididunt magna mollit qui sint sint anim officia sit exercitation officia laboris. Est cupidatat eu aute et cillum velit sit commodo duis incididunt mollit.\r\n" + name: 'Snider Blevins', + about: 'Ut proident officia proident esse cillum irure anim Lorem non officia laborum. Labore duis quis eiusmod culpa Lorem commodo esse eu laborum elit. Pariatur quis cillum incididunt consequat ex laboris elit consectetur laborum ad laboris aliquip irure.\r\nId occaecat elit cillum nisi nulla amet. Elit sint eiusmod minim dolor ad magna voluptate. Ullamco nulla dolor aliqua labore amet anim. Consequat Lorem magna est eiusmod veniam amet esse nisi exercitation laboris ex reprehenderit. Quis dolor Lorem pariatur mollit esse sunt tempor labore deserunt velit tempor dolore esse.\r\nNostrud et aliqua duis excepteur mollit qui sunt esse ad deserunt. Cupidatat nulla sit velit tempor elit cillum officia. Adipisicing laborum dolor occaecat ad reprehenderit duis sunt esse esse elit deserunt. Nulla laborum ullamco mollit minim excepteur aliquip exercitation minim nisi cupidatat adipisicing ut aliqua. Cupidatat ullamco aliquip enim dolor incididunt commodo. Ullamco voluptate ut ex quis fugiat commodo.\r\nAliqua occaecat ex deserunt consequat esse cillum aliquip occaecat officia in. Magna laborum occaecat officia dolor ipsum eiusmod dolor ullamco consectetur occaecat ut. Ea dolore dolore id elit eiusmod velit mollit commodo esse sint exercitation commodo eiusmod tempor. Consequat et qui veniam culpa. Consectetur id aute ad eiusmod magna. Ex ad cillum est occaecat in dolor eiusmod officia nisi eu.\r\nEst nostrud sint non quis proident nulla nulla aliqua deserunt veniam non reprehenderit aliqua. Reprehenderit minim incididunt magna mollit qui sint sint anim officia sit exercitation officia laboris. Est cupidatat eu aute et cillum velit sit commodo duis incididunt mollit.\r\n' }, { id: 6, - name: "Mckay Mcknight", - about: "Adipisicing et laboris in officia adipisicing proident. Do excepteur culpa reprehenderit mollit est nisi. Ad nisi nostrud Lorem aliquip excepteur nulla ex amet exercitation id deserunt reprehenderit eiusmod laboris. Aliqua ea proident adipisicing excepteur voluptate elit laboris amet.\r\nCillum proident dolor est minim mollit proident non commodo tempor duis pariatur voluptate. Culpa deserunt et nisi in et. Eu ea ipsum eu aliqua commodo duis sunt et in eu veniam laborum velit. Reprehenderit duis nulla nulla ad ut. Id et cillum amet fugiat mollit. Amet in eu amet laboris velit consectetur dolore excepteur aliqua. Commodo duis laborum eu ad Lorem ut excepteur irure culpa velit.\r\nAnim in eiusmod Lorem quis est consectetur exercitation sit voluptate. Pariatur nisi elit enim veniam quis pariatur adipisicing enim non nisi Lorem labore labore eu. Veniam sunt culpa do irure anim nisi culpa et nostrud aliqua excepteur ad excepteur in. Eiusmod exercitation esse proident ut incididunt quis commodo. Labore tempor enim aute nisi exercitation dolore non.\r\nEa nulla officia nostrud proident enim officia in eu non. Enim nisi ea ad exercitation magna veniam aute sunt voluptate in elit. Nostrud consequat labore minim irure sunt. Incididunt officia laboris exercitation culpa anim eu anim est deserunt officia do magna duis. Voluptate id dolore laboris ad mollit voluptate velit est elit do eu eu minim. Reprehenderit fugiat non sunt magna. Exercitation fugiat cupidatat consectetur est minim ad aute voluptate exercitation amet.\r\nDo reprehenderit qui sunt elit. Tempor esse non fugiat qui ea Lorem sit non fugiat cillum sint aliqua. Cillum laboris laboris non pariatur enim id enim reprehenderit aliquip non reprehenderit sunt esse Lorem.\r\n" + name: 'Mckay Mcknight', + about: 'Adipisicing et laboris in officia adipisicing proident. Do excepteur culpa reprehenderit mollit est nisi. Ad nisi nostrud Lorem aliquip excepteur nulla ex amet exercitation id deserunt reprehenderit eiusmod laboris. Aliqua ea proident adipisicing excepteur voluptate elit laboris amet.\r\nCillum proident dolor est minim mollit proident non commodo tempor duis pariatur voluptate. Culpa deserunt et nisi in et. Eu ea ipsum eu aliqua commodo duis sunt et in eu veniam laborum velit. Reprehenderit duis nulla nulla ad ut. Id et cillum amet fugiat mollit. Amet in eu amet laboris velit consectetur dolore excepteur aliqua. Commodo duis laborum eu ad Lorem ut excepteur irure culpa velit.\r\nAnim in eiusmod Lorem quis est consectetur exercitation sit voluptate. Pariatur nisi elit enim veniam quis pariatur adipisicing enim non nisi Lorem labore labore eu. Veniam sunt culpa do irure anim nisi culpa et nostrud aliqua excepteur ad excepteur in. Eiusmod exercitation esse proident ut incididunt quis commodo. Labore tempor enim aute nisi exercitation dolore non.\r\nEa nulla officia nostrud proident enim officia in eu non. Enim nisi ea ad exercitation magna veniam aute sunt voluptate in elit. Nostrud consequat labore minim irure sunt. Incididunt officia laboris exercitation culpa anim eu anim est deserunt officia do magna duis. Voluptate id dolore laboris ad mollit voluptate velit est elit do eu eu minim. Reprehenderit fugiat non sunt magna. Exercitation fugiat cupidatat consectetur est minim ad aute voluptate exercitation amet.\r\nDo reprehenderit qui sunt elit. Tempor esse non fugiat qui ea Lorem sit non fugiat cillum sint aliqua. Cillum laboris laboris non pariatur enim id enim reprehenderit aliquip non reprehenderit sunt esse Lorem.\r\n' }, { id: 7, - name: "Lauren Rocha", - about: "Non aute ex qui elit pariatur commodo sunt veniam. Labore anim mollit Lorem incididunt pariatur esse do laboris enim. Est est adipisicing ea eu ex eiusmod dolore duis commodo sint sint. Laborum qui sint in dolor deserunt est sunt dolor irure. Sint labore aute minim dolor nisi ullamco velit esse ullamco culpa esse consequat irure. Nisi esse ut dolore in et in fugiat ipsum voluptate proident aliqua minim. Occaecat eu voluptate proident ea commodo cupidatat consequat est non ea ea.\r\nVeniam mollit aliquip elit et aliquip sit proident anim ea nisi ex mollit. Et reprehenderit nisi laborum enim ut. Anim veniam proident proident pariatur proident nulla labore ad mollit ea ullamco ut deserunt. Cillum amet laborum ea amet cupidatat mollit incididunt eiusmod est ipsum sit ullamco deserunt reprehenderit. Fugiat do consectetur consectetur magna eu elit nisi aute exercitation eu laboris ad cupidatat. Aliquip elit voluptate eu incididunt occaecat sunt.\r\nAliqua quis non et ullamco amet veniam mollit culpa cillum esse occaecat qui. Sint proident tempor magna dolor. Ea aliqua irure amet ipsum fugiat officia ad in consectetur. Do esse ipsum amet ipsum adipisicing eiusmod incididunt proident magna voluptate culpa excepteur.\r\nTempor ut ullamco pariatur sunt. Aute est et enim do dolor nulla voluptate tempor dolor veniam do minim exercitation esse. Sit magna aute excepteur labore culpa proident aliquip ad ad officia. Laboris sit pariatur sit incididunt duis eiusmod consectetur culpa ad. Minim voluptate id id eu veniam ut ex dolore. Consectetur sit consectetur minim proident est et occaecat non enim enim. Laboris fugiat occaecat fugiat laborum.\r\nEst ipsum culpa consequat ipsum est consectetur proident magna excepteur. Anim sint voluptate ut enim occaecat cupidatat in consectetur. Ullamco veniam amet minim tempor labore consequat ex. Aliquip consectetur occaecat ea velit ipsum consequat eiusmod incididunt in adipisicing magna. Veniam sunt culpa magna ullamco excepteur fugiat fugiat voluptate dolor adipisicing sint sunt consectetur.\r\n" + name: 'Lauren Rocha', + about: 'Non aute ex qui elit pariatur commodo sunt veniam. Labore anim mollit Lorem incididunt pariatur esse do laboris enim. Est est adipisicing ea eu ex eiusmod dolore duis commodo sint sint. Laborum qui sint in dolor deserunt est sunt dolor irure. Sint labore aute minim dolor nisi ullamco velit esse ullamco culpa esse consequat irure. Nisi esse ut dolore in et in fugiat ipsum voluptate proident aliqua minim. Occaecat eu voluptate proident ea commodo cupidatat consequat est non ea ea.\r\nVeniam mollit aliquip elit et aliquip sit proident anim ea nisi ex mollit. Et reprehenderit nisi laborum enim ut. Anim veniam proident proident pariatur proident nulla labore ad mollit ea ullamco ut deserunt. Cillum amet laborum ea amet cupidatat mollit incididunt eiusmod est ipsum sit ullamco deserunt reprehenderit. Fugiat do consectetur consectetur magna eu elit nisi aute exercitation eu laboris ad cupidatat. Aliquip elit voluptate eu incididunt occaecat sunt.\r\nAliqua quis non et ullamco amet veniam mollit culpa cillum esse occaecat qui. Sint proident tempor magna dolor. Ea aliqua irure amet ipsum fugiat officia ad in consectetur. Do esse ipsum amet ipsum adipisicing eiusmod incididunt proident magna voluptate culpa excepteur.\r\nTempor ut ullamco pariatur sunt. Aute est et enim do dolor nulla voluptate tempor dolor veniam do minim exercitation esse. Sit magna aute excepteur labore culpa proident aliquip ad ad officia. Laboris sit pariatur sit incididunt duis eiusmod consectetur culpa ad. Minim voluptate id id eu veniam ut ex dolore. Consectetur sit consectetur minim proident est et occaecat non enim enim. Laboris fugiat occaecat fugiat laborum.\r\nEst ipsum culpa consequat ipsum est consectetur proident magna excepteur. Anim sint voluptate ut enim occaecat cupidatat in consectetur. Ullamco veniam amet minim tempor labore consequat ex. Aliquip consectetur occaecat ea velit ipsum consequat eiusmod incididunt in adipisicing magna. Veniam sunt culpa magna ullamco excepteur fugiat fugiat voluptate dolor adipisicing sint sunt consectetur.\r\n' }, { id: 8, - name: "Nichole Hale", - about: "Mollit et excepteur minim cupidatat nostrud. Ullamco culpa fugiat culpa dolor qui. Proident aliqua ex labore id laborum officia aliquip ex et. Ex occaecat dolore aliquip anim ipsum amet dolore amet aute cupidatat cupidatat ea veniam. Ea ullamco dolor Lorem cupidatat dolor. Deserunt voluptate fugiat dolor nostrud.\r\nQuis proident reprehenderit mollit ea culpa amet aliquip. Lorem veniam proident deserunt anim officia pariatur eiusmod. Officia cillum in velit mollit in duis minim do veniam in aliquip mollit proident ad. Voluptate ex aliqua minim velit eu incididunt commodo enim ut aliqua consequat veniam.\r\nCommodo veniam labore culpa adipisicing ullamco laborum mollit commodo elit pariatur consequat. Pariatur ex nostrud nostrud minim cupidatat incididunt aute dolore officia quis id. Sit adipisicing ipsum sunt sit est ad. Anim ea nostrud consequat duis pariatur qui. Nostrud tempor do aliqua mollit. Ex culpa consectetur elit elit ut sit. Aute sint mollit cillum sint qui et minim adipisicing in fugiat excepteur.\r\nNostrud eu in ipsum sunt tempor. Et ullamco cillum dolor qui exercitation veniam. Tempor nisi occaecat sunt nostrud in voluptate ad cupidatat ad elit in. Nisi deserunt quis esse sunt eu cupidatat esse. Laborum labore velit dolor nostrud proident deserunt ea consectetur proident do. Consectetur nisi non sit consectetur dolor quis voluptate nisi pariatur cupidatat.\r\nElit velit culpa minim mollit eu est quis aliquip. Aliqua veniam nostrud cupidatat tempor. Eiusmod excepteur quis mollit cupidatat reprehenderit irure aliqua occaecat ex sunt et culpa.\r\n" + name: 'Nichole Hale', + about: 'Mollit et excepteur minim cupidatat nostrud. Ullamco culpa fugiat culpa dolor qui. Proident aliqua ex labore id laborum officia aliquip ex et. Ex occaecat dolore aliquip anim ipsum amet dolore amet aute cupidatat cupidatat ea veniam. Ea ullamco dolor Lorem cupidatat dolor. Deserunt voluptate fugiat dolor nostrud.\r\nQuis proident reprehenderit mollit ea culpa amet aliquip. Lorem veniam proident deserunt anim officia pariatur eiusmod. Officia cillum in velit mollit in duis minim do veniam in aliquip mollit proident ad. Voluptate ex aliqua minim velit eu incididunt commodo enim ut aliqua consequat veniam.\r\nCommodo veniam labore culpa adipisicing ullamco laborum mollit commodo elit pariatur consequat. Pariatur ex nostrud nostrud minim cupidatat incididunt aute dolore officia quis id. Sit adipisicing ipsum sunt sit est ad. Anim ea nostrud consequat duis pariatur qui. Nostrud tempor do aliqua mollit. Ex culpa consectetur elit elit ut sit. Aute sint mollit cillum sint qui et minim adipisicing in fugiat excepteur.\r\nNostrud eu in ipsum sunt tempor. Et ullamco cillum dolor qui exercitation veniam. Tempor nisi occaecat sunt nostrud in voluptate ad cupidatat ad elit in. Nisi deserunt quis esse sunt eu cupidatat esse. Laborum labore velit dolor nostrud proident deserunt ea consectetur proident do. Consectetur nisi non sit consectetur dolor quis voluptate nisi pariatur cupidatat.\r\nElit velit culpa minim mollit eu est quis aliquip. Aliqua veniam nostrud cupidatat tempor. Eiusmod excepteur quis mollit cupidatat reprehenderit irure aliqua occaecat ex sunt et culpa.\r\n' }, { id: 9, - name: "Valencia Mcbride", - about: "Nisi sit dolor in dolor deserunt id labore reprehenderit pariatur. In ad sint cupidatat velit. Amet dolore tempor tempor est nostrud quis. Commodo est dolor ad labore voluptate enim ut et duis labore minim non velit dolore. Cupidatat nulla irure quis eu qui. Quis non nostrud quis id nisi do elit veniam ex.\r\nVoluptate aliquip consequat incididunt dolor ipsum nisi quis. Proident laboris eu adipisicing ad ut laborum. Consectetur nostrud nisi velit et aute ullamco exercitation pariatur adipisicing commodo.\r\nEu minim eu ut deserunt. Adipisicing exercitation ex est tempor non elit id pariatur amet incididunt tempor. Qui exercitation duis qui ea.\r\nOfficia tempor laboris officia Lorem sint cillum tempor mollit aliquip exercitation. Nisi deserunt aliquip et aliquip non adipisicing minim laboris. In ut aute quis eu. Occaecat ut velit amet laborum qui. Amet do enim Lorem nisi.\r\nSit ipsum duis Lorem ea proident reprehenderit fugiat qui in veniam est labore veniam. Nisi non anim ullamco labore. Ut commodo id incididunt pariatur sunt et. Commodo qui aliquip elit irure eiusmod velit et ullamco. Adipisicing nostrud Lorem aute sit amet incididunt veniam officia aliquip. Culpa esse amet excepteur id sunt dolor elit reprehenderit velit ex ut quis adipisicing nostrud. Irure irure reprehenderit do quis sit non.\r\n" + name: 'Valencia Mcbride', + about: 'Nisi sit dolor in dolor deserunt id labore reprehenderit pariatur. In ad sint cupidatat velit. Amet dolore tempor tempor est nostrud quis. Commodo est dolor ad labore voluptate enim ut et duis labore minim non velit dolore. Cupidatat nulla irure quis eu qui. Quis non nostrud quis id nisi do elit veniam ex.\r\nVoluptate aliquip consequat incididunt dolor ipsum nisi quis. Proident laboris eu adipisicing ad ut laborum. Consectetur nostrud nisi velit et aute ullamco exercitation pariatur adipisicing commodo.\r\nEu minim eu ut deserunt. Adipisicing exercitation ex est tempor non elit id pariatur amet incididunt tempor. Qui exercitation duis qui ea.\r\nOfficia tempor laboris officia Lorem sint cillum tempor mollit aliquip exercitation. Nisi deserunt aliquip et aliquip non adipisicing minim laboris. In ut aute quis eu. Occaecat ut velit amet laborum qui. Amet do enim Lorem nisi.\r\nSit ipsum duis Lorem ea proident reprehenderit fugiat qui in veniam est labore veniam. Nisi non anim ullamco labore. Ut commodo id incididunt pariatur sunt et. Commodo qui aliquip elit irure eiusmod velit et ullamco. Adipisicing nostrud Lorem aute sit amet incididunt veniam officia aliquip. Culpa esse amet excepteur id sunt dolor elit reprehenderit velit ex ut quis adipisicing nostrud. Irure irure reprehenderit do quis sit non.\r\n' } ], - greeting: "Hello, Lara Crane! You have 9 unread messages.", - favoriteFruit: "apple" + greeting: 'Hello, Lara Crane! You have 9 unread messages.', + favoriteFruit: 'apple' }; From 3fafb5bee0d98195b32bcd3f35a8eda74f8a4258 Mon Sep 17 00:00:00 2001 From: Julien Kernec'h Date: Fri, 20 Apr 2018 14:26:59 +0200 Subject: [PATCH 2/2] Bump to version 0.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 913f1ef..916b428 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cache-manager-redis", - "version": "0.5.0", + "version": "0.6.0", "description": "Redis store for the node-cache-manager", "main": "index.js", "scripts": {