From 8426555a7ff53b0d8ce7550b220a283741f0cd3e Mon Sep 17 00:00:00 2001 From: An Nguyen Le Date: Thu, 9 Nov 2017 09:25:55 +0700 Subject: [PATCH 01/73] Fix typo --- lib/Pool.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index 79e38e6d..4f2b9ec7 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -341,12 +341,12 @@ class Pool extends EventEmitter { const iterationResult = this._evictionIterator.next(); // Safety check incase we could get stuck in infinite loop because we - // somehow emptied the array after chekcing it's length + // somehow emptied the array after checking its length. if (iterationResult.done === true && this._availableObjects.length < 1) { this._evictionIterator.reset(); return; } - // if this happens it should just mean we reached the end of the + // If this happens it should just mean we reached the end of the // list and can reset the cursor. if (iterationResult.done === true && this._availableObjects.length > 0) { this._evictionIterator.reset(); From ac33157e965c62676e29843949f97550d4c7abe2 Mon Sep 17 00:00:00 2001 From: Jemila Date: Sat, 2 Dec 2017 13:55:40 +0000 Subject: [PATCH 02/73] run lint-fix to fix make-lint --- lib/Pool.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index 79e38e6d..420d50af 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -447,14 +447,14 @@ class Pool extends EventEmitter { } /** - * Check if resource is currently on loan from the pool - * - * @param {Function} resource - * Resource for checking. - * - * @returns {Boolean} - * True if resource belongs to this pool and false otherwise - */ + * Check if resource is currently on loan from the pool + * + * @param {Function} resource + * Resource for checking. + * + * @returns {Boolean} + * True if resource belongs to this pool and false otherwise + */ isBorrowedResource(resource) { return this._resourceLoans.get(resource) !== undefined; } From afc57d69cfb5b8f0caa8e3e8eda91f3fc84e53bc Mon Sep 17 00:00:00 2001 From: Jemila Date: Sat, 2 Dec 2017 12:07:53 +0000 Subject: [PATCH 03/73] ES6ify README example --- README.md | 77 ++++++++++++++++++++++++------------------------------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 5911d6f8..4c577d2a 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ **V3 upgrade warning** -Version 3 contains many breaking changes. The differences are mostly minor and I hope easy to accomodate. There is a very rough and basic [upgrade guide](https://gist.github.com/sandfox/5ca20648b60a0cb959638c0cd6fcd02d) I've written, improvements and other attempts most welcome. +Version 3 contains many breaking changes. The differences are mostly minor and I hope easy to accommodate. There is a very rough and basic [upgrade guide](https://gist.github.com/sandfox/5ca20648b60a0cb959638c0cd6fcd02d) I've written, improvements and other attempts most welcome. If you are after the older version 2 of this library you should look at the [current github branch](https://github.com/coopernurse/node-pool/tree/v2.5) for it. @@ -32,37 +32,27 @@ $ npm install generic-pool [--save] Here is an example using a fictional generic database driver that doesn't implement any pooling whatsoever itself. ```js -var genericPool = require('generic-pool'); -var DbDriver = require('some-db-driver'); +const genericPool = require("generic-pool"); +const DbDriver = require("some-db-driver"); /** * Step 1 - Create pool using a factory object */ const factory = { - create: function(){ - return new Promise(function(resolve, reject){ - var client = DbDriver.createClient() - client.on('connected', function(){ - resolve(client) - }) - }) - }, - destroy: function(client){ - return new Promise(function(resolve){ - client.on('end', function(){ - resolve() - }) - client.disconnect() - }) - } -} + create: function() { + return DbDriver.createClient(); + }, + destroy: function(client) { + client.disconnect(); + } +}; -var opts = { - max: 10, // maximum size of the pool - min: 2 // minimum size of the pool -} +const opts = { + max: 10, // maximum size of the pool + min: 2 // minimum size of the pool +}; -var myPool = genericPool.createPool(factory, opts) +const myPool = genericPool.createPool(factory, opts); /** * Step 2 - Use pool in your code to acquire/release resources @@ -70,18 +60,19 @@ var myPool = genericPool.createPool(factory, opts) // acquire connection - Promise is resolved // once a resource becomes available -const resourcePromise = myPool.acquire() - -resourcePromise.then(function(client) { - client.query("select * from foo", [], function() { - // return object back to pool - myPool.release(client); - }); -}) -.catch(function(err){ - // handle error - this is generally a timeout or maxWaitingClients - // error -}); +const resourcePromise = myPool.acquire(); + +resourcePromise + .then(function(client) { + client.query("select * from foo", [], function() { + // return object back to pool + myPool.release(client); + }); + }) + .catch(function(err) { + // handle error - this is generally a timeout or maxWaitingClients + // error + }); /** * Step 3 - Drain pool during shutdown (optional) @@ -89,7 +80,7 @@ resourcePromise.then(function(client) { // Only call this once in your application -- at the point you want // to shutdown and stop using this pool. myPool.drain().then(function() { - myPool.clear(); + myPool.clear(); }); ``` @@ -125,13 +116,13 @@ Can be any object/instance but must have the following properties: optionally it can also have the following property: -- `validate`: a function that the pool will call if it wants to validate a resource. It should accept one argument `resource` where `resource` is whatever `factory.create` made. Should return a `Promise` that resolves a `boolean` where `true` indicates the resource is still valid or `false` if the resource is invalid. +- `validate`: a function that the pool will call if it wants to validate a resource. It should accept one argument `resource` where `resource` is whatever `factory.create` made. Should return a `Promise` that resolves a `boolean` where `true` indicates the resource is still valid or `false` if the resource is invalid. _Note: The values returned from `create`, `destroy`, and `validate` are all wrapped in a `Promise.resolve` by the pool before being used internally._ **opts** -An optional object/dictionary with the any of the following properties: +An optional object/dictionary with the any of the following properties: - `max`: maximum number of resources to create at any given time. (default=1) - `min`: minimum number of resources to keep in pool at any given time. If this is set >= max, the pool will silently set the min to equal `max`. (default=0) @@ -197,7 +188,7 @@ This function is for when you need to check if a resource has been acquired from - `resource`: any object which you need to test -and returns true (primitive, not Promise) if resource is currently borrowed from the pool, false otherwise. +and returns true (primitive, not Promise) if resource is currently borrowed from the pool, false otherwise. ### pool.destroy @@ -228,7 +219,7 @@ pool.on('factoryDestroyError', function(err){ The pool is an event emitter. Below are the events it emits and any args for those events - `factoryCreateError` : emitted when a promise returned by `factory.create` is rejected. If this event has no listeners then the `error` will be silently discarded - - `error`: whatever `reason` the promise was rejected with. + - `error`: whatever `reason` the promise was rejected with. - `factoryDestroyError` : emitted when a promise returned by `factory.destroy` is rejected. If this event has no listeners then the `error` will be silently discarded - `error`: whatever `reason` the promise was rejected with. @@ -253,7 +244,7 @@ By default the evictor does not run, to enable it you must set the `evictionRunI The pool supports optional priority queueing. This becomes relevant when no resources are available and the caller has to wait. `acquire()` accepts an optional priority int which specifies the caller's relative position in the queue. Each priority slot has it's own internal queue created for it. When a resource is available for borrowing, the first request in the highest priority queue will be given it. -Specifying a `priority` to `acquire` that is outside the `priorityRange` set at `Pool` creation time will result in the `priority` being converted the lowest possible `priority` +Specifying a `priority` to `acquire` that is outside the `priorityRange` set at `Pool` creation time will result in the `priority` being converted the lowest possible `priority` ```js // create pool with priorityRange of 3 From e3d2d31bd4e955150227b6e0754c75950bc10d5d Mon Sep 17 00:00:00 2001 From: san00 Date: Sat, 2 Dec 2017 15:13:07 +0000 Subject: [PATCH 04/73] Create use function to fix #167 Also has a test method. --- lib/Pool.js | 20 ++++++++++++++++++++ test/generic-pool-test.js | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/Pool.js b/lib/Pool.js index 420d50af..5089a96b 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -446,6 +446,26 @@ class Pool extends EventEmitter { return resourceRequest.promise; } + +// use method - added feature + + use(fn){ + let resource + return pool.acquire() + .then(function(resource){ + return resource + }) + .then(fn) + .then(function (result){ + pool.release(resource) + return result + }, function(err) { + pool.release(resource) + throw err + }) + } + + /** * Check if resource is currently on loan from the pool * diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index fdf75287..d6228bac 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -781,3 +781,21 @@ tap.test("evictor start with acquire when autostart is false", function(t) { }) .catch(t.threw); }); + +tap.test("use method", function(t) { + const pool = createPool({ + create: function() { + return Promise.resolve({ + id: "validId" + }); + }, + destroy: function(client) {} + }) + const result = pool.use(function(resource) { + t.equal("validId", resource.id) + return Promise.resolve() + }) + result.then(function() { + t.end + }) +}) From 8b007d0862b68de3cf1d08cb87b6aa93407a3af0 Mon Sep 17 00:00:00 2001 From: san00 Date: Sat, 2 Dec 2017 16:04:52 +0000 Subject: [PATCH 05/73] Revised use method --- lib/Pool.js | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index 5089a96b..928c6cb6 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -446,25 +446,23 @@ class Pool extends EventEmitter { return resourceRequest.promise; } - -// use method - added feature - + /** + * [use method, aquires a resource, passes the resource to a user supplied function and releases it] + * @param {Function} fn [a function that accepts a resource and returns a promise that resolves/rejects once it has finished using the resource] + * @return {Promise} [resolves once the resource is released to the pool] + */ use(fn){ - let resource - return pool.acquire() - .then(function(resource){ - return resource - }) - .then(fn) - .then(function (result){ - pool.release(resource) + return this.acquire().then(resource => { + fn(resource) + .then((result) => { + this.release(resource) return result - }, function(err) { - pool.release(resource) + }, (err) => { + this.release(resource) throw err }) - } - + }) + } /** * Check if resource is currently on loan from the pool From 3c2ad1f8e5bb281d9b62224f0a9dfbd248e7d29c Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Wed, 27 Dec 2017 19:35:04 +0000 Subject: [PATCH 06/73] linting --- lib/Pool.js | 22 ++++++++++++---------- test/generic-pool-test.js | 14 +++++++------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index 928c6cb6..4a2c873c 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -451,17 +451,19 @@ class Pool extends EventEmitter { * @param {Function} fn [a function that accepts a resource and returns a promise that resolves/rejects once it has finished using the resource] * @return {Promise} [resolves once the resource is released to the pool] */ - use(fn){ + use(fn) { return this.acquire().then(resource => { - fn(resource) - .then((result) => { - this.release(resource) - return result - }, (err) => { - this.release(resource) - throw err - }) - }) + fn(resource).then( + result => { + this.release(resource); + return result; + }, + err => { + this.release(resource); + throw err; + } + ); + }); } /** diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index d6228bac..e65b3f3b 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -790,12 +790,12 @@ tap.test("use method", function(t) { }); }, destroy: function(client) {} - }) + }); const result = pool.use(function(resource) { - t.equal("validId", resource.id) - return Promise.resolve() - }) + t.equal("validId", resource.id); + return Promise.resolve(); + }); result.then(function() { - t.end - }) -}) + t.end; + }); +}); From d933777be48be1e8e1e18930b0ff1bf7f8bbde5b Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Wed, 27 Dec 2017 19:36:51 +0000 Subject: [PATCH 07/73] fix never ending use test --- test/generic-pool-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index e65b3f3b..164d0d62 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -796,6 +796,6 @@ tap.test("use method", function(t) { return Promise.resolve(); }); result.then(function() { - t.end; + t.end(); }); }); From 14ecec95233d24c5abe42593e95d956c122e1833 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Wed, 27 Dec 2017 19:42:40 +0000 Subject: [PATCH 08/73] bump version and changelog --- CHANGELOG.md | 6 +++++- package.json | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e61be5ae..d30154e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Change Log +## [3.3.0] - December 27 2017 +- add `use` method to simplify basic pool usage (@san00) + ## [3.2.0] - October 15 2017 - add `isBorrowedResource` method to check if objects are currently on loan from pool (@C-h-e-r-r-y) @@ -161,7 +164,8 @@ - First NPM release ======= -[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.2.0...HEAD +[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.3.0...HEAD +[3.3.0]: https://github.com/coopernurse/node-pool/compare/v3.2.0...v3.3.0 [3.2.0]: https://github.com/coopernurse/node-pool/compare/v3.1.8...v3.2.0 [3.1.8]: https://github.com/coopernurse/node-pool/compare/v3.1.7...v3.1.8 [3.1.7]: https://github.com/coopernurse/node-pool/compare/v3.1.6...v3.1.7 diff --git a/package.json b/package.json index 26ea6f3c..489af50d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.2.0", + "version": "3.3.0", "author": "James Cooper ", "contributors": [ { From 0278a3839c6af307bbaed82af53630d20248f327 Mon Sep 17 00:00:00 2001 From: Geovani de Souza Date: Tue, 19 Dec 2017 20:22:23 -0200 Subject: [PATCH 09/73] Add Typescript --- package.json | 4 +++- tsconfig.json | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 tsconfig.json diff --git a/package.json b/package.json index 489af50d..7a81e0b1 100644 --- a/package.json +++ b/package.json @@ -64,12 +64,14 @@ "url": "http://github.com/coopernurse/node-pool.git" }, "devDependencies": { + "@types/node": "^8.5.1", "eslint": "^4.9.0", "eslint-config-prettier": "^2.6.0", "eslint-plugin-prettier": "^2.3.1", "eslint-plugin-promise": "^3.3.0", "prettier": "^1.7.4", - "tap": "^8.0.0" + "tap": "^8.0.0", + "typescript": "^2.6.2" }, "engines": { "node": ">= 4" diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..8ea6901e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "lib": ["es6", "dom"], + "outDir": "dist/", + "allowJs": true, + "checkJs": true, + "declaration": true, + "noEmit": true, + "strict": false + } +} \ No newline at end of file From 1528cc4b5ddb100e8309a36bd134c537589f1c49 Mon Sep 17 00:00:00 2001 From: Geovani de Souza Date: Tue, 19 Dec 2017 21:09:25 -0200 Subject: [PATCH 10/73] Fix typo annotations in JSDoc and make small corrections reported by TS --- lib/Deque.js | 22 ++++++++-------- lib/DoublyLinkedListIterator.js | 5 ++-- lib/Pool.js | 46 +++++++++++++++++++-------------- lib/PoolOptions.js | 35 +++++++++++++++---------- lib/PriorityQueue.js | 1 + lib/Queue.js | 2 +- lib/ResourceLoan.js | 4 +-- lib/ResourceRequest.js | 4 ++- lib/errors.js | 1 + test/utils.js | 6 +++-- 10 files changed, 73 insertions(+), 53 deletions(-) diff --git a/lib/Deque.js b/lib/Deque.js index f7ea50ac..552ec3b1 100644 --- a/lib/Deque.js +++ b/lib/Deque.js @@ -13,10 +13,10 @@ class Deque { /** * removes and returns the first element from the queue - * @return {[type]} [description] + * @return {any} [description] */ shift() { - if (this._length === 0) { + if (this.length === 0) { return undefined; } @@ -28,8 +28,8 @@ class Deque { /** * adds one elemts to the beginning of the queue - * @param {[type]} element [description] - * @return {[type]} [description] + * @param {any} element [description] + * @return {any} [description] */ unshift(element) { const node = DoublyLinkedList.createNode(element); @@ -39,8 +39,8 @@ class Deque { /** * adds one to the end of the queue - * @param {[type]} element [description] - * @return {[type]} [description] + * @param {any} element [description] + * @return {any} [description] */ push(element) { const node = DoublyLinkedList.createNode(element); @@ -52,7 +52,7 @@ class Deque { * removes and returns the last element from the queue */ pop() { - if (this._length === 0) { + if (this.length === 0) { return undefined; } @@ -76,10 +76,10 @@ class Deque { /** * get a reference to the item at the head of the queue - * @return {element} [description] + * @return {any} [description] */ get head() { - if (this._list.length === 0) { + if (this.length === 0) { return undefined; } const node = this._list.head; @@ -88,10 +88,10 @@ class Deque { /** * get a reference to the item at the tail of the queue - * @return {element} [description] + * @return {any} [description] */ get tail() { - if (this._list.length === 0) { + if (this.length === 0) { return undefined; } const node = this._list.tail; diff --git a/lib/DoublyLinkedListIterator.js b/lib/DoublyLinkedListIterator.js index 3916faff..7304a1a2 100644 --- a/lib/DoublyLinkedListIterator.js +++ b/lib/DoublyLinkedListIterator.js @@ -15,8 +15,8 @@ */ class DoublyLinkedListIterator { /** - * @param {Object} doublyLinkedListNode a node that is part of a doublyLinkedList - * @param {Boolean} reverse is this a reverse iterator? default: false + * @param {Object} doublyLinkedList a node that is part of a doublyLinkedList + * @param {Boolean} [reverse=false] is this a reverse iterator? default: false */ constructor(doublyLinkedList, reverse) { this._list = doublyLinkedList; @@ -85,7 +85,6 @@ class DoublyLinkedListIterator { * and adding it to another. * TODO: We can make this smarter by checking the direction of travel and only checking * the required next/prev/head/tail rather than all of them - * @param {[type]} node [description] * @return {Boolean} [description] */ _isCursorDetached() { diff --git a/lib/Pool.js b/lib/Pool.js index 4a2c873c..4919a209 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -7,6 +7,10 @@ const PoolOptions = require("./PoolOptions"); const ResourceRequest = require("./ResourceRequest"); const ResourceLoan = require("./ResourceLoan"); const PooledResource = require("./PooledResource"); +const DefaultEvictor = require("./DefaultEvictor"); +const Deque = require("./Deque"); +const PriorityQueue = require("./PriorityQueue"); +const DequeIterator = require("./DequeIterator"); const reflector = require("./utils").reflector; @@ -20,6 +24,9 @@ class Pool extends EventEmitter { /** * Generate an Object pool with a specified `factory` and `config`. * + * @param {typeof DefaultEvictor} Evictor + * @param {typeof Deque} Deque + * @param {typeof PriorityQueue} PriorityQueue * @param {Object} factory * Factory to be used for generating and destroying the items. * @param {Function} factory.create @@ -31,6 +38,7 @@ class Pool extends EventEmitter { * @param {Function} factory.validate * Test if a resource is still valid .Should return a promise that resolves to a boolean, true if resource is still valid and false * If it should be removed from pool. + * @param {Object} options */ constructor(Evictor, Deque, PriorityQueue, factory, options) { super(); @@ -66,7 +74,7 @@ class Pool extends EventEmitter { /** * A queue/stack of pooledResources awaiting acquisition * TODO: replace with LinkedList backed array - * @type {Array} + * @type {Deque} */ this._availableObjects = new Deque(); @@ -90,7 +98,7 @@ class Pool extends EventEmitter { /** * All objects associated with this pool in any state (except destroyed) - * @type {PooledResourceCollection} + * @type {Set} */ this._allObjects = new Set(); @@ -102,7 +110,7 @@ class Pool extends EventEmitter { /** * Infinitely looping iterator over available object - * @type {DLLArrayIterator} + * @type {DequeIterator} */ this._evictionIterator = this._availableObjects.iterator(); @@ -110,7 +118,7 @@ class Pool extends EventEmitter { /** * handle for setTimeout for next eviction run - * @type {[type]} + * @type {(number|null)} */ this._scheduledEviction = null; @@ -184,7 +192,7 @@ class Pool extends EventEmitter { const pooledResource = this._availableObjects.shift(); this._dispatchPooledResourceToNextWaitingClient(pooledResource); - return; + return false; } /** @@ -247,8 +255,8 @@ class Pool extends EventEmitter { /** * Dispatches a pooledResource to the next waiting client (if any) else * puts the PooledResource back on the available list - * @param {[type]} pooledResource [description] - * @return {[type]} [description] + * @param {PooledResource} pooledResource [description] + * @return {Boolean} [description] */ _dispatchPooledResourceToNextWaitingClient(pooledResource) { const clientResourceRequest = this._waitingClientsQueue.dequeue(); @@ -373,6 +381,7 @@ class Pool extends EventEmitter { _scheduleEvictorRun() { // Start eviction if set if (this._config.evictionRunIntervalMillis > 0) { + // @ts-ignore this._scheduledEviction = setTimeout(() => { this._evict(); this._scheduleEvictorRun(); @@ -381,7 +390,9 @@ class Pool extends EventEmitter { } _descheduleEvictorRun() { - clearTimeout(this._scheduledEviction); + if (this._scheduledEviction) { + clearTimeout(this._scheduledEviction); + } this._scheduledEviction = null; } @@ -402,13 +413,7 @@ class Pool extends EventEmitter { * when a new resource is available, passing the resource to the callback. * TODO: should we add a seperate "acquireWithPriority" function * - * @param {Function} callback - * Callback function to be called after the acquire is successful. - * If there is an error preventing the acquisition of resource, an error will - * be the first parameter, else it will be null. - * The acquired resource will be the second parameter. - * - * @param {Number} priority + * @param {Number} [priority=0] * Optional. Integer between 0 and (priorityRange - 1). Specifies the priority * of the caller if there are no available resources. Lower numbers mean higher * priority. @@ -482,7 +487,7 @@ class Pool extends EventEmitter { /** * Return the resource to the pool when it is no longer required. * - * @param {Object} obj + * @param {Object} resource * The acquired object to be put back to the pool. */ release(resource) { @@ -600,6 +605,7 @@ class Pool extends EventEmitter { // wait for outstanding factory.create to complete return this._Promise.all(reflectedCreatePromises).then(() => { // Destroy existing resources + // @ts-ignore for (const resource of this._availableObjects) { this._destroy(resource); } @@ -665,7 +671,7 @@ class Pool extends EventEmitter { /** * number of resources that are currently acquired - * @return {[type]} [description] + * @return {Number} [description] */ get borrowed() { return this._resourceLoans.size; @@ -673,7 +679,7 @@ class Pool extends EventEmitter { /** * number of waiting acquire calls - * @return {[type]} [description] + * @return {Number} [description] */ get pending() { return this._waitingClientsQueue.length; @@ -681,7 +687,7 @@ class Pool extends EventEmitter { /** * maximum size of the pool - * @return {[type]} [description] + * @return {Number} [description] */ get max() { return this._config.max; @@ -689,7 +695,7 @@ class Pool extends EventEmitter { /** * minimum size of the pool - * @return {[type]} [description] + * @return {Number} [description] */ get min() { return this._config.min; diff --git a/lib/PoolOptions.js b/lib/PoolOptions.js index 9f7b1c97..498c0e34 100644 --- a/lib/PoolOptions.js +++ b/lib/PoolOptions.js @@ -4,40 +4,45 @@ const PoolDefaults = require("./PoolDefaults"); class PoolOptions { /** - * @param {Object} config + * @param {Object} opts * configuration for the pool - * @param {Number} config.max + * @param {Number} [opts.max=null] * Maximum number of items that can exist at the same time. Default: 1. * Any further acquire requests will be pushed to the waiting list. - * @param {Number} config.min + * @param {Number} [opts.min=null] * Minimum number of items in pool (including in-use). Default: 0. * When the pool is created, or a resource destroyed, this minimum will * be checked. If the pool resource count is below the minimum, a new * resource will be created and added to the pool. - * @param {Number} config.maxWaitingClients + * @param {Number} [opts.maxWaitingClients=null] * maximum number of queued requests allowed after which acquire calls will be rejected - * @param {Number} config.acquireTimeoutMillis + * @param {Boolean} [opts.testOnBorrow=false] + * should the pool validate resources before giving them to clients. Requires that either + * `factory.validate` or `factory.validateAsync` to be specified. + * @param {Boolean} [opts.testOnReturn=false] + * should the pool validate resources before returning them to the pool. + * @param {Number} [opts.acquireTimeoutMillis=null] * Delay in milliseconds after which the an `acquire` call will fail. optional. * Default: undefined. Should be positive and non-zero - * @param {Number} config.priorityRange + * @param {Number} [opts.priorityRange=1] * The range from 1 to be treated as a valid priority - * @param {Bool} [config.fifo=true] + * @param {Boolean} [opts.fifo=true] * Sets whether the pool has LIFO (last in, first out) behaviour with respect to idle objects. * if false then pool has FIFO behaviour - * @param {Bool} [config.autostart=true] + * @param {Boolean} [opts.autostart=true] * Should the pool start creating resources etc once the constructor is called - * @param {Number} opts.evictionRunIntervalMillis + * @param {Number} [opts.evictionRunIntervalMillis=0] * How often to run eviction checks. Default: 0 (does not run). - * @param {Number} opts.numTestsPerEvictionRun + * @param {Number} [opts.numTestsPerEvictionRun=3] * Number of resources to check each eviction run. Default: 3. - * @param {Number} opts.softIdleTimeoutMillis + * @param {Number} [opts.softIdleTimeoutMillis=-1] * amount of time an object may sit idle in the pool before it is eligible * for eviction by the idle object evictor (if any), with the extra condition * that at least "min idle" object instances remain in the pool. Default -1 (nothing can get evicted) - * @param {Number} opts.idleTimeoutMillis + * @param {Number} [opts.idleTimeoutMillis=30000] * the minimum amount of time that an object may sit idle in the pool before it is eligible for eviction * due to idle time. Supercedes "softIdleTimeoutMillis" Default: 30000 - * @param {Promise} [config.Promise=Promise] + * @param {typeof Promise} [opts.Promise=Promise] * What promise implementation should the pool use, defaults to native promises. */ constructor(opts) { @@ -63,14 +68,18 @@ class PoolOptions { : poolDefaults.autostart; if (opts.acquireTimeoutMillis) { + // @ts-ignore this.acquireTimeoutMillis = parseInt(opts.acquireTimeoutMillis, 10); } if (opts.maxWaitingClients) { + // @ts-ignore this.maxWaitingClients = parseInt(opts.maxWaitingClients, 10); } + // @ts-ignore this.max = parseInt(opts.max, 10); + // @ts-ignore this.min = parseInt(opts.min, 10); this.max = Math.max(isNaN(this.max) ? 1 : this.max, 1); diff --git a/lib/PriorityQueue.js b/lib/PriorityQueue.js index d352b41c..ca9916b2 100644 --- a/lib/PriorityQueue.js +++ b/lib/PriorityQueue.js @@ -9,6 +9,7 @@ const Queue = require("./Queue"); class PriorityQueue { constructor(size) { this._size = Math.max(+size | 0, 1); + /** @type {Queue[]} */ this._slots = []; // initialize arrays to hold queue elements for (let i = 0; i < this._size; i++) { diff --git a/lib/Queue.js b/lib/Queue.js index 4961b0ab..94cab131 100644 --- a/lib/Queue.js +++ b/lib/Queue.js @@ -15,7 +15,7 @@ class Queue extends Deque { * Adds the obj to the end of the list for this slot * we completely override the parent method because we need access to the * node for our rejection handler - * @param {[type]} item [description] + * @param {any} resourceRequest [description] */ push(resourceRequest) { const node = DoublyLinkedList.createNode(resourceRequest); diff --git a/lib/ResourceLoan.js b/lib/ResourceLoan.js index 5985ed12..f657cb4e 100644 --- a/lib/ResourceLoan.js +++ b/lib/ResourceLoan.js @@ -10,8 +10,8 @@ const Deferred = require("./Deferred"); class ResourceLoan extends Deferred { /** * - * @param {PooledResource} pooledResource the PooledResource this loan belongs to - * @return {[type]} [description] + * @param {any} pooledResource the PooledResource this loan belongs to + * @return {any} [description] */ constructor(pooledResource, Promise) { super(Promise); diff --git a/lib/ResourceRequest.js b/lib/ResourceRequest.js index 4c950a6f..aa306193 100644 --- a/lib/ResourceRequest.js +++ b/lib/ResourceRequest.js @@ -52,7 +52,9 @@ class ResourceRequest extends Deferred { } removeTimeout() { - clearTimeout(this._timeout); + if (this._timeout) { + clearTimeout(this._timeout); + } this._timeout = null; } diff --git a/lib/errors.js b/lib/errors.js index c0ae289a..b02d822f 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -3,6 +3,7 @@ class ExtendableError extends Error { constructor(message) { super(message); + // @ts-ignore this.name = this.constructor.name; this.message = message; if (typeof Error.captureStackTrace === "function") { diff --git a/test/utils.js b/test/utils.js index 8cbc20c4..fbb2bb2c 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,3 +1,5 @@ +const Pool = require("../lib/Pool"); + /** * Generic class for handling creation of resources * for testing @@ -27,8 +29,8 @@ exports.ResourceFactory = ResourceFactory; /** * drains and terminates the pool * - * @param {[type]} pool [description] - * @return {[type]} [description] + * @param {Pool} pool [description] + * @return {Promise} [description] */ exports.stopPool = function(pool) { return pool.drain().then(function() { From 71fc5582712dc5982d2b3987b84f9fbc93fe8501 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Wed, 27 Dec 2017 20:12:22 +0000 Subject: [PATCH 11/73] bump version --- CHANGELOG.md | 3 +++ package.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d30154e4..a2c65f21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Change Log +## [3.4.0] - December 27 2017 +- #218 fix numerous docblock annotations and minor errors in internal classes (@geovanisouza92) + ## [3.3.0] - December 27 2017 - add `use` method to simplify basic pool usage (@san00) diff --git a/package.json b/package.json index 7a81e0b1..aac32dec 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.3.0", + "version": "3.4.0", "author": "James Cooper ", "contributors": [ { From 32e1863d9b46ec0277777d114180aa9fac31bec7 Mon Sep 17 00:00:00 2001 From: rebareba Date: Thu, 1 Feb 2018 11:38:36 +0800 Subject: [PATCH 12/73] Update Pool.js when ResourceRequest timeout fired --- lib/Pool.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index 4919a209..96da33a9 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -9,6 +9,7 @@ const ResourceLoan = require("./ResourceLoan"); const PooledResource = require("./PooledResource"); const DefaultEvictor = require("./DefaultEvictor"); const Deque = require("./Deque"); +const Deferred = require('./Deferred'); const PriorityQueue = require("./PriorityQueue"); const DequeIterator = require("./DequeIterator"); @@ -260,7 +261,7 @@ class Pool extends EventEmitter { */ _dispatchPooledResourceToNextWaitingClient(pooledResource) { const clientResourceRequest = this._waitingClientsQueue.dequeue(); - if (clientResourceRequest === undefined) { + if (clientResourceRequest === undefined || clientResourceRequest.state !== Deferred.PENDING) { // While we were away either all the waiting clients timed out // or were somehow fulfilled. put our pooledResource back. this._addPooledResourceToAvailableObjects(pooledResource); From cb35152e62ec13e2f226147b486375967dbb8f05 Mon Sep 17 00:00:00 2001 From: rebareba Date: Thu, 1 Feb 2018 11:46:25 +0800 Subject: [PATCH 13/73] Update Pool.js --- lib/Pool.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index 96da33a9..80d93079 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -9,7 +9,7 @@ const ResourceLoan = require("./ResourceLoan"); const PooledResource = require("./PooledResource"); const DefaultEvictor = require("./DefaultEvictor"); const Deque = require("./Deque"); -const Deferred = require('./Deferred'); +const Deferred = require("./Deferred"); const PriorityQueue = require("./PriorityQueue"); const DequeIterator = require("./DequeIterator"); From a07d0284e7b0d3800a6977907148ae8e9482ccee Mon Sep 17 00:00:00 2001 From: rebareba Date: Thu, 1 Feb 2018 11:52:37 +0800 Subject: [PATCH 14/73] Update Pool.js --- lib/Pool.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index 80d93079..d34ec0e4 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -261,7 +261,8 @@ class Pool extends EventEmitter { */ _dispatchPooledResourceToNextWaitingClient(pooledResource) { const clientResourceRequest = this._waitingClientsQueue.dequeue(); - if (clientResourceRequest === undefined || clientResourceRequest.state !== Deferred.PENDING) { + if (clientResourceRequest === undefined || + clientResourceRequest.state !== Deferred.PENDING) { // While we were away either all the waiting clients timed out // or were somehow fulfilled. put our pooledResource back. this._addPooledResourceToAvailableObjects(pooledResource); From f600ad24c5af8d54395493523314522021802ab1 Mon Sep 17 00:00:00 2001 From: rebareba Date: Thu, 1 Feb 2018 11:58:41 +0800 Subject: [PATCH 15/73] Update Pool.js --- lib/Pool.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index d34ec0e4..70bfd5a3 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -261,8 +261,10 @@ class Pool extends EventEmitter { */ _dispatchPooledResourceToNextWaitingClient(pooledResource) { const clientResourceRequest = this._waitingClientsQueue.dequeue(); - if (clientResourceRequest === undefined || - clientResourceRequest.state !== Deferred.PENDING) { + if ( + clientResourceRequest === undefined || + clientResourceRequest.state !== Deferred.PENDING + ) { // While we were away either all the waiting clients timed out // or were somehow fulfilled. put our pooledResource back. this._addPooledResourceToAvailableObjects(pooledResource); From 4e8bf3909a1db0ebd4749dd164698980444b3bed Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Wed, 27 Dec 2017 23:36:48 +0000 Subject: [PATCH 16/73] replace copy pasta resoure factories with basic class --- test/generic-pool-test.js | 93 +++++---------------------------------- test/utils.js | 35 ++++++++------- 2 files changed, 30 insertions(+), 98 deletions(-) diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index 164d0d62..1ec4634d 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -568,13 +568,7 @@ tap.test( ); tap.test("returns only valid object to the pool", function(t) { - const pool = createPool({ - create: function() { - return Promise.resolve({ id: "validId" }); - }, - destroy: function(client) {}, - max: 1 - }); + const pool = createPool(new ResourceFactory(), { max: 1 }); pool .acquire() @@ -604,16 +598,7 @@ tap.test("returns only valid object to the pool", function(t) { }); tap.test("validate acquires object from the pool", function(t) { - const pool = createPool({ - create: function() { - return Promise.resolve({ id: "validId" }); - }, - validate: function(resource) { - return Promise.resolve(true); - }, - destroy: function(client) {}, - max: 1 - }); + const pool = createPool(new ResourceFactory(), { max: 1 }); pool .acquire() @@ -628,16 +613,7 @@ tap.test("validate acquires object from the pool", function(t) { }); tap.test("release to pool should work", function(t) { - const pool = createPool({ - create: function() { - return Promise.resolve({ id: "validId" }); - }, - validate: function(resource) { - return Promise.resolve(true); - }, - destroy: function(client) {}, - max: 1 - }); + const pool = createPool(new ResourceFactory(), { max: 1 }); pool .acquire() @@ -665,16 +641,7 @@ tap.test("release to pool should work", function(t) { tap.test( "isBorrowedResource should return true for borrowed resource", function(t) { - const pool = createPool({ - create: function() { - return Promise.resolve({ id: "validId" }); - }, - validate: function(resource) { - return Promise.resolve(true); - }, - destroy: function(client) {}, - max: 1 - }); + const pool = createPool(new ResourceFactory(), { max: 1 }); pool .acquire() @@ -691,16 +658,7 @@ tap.test( tap.test( "isBorrowedResource should return false for released resource", function(t) { - const pool = createPool({ - create: function() { - return Promise.resolve({ id: "validId" }); - }, - validate: function(resource) { - return Promise.resolve(true); - }, - destroy: function(client) {}, - max: 1 - }); + const pool = createPool(new ResourceFactory(), { max: 1 }); pool .acquire() @@ -718,16 +676,7 @@ tap.test( ); tap.test("destroy should redispense", function(t) { - const pool = createPool({ - create: function() { - return Promise.resolve({ id: "validId" }); - }, - validate: function(resource) { - return Promise.resolve(true); - }, - destroy: function(client) {}, - max: 1 - }); + const pool = createPool(new ResourceFactory(), { max: 1 }); pool .acquire() @@ -753,21 +702,10 @@ tap.test("destroy should redispense", function(t) { }); tap.test("evictor start with acquire when autostart is false", function(t) { - const pool = createPool( - { - create: function() { - return Promise.resolve({ id: "validId" }); - }, - validate: function(resource) { - return Promise.resolve(true); - }, - destroy: function(client) {} - }, - { - evictionRunIntervalMillis: 10000, - autostart: false - } - ); + const pool = createPool(new ResourceFactory(), { + evictionRunIntervalMillis: 10000, + autostart: false + }); t.equal(pool._scheduledEviction, null); @@ -783,16 +721,9 @@ tap.test("evictor start with acquire when autostart is false", function(t) { }); tap.test("use method", function(t) { - const pool = createPool({ - create: function() { - return Promise.resolve({ - id: "validId" - }); - }, - destroy: function(client) {} - }); + const pool = createPool(new ResourceFactory()); const result = pool.use(function(resource) { - t.equal("validId", resource.id); + t.equal(0, resource.id); return Promise.resolve(); }); result.then(function() { diff --git a/test/utils.js b/test/utils.js index fbb2bb2c..5aad77c7 100644 --- a/test/utils.js +++ b/test/utils.js @@ -4,26 +4,27 @@ const Pool = require("../lib/Pool"); * Generic class for handling creation of resources * for testing */ -var ResourceFactory = function ResourceFactory() { - this.created = 0; - this.destroyed = 0; - this.bin = []; -}; +class ResourceFactory { + constructor() { + this.created = 0; + this.destroyed = 0; + this.bin = []; + } -ResourceFactory.prototype.create = function() { - var id = this.created++; - var resource = { - id: id - }; - return Promise.resolve(resource); -}; + create() { + return Promise.resolve({ id: this.created++ }); + } -ResourceFactory.prototype.destroy = function(resource) { - this.destroyed++; - this.bin.push(resource); - return Promise.resolve(); -}; + validate() { + return Promise.resolve(true); + } + destroy(resource) { + this.destroyed++; + this.bin.push(resource); + return Promise.resolve(); + } +} exports.ResourceFactory = ResourceFactory; /** From 624489f30c18c7143fa1aaa11c4df785ac54ab95 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Thu, 1 Feb 2018 16:47:04 +0000 Subject: [PATCH 17/73] bump version and changelog --- CHANGELOG.md | 8 +++++++- package.json | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2c65f21..da6310f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Change Log +## [3.4.1] - Febuary 1 2018 +- prevent timed-out resource requests from being issued resources (@rebareba) + ## [3.4.0] - December 27 2017 - #218 fix numerous docblock annotations and minor errors in internal classes (@geovanisouza92) @@ -167,7 +170,10 @@ - First NPM release ======= -[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.3.0...HEAD + +[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.4.1...HEAD +[3.4.1]: https://github.com/coopernurse/node-pool/compare/v3.4.0...v3.4.1 +[3.4.0]: https://github.com/coopernurse/node-pool/compare/v3.3.0...v3.4.0 [3.3.0]: https://github.com/coopernurse/node-pool/compare/v3.2.0...v3.3.0 [3.2.0]: https://github.com/coopernurse/node-pool/compare/v3.1.8...v3.2.0 [3.1.8]: https://github.com/coopernurse/node-pool/compare/v3.1.7...v3.1.8 diff --git a/package.json b/package.json index aac32dec..3dea48de 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.4.0", + "version": "3.4.1", "author": "James Cooper ", "contributors": [ { From a5d364b0f4cd3fb62daff4356de29e9fda00de45 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Thu, 1 Feb 2018 16:47:46 +0000 Subject: [PATCH 18/73] include node 9. in travis tests --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index db01c40f..0e86c0b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ node_js: - "6" - "7" - "8" + - "9" install: - make install From e00d8adfcb9bbaa81fa15b2b7778c92f84656019 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Thu, 1 Feb 2018 16:52:47 +0000 Subject: [PATCH 19/73] fix strict problem in node 4/5 tests --- test/utils.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/utils.js b/test/utils.js index 5aad77c7..5d2c43fe 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,3 +1,5 @@ +"use strict" + const Pool = require("../lib/Pool"); /** From 7850748f9c0ef54bc861c87fcea1be592af4ddbf Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Thu, 1 Feb 2018 16:54:49 +0000 Subject: [PATCH 20/73] lol formatting.. :-( --- test/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/utils.js b/test/utils.js index 5d2c43fe..5b1e72f1 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,4 +1,4 @@ -"use strict" +"use strict"; const Pool = require("../lib/Pool"); From 6b01b4c82e5a8e3dd8dcf84e646eebd106d7470b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Sannes?= Date: Fri, 16 Feb 2018 10:55:54 +0100 Subject: [PATCH 21/73] Make the promise Pool.use() returns to only resolve after the promise of the provided fn function. Add test to make sure it works like the documentation. --- lib/Pool.js | 2 +- test/generic-pool-test.js | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index 70bfd5a3..c0a9a6c5 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -462,7 +462,7 @@ class Pool extends EventEmitter { */ use(fn) { return this.acquire().then(resource => { - fn(resource).then( + return fn(resource).then( result => { this.release(resource); return result; diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index 1ec4634d..05eebd3a 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -730,3 +730,21 @@ tap.test("use method", function(t) { t.end(); }); }); + +tap.test("use method should resolve after fn promise is resolved", function(t) { + const pool = createPool(new ResourceFactory()); + let done_with_resource = false; + const result = pool.use(function(resource) { + return new Promise(function (resolve, reject) { + setImmediate(function () { + done_with_resource = true; + resolve("value") + }) + }) + }); + result.then((val) => { + t.equal(done_with_resource, true); + t.equal(val, "value"); + t.end(); + }); +}); From a3bac5aeaef3bba7fcf77f86ba85372cd43d19b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Sannes?= Date: Fri, 16 Feb 2018 11:54:33 +0100 Subject: [PATCH 22/73] Fix linting errors in test. --- test/generic-pool-test.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index 05eebd3a..f207994f 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -735,14 +735,14 @@ tap.test("use method should resolve after fn promise is resolved", function(t) { const pool = createPool(new ResourceFactory()); let done_with_resource = false; const result = pool.use(function(resource) { - return new Promise(function (resolve, reject) { - setImmediate(function () { - done_with_resource = true; - resolve("value") - }) - }) + return new Promise(function(resolve, reject) { + setImmediate(function() { + done_with_resource = true; + resolve("value"); + }); + }); }); - result.then((val) => { + result.then(val => { t.equal(done_with_resource, true); t.equal(val, "value"); t.end(); From ceff50d843f1569b43670f37ff205024955d21e5 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Fri, 16 Feb 2018 11:26:31 +0000 Subject: [PATCH 23/73] bump version improve docs for pool.use --- CHANGELOG.md | 6 +++++- README.md | 21 +++++++++++++++++++++ package.json | 2 +- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da6310f1..37a1dc44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Change Log +## [3.4.2] - Febuary 16 2018 +- fix `pool.use` to resolve after user supplied function has finished. (@asannes) + ## [3.4.1] - Febuary 1 2018 - prevent timed-out resource requests from being issued resources (@rebareba) @@ -171,7 +174,8 @@ ======= -[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.4.1...HEAD +[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.4.2...HEAD +[3.4.2]: https://github.com/coopernurse/node-pool/compare/v3.4.1...v3.4.2 [3.4.1]: https://github.com/coopernurse/node-pool/compare/v3.4.0...v3.4.1 [3.4.0]: https://github.com/coopernurse/node-pool/compare/v3.3.0...v3.4.0 [3.3.0]: https://github.com/coopernurse/node-pool/compare/v3.2.0...v3.3.0 diff --git a/README.md b/README.md index 4c577d2a..faefbacb 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,27 @@ pool.start() If `autostart` is `false` then this method can be used to start the pool and therefore begin creation of resources, start the evictor, and any other internal logic. +### pool.use + +```js + +const myTask = dbClient => { + return new Promise( (resolve, reject) => { + // do something with the client and resolve/reject + }) +} + +pool.use(myTask).then(/* a promise that will run after myTask resolves */) +``` + +This method handles acquiring a `resource` from the pool, handing it to your function and then calling `pool.release` or `pool.destroy` with resource after your function has finished. + +`use` takes one required argument: + +- `fn`: a function that accepts a `resource` and returns a `Promise`. Once that promise `resolve`s the `resource` is returned to the pool, else if it `reject`s then the resource is destroyed. + +and returns a `Promise` that either `resolve`s with the value from the user supplied `fn` or `reject`s with an error. + ## Idle Object Eviction The pool has an evictor (off by default) which will inspect idle items in the pool and `destroy` them if they are too old. diff --git a/package.json b/package.json index 3dea48de..215162cd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.4.1", + "version": "3.4.2", "author": "James Cooper ", "contributors": [ { From d2274f8336c15050bf1f142bd6840dddd51fee9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Louis=20Roch=C3=A9?= Date: Fri, 2 Mar 2018 05:59:08 +0000 Subject: [PATCH 24/73] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index faefbacb..9925d9c4 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Whilst it is possible to directly instantiate the Pool class directly, it is rec The createPool function takes two arguments: - `factory` : an object containing functions to create/destroy/test resources for the `Pool` -- `opts` : an optional object/dictonary to allow configuring/altering behaviour the of the `Pool` +- `opts` : an optional object/dictonary to allow configuring/altering behaviour of the `Pool` ```js const genericPool = require('generic-pool') From a612f21ba31c64c9745a74e761326192da6fd39e Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Wed, 18 Apr 2018 21:09:27 +0100 Subject: [PATCH 25/73] readme config typo: fixes #226 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9925d9c4..01814747 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ An optional object/dictionary with the any of the following properties: see example. (default 1) - `autostart`: boolean, should the pool start creating resources, initialize the evictor, etc once the constructor is called. If false, the pool can be started by calling `pool.start`, otherwise the first call to `acquire` will start the pool. (default true) - `evictionRunIntervalMillis`: How often to run eviction checks. Default: 0 (does not run). -- `numTestsPerRun`: Number of resources to check each eviction run. Default: 3. +- `numTestsPerEvictionRun`: Number of resources to check each eviction run. Default: 3. - `softIdleTimeoutMillis`: amount of time an object may sit idle in the pool before it is eligible for eviction by the idle object evictor (if any), with the extra condition that at least "min idle" object instances remain in the pool. Default -1 (nothing can get evicted) - `idleTimeoutMillis`: the minimum amount of time that an object may sit idle in the pool before it is eligible for eviction due to idle time. Supercedes `softIdleTimeoutMillis` Default: 30000 - `Promise`: Promise lib, a Promises/A+ implementation that the pool should use. Defaults to whatever `global.Promise` is (usually native promises). From e73247728432f2a681f87b3228ccf10ebe67d5aa Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Wed, 18 Apr 2018 21:39:21 +0100 Subject: [PATCH 26/73] avoid unnecessary fetch from loan store --- lib/Pool.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index c0a9a6c5..36de3760 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -485,7 +485,7 @@ class Pool extends EventEmitter { * True if resource belongs to this pool and false otherwise */ isBorrowedResource(resource) { - return this._resourceLoans.get(resource) !== undefined; + return this._resourceLoans.has(resource); } /** From 7102abfb94023b32a4f640387f8714d3dd3c8899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Rodr=C3=ADguez=20Baquero?= Date: Thu, 17 Jan 2019 12:17:54 -0500 Subject: [PATCH 27/73] fix(Pool): continue iterating when reaching DoubleLinkedList end --- lib/Pool.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index 36de3760..127fe28c 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -362,7 +362,7 @@ class Pool extends EventEmitter { // list and can reset the cursor. if (iterationResult.done === true && this._availableObjects.length > 0) { this._evictionIterator.reset(); - break; + continue; } const resource = iterationResult.value; From 67ca42bb4eae871527c91f030d70c1312c2395e4 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Thu, 17 Jan 2019 18:38:36 +0000 Subject: [PATCH 28/73] update node versions tested used on travis --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0e86c0b5..d5d90191 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,9 @@ language: node_js node_js: - - "4" - - "5" - "6" - - "7" - "8" - - "9" + - "10" + - "11" install: - make install From d4d9968a051ef4821c7d85ad793775ca51b726a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Rodr=C3=ADguez=20Baquero?= Date: Thu, 17 Jan 2019 12:12:08 -0500 Subject: [PATCH 29/73] fix(DefaultEvictor): softIdleTimeoutMillis handle -1 fixes #192 --- lib/DefaultEvictor.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/DefaultEvictor.js b/lib/DefaultEvictor.js index 918defae..658d345a 100644 --- a/lib/DefaultEvictor.js +++ b/lib/DefaultEvictor.js @@ -5,6 +5,7 @@ class DefaultEvictor { const idleTime = Date.now() - pooledResource.lastIdleTime; if ( + config.softIdleTimeoutMillis > 0 && config.softIdleTimeoutMillis < idleTime && config.min < availableObjectsCount ) { From a10a9c1220ba59d629f9f0300bd6cc502375218a Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Thu, 17 Jan 2019 19:11:04 +0000 Subject: [PATCH 30/73] add test case for GH-192 --- test/generic-pool-test.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index f207994f..0c420633 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -748,3 +748,23 @@ tap.test("use method should resolve after fn promise is resolved", function(t) { t.end(); }); }); + +tap.test("evictor should not run when softIdleTimeoutMillis is -1", function( + t +) { + const resourceFactory = new ResourceFactory(); + const pool = createPool(resourceFactory, { + evictionRunIntervalMillis: 10 + }); + pool + .acquire() + .then(res => pool.release(res)) + .then(() => { + return new Promise(res => setTimeout(res, 30)); + }) + .then(() => t.equal(resourceFactory.destroyed, 0)) + .then(() => { + utils.stopPool(pool); + t.end(); + }); +}); From aa3a3a12365a1c7a52bc563119be5fba2adbc16d Mon Sep 17 00:00:00 2001 From: anup-honey Date: Thu, 21 Jun 2018 15:12:34 -0700 Subject: [PATCH 31/73] maxWaitingClients should respect `0` value --- lib/PoolOptions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/PoolOptions.js b/lib/PoolOptions.js index 498c0e34..d3b5d7ee 100644 --- a/lib/PoolOptions.js +++ b/lib/PoolOptions.js @@ -72,7 +72,7 @@ class PoolOptions { this.acquireTimeoutMillis = parseInt(opts.acquireTimeoutMillis, 10); } - if (opts.maxWaitingClients) { + if (opts.maxWaitingClients !== undefined) { // @ts-ignore this.maxWaitingClients = parseInt(opts.maxWaitingClients, 10); } From 000b6f8d6079af313a78673d68442139c0967578 Mon Sep 17 00:00:00 2001 From: Anup Baldawa Date: Fri, 22 Jun 2018 10:11:30 -0700 Subject: [PATCH 32/73] code to respect when maxwaitingClients is set to 0 --- lib/Pool.js | 1 + test/generic-pool-test.js | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/lib/Pool.js b/lib/Pool.js index 127fe28c..e6260bd2 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -437,6 +437,7 @@ class Pool extends EventEmitter { // TODO: should we defer this check till after this event loop incase "the situation" changes in the meantime if ( + !this.spareResourceCapacity && !this.available && this._config.maxWaitingClients !== undefined && this._waitingClientsQueue.length >= this._config.maxWaitingClients ) { diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index 0c420633..575dea33 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -768,3 +768,46 @@ tap.test("evictor should not run when softIdleTimeoutMillis is -1", function( t.end(); }); }); + +tap.test("should respect when maxWaitingClients is set to 0 ", function(t) { + let assertionCount = 0; + const resourceFactory = new ResourceFactory(); + const config = { + max: 2, + maxWaitingClients: 0 + }; + + const pool = createPool(resourceFactory, config); + + const borrowedResources = []; + + t.equal(pool.size, 0); + assertionCount += 1; + + pool + .acquire() + .then(function(obj) { + borrowedResources.push(obj); + t.equal(pool.size, 1); + assertionCount += 1; + }) + .then(function() { + return pool.acquire(); + }) + .then(function(obj) { + borrowedResources.push(obj); + t.equal(pool.size, 2); + assertionCount += 1; + }) + .then(function() { + return pool.acquire(); + }) + .then(function(obj) { + // should not go in here + t.equal(1, 2); + }) + .catch(error => { + t.equal(error.message, "max waitingClients count exceeded"); + t.end(); + }); +}); From 425dd23389cae21ddd27eddd16951f0dd5c6141c Mon Sep 17 00:00:00 2001 From: Anup Baldawa Date: Thu, 28 Jun 2018 13:08:02 -0700 Subject: [PATCH 33/73] changes based on PR review --- lib/Pool.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index e6260bd2..9ab024d5 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -437,7 +437,8 @@ class Pool extends EventEmitter { // TODO: should we defer this check till after this event loop incase "the situation" changes in the meantime if ( - !this.spareResourceCapacity && !this.available && + this.spareResourceCapacity < 1 && + this._availableObjects.length < 1 && this._config.maxWaitingClients !== undefined && this._waitingClientsQueue.length >= this._config.maxWaitingClients ) { From 87fb28a2c4f4cea6ec8cf0aedc2754858122b658 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Thu, 17 Jan 2019 19:53:37 +0000 Subject: [PATCH 34/73] bump changelog and version for publishing --- CHANGELOG.md | 9 ++++++++- package.json | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37a1dc44..53cfc932 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## [3.5.0] - January 17 2019 +- update nodejs versions tested by travis +- eviction iterator no longer stops when reaching end of object list #243 (@DiegoRBaquero) +- fix #192 softIdleTimeoutMillis = -1 no longer triggers evictor to run #242 (@DiegoRBaquero) +- fix #234 maxWaitingClients = 0 is no longer ignored #247 (@anupbaldawa) + ## [3.4.2] - Febuary 16 2018 - fix `pool.use` to resolve after user supplied function has finished. (@asannes) @@ -174,7 +180,8 @@ ======= -[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.4.2...HEAD +[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.5.0...HEAD +[3.5.0]: https://github.com/coopernurse/node-pool/compare/v3.4.2...v3.5.0 [3.4.2]: https://github.com/coopernurse/node-pool/compare/v3.4.1...v3.4.2 [3.4.1]: https://github.com/coopernurse/node-pool/compare/v3.4.0...v3.4.1 [3.4.0]: https://github.com/coopernurse/node-pool/compare/v3.3.0...v3.4.0 diff --git a/package.json b/package.json index 215162cd..b7a22701 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.4.2", + "version": "3.5.0", "author": "James Cooper ", "contributors": [ { From ffc3916569c1f5b17cc8f2db079fee86bd353374 Mon Sep 17 00:00:00 2001 From: Christian d'Heureuse Date: Mon, 21 Jan 2019 04:00:34 +0100 Subject: [PATCH 35/73] fix: factory.validateAsync does no longer exist. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 01814747..3bf5fc84 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ An optional object/dictionary with the any of the following properties: - `max`: maximum number of resources to create at any given time. (default=1) - `min`: minimum number of resources to keep in pool at any given time. If this is set >= max, the pool will silently set the min to equal `max`. (default=0) - `maxWaitingClients`: maximum number of queued requests allowed, additional `acquire` calls will be callback with an `err` in a future cycle of the event loop. -- `testOnBorrow`: `boolean`: should the pool validate resources before giving them to clients. Requires that either `factory.validate` or `factory.validateAsync` to be specified +- `testOnBorrow`: `boolean`: should the pool validate resources before giving them to clients. Requires that `factory.validate` is specified. - `acquireTimeoutMillis`: max milliseconds an `acquire` call will wait for a resource before timing out. (default no limit), if supplied should non-zero positive integer. - `fifo` : if true the oldest resources will be first to be allocated. If false the most recently released resources will be the first to be allocated. This in effect turns the pool's behaviour from a queue into a stack. `boolean`, (default true) - `priorityRange`: int between 1 and x - if set, borrowers can specify their relative priority in the queue if no resources are available. From 7764af06a2012e13373dade76731d986382e69cf Mon Sep 17 00:00:00 2001 From: Christian d'Heureuse Date: Mon, 21 Jan 2019 04:07:22 +0100 Subject: [PATCH 36/73] fix: factory.validateAsync does no longer exist. --- lib/PoolOptions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/PoolOptions.js b/lib/PoolOptions.js index d3b5d7ee..3ac3189b 100644 --- a/lib/PoolOptions.js +++ b/lib/PoolOptions.js @@ -17,8 +17,8 @@ class PoolOptions { * @param {Number} [opts.maxWaitingClients=null] * maximum number of queued requests allowed after which acquire calls will be rejected * @param {Boolean} [opts.testOnBorrow=false] - * should the pool validate resources before giving them to clients. Requires that either - * `factory.validate` or `factory.validateAsync` to be specified. + * should the pool validate resources before giving them to clients. Requires that + * `factory.validate` is specified. * @param {Boolean} [opts.testOnReturn=false] * should the pool validate resources before returning them to the pool. * @param {Number} [opts.acquireTimeoutMillis=null] From 5ef7da973457bc7a47b82c04324a88868ef7877d Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Sat, 2 Feb 2019 14:40:48 +0000 Subject: [PATCH 37/73] add regression test for GH-159 --- test/GH-159-test.js | 71 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 test/GH-159-test.js diff --git a/test/GH-159-test.js b/test/GH-159-test.js new file mode 100644 index 00000000..88d55631 --- /dev/null +++ b/test/GH-159-test.js @@ -0,0 +1,71 @@ +const tap = require("tap"); +const createPool = require("../").createPool; +const utils = require("./utils"); +const ResourceFactory = utils.ResourceFactory; + +class ResourceFactoryDelayCreateEachSecond { + constructor() { + this.callCreate = 0; + this.created = 0; + this.destroyed = 0; + this.bin = []; + } + + create() { + const that = this; + console.log(`** create call ${that.callCreate}`); + return new Promise(resolve => { + if (that.callCreate % 2 === 0) { + setTimeout(function() { + console.log(`** created ${that.created}`); + resolve({ id: that.created++ }); + }, 10); + } else { + console.log(`** created ${that.created}`); + resolve({ id: that.created++ }); + } + that.callCreate++; + }); + } + + validate() { + return Promise.resolve(true); + } + + destroy(resource) { + console.log(`** destroying ${resource.id}`); + this.destroyed++; + this.bin.push(resource); + return Promise.resolve(); + } +} + +tap.test("tests drain clear with autostart and min > 0", function(t) { + const count = 5; + let acquired = 0; + + const resourceFactory = new ResourceFactoryDelayCreateEachSecond(); + const config = { + max: 10, + min: 1, + evictionRunIntervalMillis: 500, + idleTimeoutMillis: 30000, + testOnBorrow: true, + autostart: true + }; + const pool = createPool(resourceFactory, config); + + return pool + .drain() + .then(function() { + console.log("** pool drained"); + return pool.clear(); + }) + .then(function() { + console.log("** pool cleared"); + t.equal(resourceFactory.created, resourceFactory.destroyed); + }) + .then(function() { + t.end(); + }); +}); From f5a93df86e58b2fd50e7f8c12c1c05c0a14b5572 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Sat, 2 Feb 2019 14:27:20 +0000 Subject: [PATCH 38/73] adjust object tracking to leave resources in limbo after creation Newly created resources would have their creation operation marked as finished yet only be tracked in the "allObjects" which would allow a pool to clear without removing them fixes #159 --- lib/Pool.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index 9ab024d5..8762c21d 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -306,12 +306,17 @@ class Pool extends EventEmitter { _createResource() { // An attempt to create a resource const factoryPromise = this._factory.create(); - const wrappedFactoryPromise = this._Promise.resolve(factoryPromise); + const wrappedFactoryPromise = this._Promise + .resolve(factoryPromise) + .then(resource => { + const pooledResource = new PooledResource(resource); + this._allObjects.add(pooledResource); + this._addPooledResourceToAvailableObjects(pooledResource); + }); this._trackOperation(wrappedFactoryPromise, this._factoryCreateOperations) - .then(resource => { - this._handleNewResource(resource); - return null; + .then(() => { + this._dispense(); }) .catch(reason => { this.emit(FACTORY_CREATE_ERROR, reason); @@ -319,13 +324,6 @@ class Pool extends EventEmitter { }); } - _handleNewResource(resource) { - const pooledResource = new PooledResource(resource); - this._allObjects.add(pooledResource); - // TODO: check we aren't exceding our maxPoolSize before doing - this._dispatchPooledResourceToNextWaitingClient(pooledResource); - } - /** * @private */ From e8817eb5fe057d15ce7f7fd8dce33f5c731a36a1 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Mon, 4 Feb 2019 00:46:00 +0000 Subject: [PATCH 39/73] Bump changelog and version for publishing --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53cfc932..eb6b3881 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [3.6.0] - Febuary 4 2019 +- update docs (@chdh) +- fix #159 - pool.clear can no longer "skip" clearing up resources when called early in pool lifecycle (@sandfox) + ## [3.5.0] - January 17 2019 - update nodejs versions tested by travis - eviction iterator no longer stops when reaching end of object list #243 (@DiegoRBaquero) diff --git a/package.json b/package.json index b7a22701..0167e24a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.5.0", + "version": "3.6.0", "author": "James Cooper ", "contributors": [ { From 5e7da7d36965f3c92ba67adab05858bb3fec10f6 Mon Sep 17 00:00:00 2001 From: restjohn Date: Wed, 6 Feb 2019 07:53:52 -0700 Subject: [PATCH 40/73] return a promise from Pool.clear() that resolves with no value rather than the array of undefined values that it resolved previously --- lib/Pool.js | 2 +- test/generic-pool-test.js | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index 8762c21d..351220af 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -616,7 +616,7 @@ class Pool extends EventEmitter { const reflectedDestroyPromises = Array.from( this._factoryDestroyOperations ).map(reflector); - return this._Promise.all(reflectedDestroyPromises); + return reflector(this._Promise.all(reflectedDestroyPromises)); }); } diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index 575dea33..897f0a00 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -257,6 +257,49 @@ tap.test("tests drain", function(t) { }); }); +tap.test("clear promise resolves with no value", function(t) { + let resources = []; + const factory = { + create: function create() { + return new Promise(function tryCreate(resolve, reject) { + let resource = resources.shift(); + if (resource) { + resolve(resource); + } else { + process.nextTick(tryCreate.bind(this, resolve, reject)); + } + }); + }, + destroy: function() { + return Promise.resolve(); + } + }; + const pool = createPool(factory, { max: 3, min: 3 }); + Promise.all([pool.acquire(), pool.acquire(), pool.acquire()]).then(all => { + for (let resource of all) { + process.nextTick(pool.release.bind(pool), resource); + } + }); + + t.equal(pool.pending, 3, "all acquisitions pending"); + + pool + .drain() + .then(() => { + return pool.clear(); + }) + .then(resolved => { + t.equal(resolved, undefined, "clear promise resolves with no value"); + t.end(); + }); + + process.nextTick(() => { + resources.push("a"); + resources.push("b"); + resources.push("c"); + }); +}); + tap.test("handle creation errors", function(t) { let created = 0; const resourceFactory = { From 20f881970051668ec6572750bb57f19fec479551 Mon Sep 17 00:00:00 2001 From: restjohn Date: Wed, 6 Feb 2019 08:46:02 -0700 Subject: [PATCH 41/73] modified test according to comments from @DiegoRBaquero on pull request #252 --- test/generic-pool-test.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index 897f0a00..4317f1f4 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -276,18 +276,16 @@ tap.test("clear promise resolves with no value", function(t) { }; const pool = createPool(factory, { max: 3, min: 3 }); Promise.all([pool.acquire(), pool.acquire(), pool.acquire()]).then(all => { - for (let resource of all) { + all.forEach(resource => { process.nextTick(pool.release.bind(pool), resource); - } + }); }); t.equal(pool.pending, 3, "all acquisitions pending"); pool .drain() - .then(() => { - return pool.clear(); - }) + .then(() => pool.clear()) .then(resolved => { t.equal(resolved, undefined, "clear promise resolves with no value"); t.end(); From 9473d3e955e7108bb184e97de3b5f29036145ef8 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Wed, 6 Feb 2019 21:39:00 +0000 Subject: [PATCH 42/73] stop bluebird complaining about side-effect only handler --- lib/Pool.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/Pool.js b/lib/Pool.js index 8762c21d..f6dc39c6 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -317,6 +317,10 @@ class Pool extends EventEmitter { this._trackOperation(wrappedFactoryPromise, this._factoryCreateOperations) .then(() => { this._dispense(); + // Stop bluebird complaining about this side-effect only handler + // - a promise was created in a handler but was not returned from it + // https://goo.gl/rRqMUw + return null; }) .catch(reason => { this.emit(FACTORY_CREATE_ERROR, reason); From e6e3384669321847c199719deab57d818084ce27 Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Wed, 6 Feb 2019 21:52:37 +0000 Subject: [PATCH 43/73] bump version and changelog --- CHANGELOG.md | 8 +++++++- package.json | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb6b3881..91564991 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [3.6.1] - Febuary 6 2019 +- fix #251 - silence bluebird warning about side-effect only handler (@sandfox) +- Pool.clear no longer resolves to pointless array on undefineds (@restjohn) + ## [3.6.0] - Febuary 4 2019 - update docs (@chdh) - fix #159 - pool.clear can no longer "skip" clearing up resources when called early in pool lifecycle (@sandfox) @@ -184,7 +188,9 @@ ======= -[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.5.0...HEAD +[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.6.1...HEAD +[3.6.1]: https://github.com/coopernurse/node-pool/compare/v3.6.0...v3.6.1 +[3.6.0]: https://github.com/coopernurse/node-pool/compare/v3.5.0...v3.6.0 [3.5.0]: https://github.com/coopernurse/node-pool/compare/v3.4.2...v3.5.0 [3.4.2]: https://github.com/coopernurse/node-pool/compare/v3.4.1...v3.4.2 [3.4.1]: https://github.com/coopernurse/node-pool/compare/v3.4.0...v3.4.1 diff --git a/package.json b/package.json index 0167e24a..6cbf1746 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.6.0", + "version": "3.6.1", "author": "James Cooper ", "contributors": [ { From 05bf6f66f8dcf366d90b6ecc134193dd3c3e5cb4 Mon Sep 17 00:00:00 2001 From: linchuang Date: Mon, 25 Mar 2019 20:04:54 +0800 Subject: [PATCH 44/73] fix: Fn When returning to reject, the resource will be destroyed --- lib/Pool.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index 66678c57..629859ca 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -351,7 +351,7 @@ class Pool extends EventEmitter { idleTimeoutMillis: this._config.idleTimeoutMillis, min: this._config.min }; - for (let testsHaveRun = 0; testsHaveRun < testsToRun; ) { + for (let testsHaveRun = 0; testsHaveRun < testsToRun;) { const iterationResult = this._evictionIterator.next(); // Safety check incase we could get stuck in infinite loop because we @@ -472,7 +472,7 @@ class Pool extends EventEmitter { return result; }, err => { - this.release(resource); + this.destroy(resource); throw err; } ); @@ -710,4 +710,4 @@ class Pool extends EventEmitter { } } -module.exports = Pool; +module.exports = Pool; \ No newline at end of file From 2fa078c0cae0c76d6941059cf47f1ab0eb88abf1 Mon Sep 17 00:00:00 2001 From: linchuang Date: Mon, 25 Mar 2019 20:13:05 +0800 Subject: [PATCH 45/73] fix: make lint~ --- lib/Pool.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index 629859ca..addb080e 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -351,7 +351,7 @@ class Pool extends EventEmitter { idleTimeoutMillis: this._config.idleTimeoutMillis, min: this._config.min }; - for (let testsHaveRun = 0; testsHaveRun < testsToRun;) { + for (let testsHaveRun = 0; testsHaveRun < testsToRun; ) { const iterationResult = this._evictionIterator.next(); // Safety check incase we could get stuck in infinite loop because we @@ -710,4 +710,4 @@ class Pool extends EventEmitter { } } -module.exports = Pool; \ No newline at end of file +module.exports = Pool; From e15d4e40787426d6ced44eb445ae50bc80519eec Mon Sep 17 00:00:00 2001 From: James Edward Butler Date: Thu, 28 Mar 2019 10:57:52 +0000 Subject: [PATCH 46/73] bump version for publishing --- CHANGELOG.md | 6 +++++- package.json | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91564991..9000f331 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Change Log +## [3.7.1] - March 28 2019 +- fix #257 - `pool.use` now destroys resources on rejection, matching the docs. + ## [3.6.1] - Febuary 6 2019 - fix #251 - silence bluebird warning about side-effect only handler (@sandfox) - Pool.clear no longer resolves to pointless array on undefineds (@restjohn) @@ -188,7 +191,8 @@ ======= -[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.6.1...HEAD +[unreleased]: https://github.com/coopernurse/node-pool/compare/v3.7.1...HEAD +[3.7.1]: https://github.com/coopernurse/node-pool/compare/v3.6.1...v3.7.1 [3.6.1]: https://github.com/coopernurse/node-pool/compare/v3.6.0...v3.6.1 [3.6.0]: https://github.com/coopernurse/node-pool/compare/v3.5.0...v3.6.0 [3.5.0]: https://github.com/coopernurse/node-pool/compare/v3.4.2...v3.5.0 diff --git a/package.json b/package.json index 6cbf1746..e3b85eb5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.6.1", + "version": "3.7.1", "author": "James Cooper ", "contributors": [ { From b6558ad8b48d60bd801f13e197d39f59fa5ebc76 Mon Sep 17 00:00:00 2001 From: t3hmrman Date: Tue, 2 Apr 2019 17:19:31 +0900 Subject: [PATCH 47/73] Add .npmignore --- .npmignore | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .npmignore diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..2cff09fe --- /dev/null +++ b/.npmignore @@ -0,0 +1,7 @@ +node_modules/generic-pool/.eslintignore +node_modules/generic-pool/.eslintrc.js +node_modules/generic-pool/.travis.yml +node_modules/generic-pool/CHANGELOG.md +node_modules/generic-pool/Makefile +node_modules/generic-pool/tsconfig.json +node_modules/generic-pool/test/* From 6b250427b2466d7302184694266e462cd120a96e Mon Sep 17 00:00:00 2001 From: James Butler Date: Tue, 2 Apr 2019 10:30:18 +0100 Subject: [PATCH 48/73] Revert "Add .npmignore" --- .npmignore | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .npmignore diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 2cff09fe..00000000 --- a/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules/generic-pool/.eslintignore -node_modules/generic-pool/.eslintrc.js -node_modules/generic-pool/.travis.yml -node_modules/generic-pool/CHANGELOG.md -node_modules/generic-pool/Makefile -node_modules/generic-pool/tsconfig.json -node_modules/generic-pool/test/* From 4faa0746445a7ed1d4c20ebe7a7142922e18aa93 Mon Sep 17 00:00:00 2001 From: t3hmrman Date: Tue, 2 Apr 2019 16:10:50 +0900 Subject: [PATCH 49/73] Add updated type definitions --- index.d.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 index.d.ts diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 00000000..a7e57b0f --- /dev/null +++ b/index.d.ts @@ -0,0 +1,50 @@ +// Type definitions for generic-pool 3.1 +// Derived from https://github.com/DefinitelyTyped/DefinitelyTyped +// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/454dcbcbe5e932010b128dca9793758dd28adb45/types/generic-pool/index.d.ts + +/// + +import { EventEmitter } from "events"; + +export class Pool extends EventEmitter { + spareResourceCapacity: number; + size: number; + available: number; + borrowed: number; + pending: number; + max: number; + min: number; + + start(): void; + acquire(priority?: number): Promise; + release(resource: T): Promise; + destroy(resource: T): Promise; + drain(): Promise; + clear(): Promise; + use(cb: (resource: T) => U | Promise): Promise; + isBorrowedResource(resource: T): boolean; +} + +export interface Factory { + create(): Promise; + destroy(client: T): Promise; + validate?(client: T): Promise; +} + +export interface Options { + max?: number; + min?: number; + maxWaitingClients?: number; + testOnBorrow?: boolean; + testOnReturn?: boolean; + acquireTimeoutMillis?: number; + fifo?: boolean; + priorityRange?: number; + autostart?: boolean; + evictionRunIntervalMillis?: number; + numTestsPerEvictionRun?: number; + softIdleTimeoutMillis?: number; + idleTimeoutMillis?: number; +} + +export function createPool(factory: Factory, opts?: Options): Pool; From a8d7b8c6cd4dcc6ec6f6daf9bfcba97df2d71b78 Mon Sep 17 00:00:00 2001 From: t3hmrman Date: Tue, 2 Apr 2019 16:19:03 +0900 Subject: [PATCH 50/73] "generic-pool" -> "node-pool" --- index.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.d.ts b/index.d.ts index a7e57b0f..44daab80 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,6 +1,6 @@ -// Type definitions for generic-pool 3.1 +// Type definitions for node-pool 3.1 // Derived from https://github.com/DefinitelyTyped/DefinitelyTyped -// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/454dcbcbe5e932010b128dca9793758dd28adb45/types/generic-pool/index.d.ts +// -> https://github.com/DefinitelyTyped/DefinitelyTyped/blob/454dcbcbe5e932010b128dca9793758dd28adb45/types/generic-pool/index.d.ts /// From 0b2d105be5203c232a9a17b7cd6e462f842e350c Mon Sep 17 00:00:00 2001 From: Vados Date: Tue, 2 Apr 2019 18:29:12 +0900 Subject: [PATCH 51/73] Fix paths in .npmignore .npmignore had wrong path prefix (see PR for #232) --- .npmignore | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .npmignore diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..18f75c21 --- /dev/null +++ b/.npmignore @@ -0,0 +1,6 @@ +.eslintignore +.eslintrc.js +.travis.yml +Makefile +tsconfig.json +test/* From a7faac5ba780dea49a377521901f92fbc93b2b2a Mon Sep 17 00:00:00 2001 From: Idan Attias Date: Thu, 25 Jul 2019 17:13:56 +0300 Subject: [PATCH 52/73] failing test --- package-lock.json | 3245 +++++++++++++++++++++++++++++++++++++ test/generic-pool-test.js | 16 + 2 files changed, 3261 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..61421227 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3245 @@ +{ + "name": "generic-pool", + "version": "3.7.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "8.10.51", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/@types/node/-/node-8.10.51.tgz", + "integrity": "sha1-gGAIV8Ckeo6Lr8La5trtbbWONic=", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha1-Z6ojG/iBKXS4UjWpZ3Hra9B+onk=", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha1-qNCv1zJR7/u9X+OEp31zADwXpx8=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", + "dev": true + }, + "clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/commander/-/commander-2.20.0.tgz", + "integrity": "sha1-1YuytcHuj4ew00ACfp6U4iLFpCI=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "2.13.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/coveralls/-/coveralls-2.13.3.tgz", + "integrity": "sha1-mtfCrlJ0F/Nh6LYmSD9I7pLdK8c=", + "dev": true, + "requires": { + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/debug/-/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deeper": { + "version": "2.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/deeper/-/deeper-2.1.0.tgz", + "integrity": "sha1-vFZOX3MXT98gHgiwADDooU2nQ2g=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "1.4.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha1-MtHWU+HZBAiFS/spbwdux+GGowA=", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + } + }, + "eslint-config-prettier": { + "version": "2.10.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz", + "integrity": "sha1-7Ae8HQH4fQn2HThA0RLcipeR4ws=", + "dev": true, + "requires": { + "get-stdin": "^5.0.1" + } + }, + "eslint-plugin-prettier": { + "version": "2.7.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz", + "integrity": "sha1-tDEtzywdllN51/nVtfiqrcakWQQ=", + "dev": true, + "requires": { + "fast-diff": "^1.1.1", + "jest-docblock": "^21.0.0" + } + }, + "eslint-plugin-promise": { + "version": "3.8.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", + "integrity": "sha1-ZevyeoRePB6db2pWIt3TgBaUtiE=", + "dev": true + }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha1-u1ByANPRf2AkdjYWC0gmKEsQhTU=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0=", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/espree/-/espree-3.5.4.tgz", + "integrity": "sha1-sPRHGHyKi+2US4FaZgvd9d610ac=", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/extend/-/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha1-c+4RmC2Gyq95WYKNUZz+kn+sXwM=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha1-LC73dSXMKSkAff/6HdMUqpyd7m8=", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha1-8GlhdpDBDIaOc7hGV0Z2T5fDR58=", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/glob/-/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/globals/-/globals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha1-jY/cc5d8sEEEchy1NmbBymTNMos=", + "dev": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ=", + "dev": true + }, + "is-my-json-valid": { + "version": "2.20.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha1-E0Wm/KPo2u/BDQ+ncGf1TO2v1Zo=", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha1-UVKcOzDV/RWdpgwnzu3Blfr41BQ=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/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": "4.17.15", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", + "dev": true + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nyc": { + "version": "9.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/nyc/-/nyc-9.0.1.tgz", + "integrity": "sha1-gnde1cfyc0WVosXnxk9dcZmQTbA=", + "dev": true, + "requires": { + "archy": "^1.0.0", + "arrify": "^1.0.1", + "caching-transform": "^1.0.0", + "convert-source-map": "^1.3.0", + "default-require-extensions": "^1.0.0", + "find-cache-dir": "^0.1.1", + "find-up": "^1.1.2", + "foreground-child": "^1.5.3", + "glob": "^7.0.6", + "istanbul-lib-coverage": "^1.0.0", + "istanbul-lib-hook": "^1.0.0-alpha.4", + "istanbul-lib-instrument": "^1.3.0", + "istanbul-lib-report": "^1.0.0-alpha.3", + "istanbul-lib-source-maps": "^1.1.0", + "istanbul-reports": "^1.0.0", + "md5-hex": "^1.2.0", + "merge-source-map": "^1.0.2", + "micromatch": "^2.3.11", + "mkdirp": "^0.5.0", + "resolve-from": "^2.0.0", + "rimraf": "^2.5.4", + "signal-exit": "^3.0.1", + "spawn-wrap": "^1.2.4", + "test-exclude": "^3.2.2", + "yargs": "^6.4.0", + "yargs-parser": "^4.0.2" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "0.3.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "async": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "babel-code-frame": { + "version": "6.16.0", + "bundled": true, + "dev": true, + "requires": { + "chalk": "^1.1.0", + "esutils": "^2.0.2", + "js-tokens": "^2.0.0" + } + }, + "babel-generator": { + "version": "6.18.0", + "bundled": true, + "dev": true, + "requires": { + "babel-messages": "^6.8.0", + "babel-runtime": "^6.9.0", + "babel-types": "^6.18.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.2.0", + "source-map": "^0.5.0" + } + }, + "babel-messages": { + "version": "6.8.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.0.0" + } + }, + "babel-runtime": { + "version": "6.18.0", + "bundled": true, + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.9.5" + } + }, + "babel-template": { + "version": "6.16.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.9.0", + "babel-traverse": "^6.16.0", + "babel-types": "^6.16.0", + "babylon": "^6.11.0", + "lodash": "^4.2.0" + } + }, + "babel-traverse": { + "version": "6.18.0", + "bundled": true, + "dev": true, + "requires": { + "babel-code-frame": "^6.16.0", + "babel-messages": "^6.8.0", + "babel-runtime": "^6.9.0", + "babel-types": "^6.18.0", + "babylon": "^6.11.0", + "debug": "^2.2.0", + "globals": "^9.0.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + } + }, + "babel-types": { + "version": "6.18.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.9.1", + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^1.0.1" + } + }, + "babylon": { + "version": "6.13.1", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.6", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "bundled": true, + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "caching-transform": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "md5-hex": "^1.2.0", + "mkdirp": "^0.5.1", + "write-file-atomic": "^1.1.4" + } + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "core-js": { + "version": "2.4.1", + "bundled": true, + "dev": true + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "debug": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "error-ex": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "bundled": true, + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "filename-regex": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "bundled": true, + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "for-in": { + "version": "0.1.6", + "bundled": true, + "dev": true + }, + "for-own": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "for-in": "^0.1.5" + } + }, + "foreground-child": { + "version": "1.5.3", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "glob": { + "version": "7.1.1", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.13.0", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.10", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.0.6", + "bundled": true, + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.1.5", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invariant": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-dotfile": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.0.0-alpha.4", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "^0.3.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.13.0", + "istanbul-lib-coverage": "^1.0.0", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.0.0-alpha.3", + "bundled": true, + "dev": true, + "requires": { + "async": "^1.4.2", + "istanbul-lib-coverage": "^1.0.0-alpha", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "rimraf": "^2.4.3", + "supports-color": "^3.1.2" + }, + "dependencies": { + "supports-color": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.0.0-alpha.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.4.4", + "source-map": "^0.5.3" + } + }, + "istanbul-reports": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "js-tokens": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.0", + "bundled": true, + "dev": true + }, + "longest": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "loose-envify": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "js-tokens": "^2.0.0" + } + }, + "lru-cache": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + }, + "md5-hex": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "md5-o-matic": "^0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "merge-source-map": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "source-map": "^0.5.3" + } + }, + "micromatch": { + "version": "2.3.11", + "bundled": true, + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "minimatch": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "0.7.2", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + }, + "preserve": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "randomatic": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "requires": { + "is-number": "^2.0.2", + "kind-of": "^3.0.2" + } + }, + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "regenerator-runtime": { + "version": "0.9.6", + "bundled": true, + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "bundled": true, + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3", + "is-primitive": "^2.0.0" + } + }, + "repeat-element": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true, + "dev": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.5.4", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "source-map": { + "version": "0.5.6", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "^1.3.3", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.3.3", + "signal-exit": "^2.0.0", + "which": "^1.2.4" + }, + "dependencies": { + "signal-exit": { + "version": "2.1.2", + "bundled": true, + "dev": true + } + } + }, + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "spdx-license-ids": "^1.0.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "to-fast-properties": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uglify-js": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "bundled": true, + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "which": { + "version": "1.2.12", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^1.1.1" + } + }, + "which-module": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "3.2.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "window-size": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "yargs-parser": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "only-shallow": { + "version": "1.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/only-shallow/-/only-shallow-1.2.0.tgz", + "integrity": "sha1-cc7O26kyS8BRiu8Q7AgNMkncJGU=", + "dev": true + }, + "opener": { + "version": "1.5.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/opener/-/opener-1.5.1.tgz", + "integrity": "sha1-bS8Od/GgrwAyrKcWwsH7uOfoq+0=", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-homedir": { + "version": "1.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/os-homedir/-/os-homedir-1.0.1.tgz", + "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "1.18.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha1-aCPnxZAAF7S9Os9G/prEtNe9qeo=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/progress/-/progress-2.0.3.tgz", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha1-DjUW3Qt5BPQT0tQZPc5GGMOmias=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "qs": "~6.3.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1", + "uuid": "^3.0.0" + } + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/semver/-/semver-5.7.0.tgz", + "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stack-utils": { + "version": "0.4.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/stack-utils/-/stack-utils-0.4.0.tgz", + "integrity": "sha1-lAy4L8z6hOj/Lz/fKT/ngBa+zNE=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "table": { + "version": "4.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/table/-/table-4.0.2.tgz", + "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=", + "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "tap": { + "version": "8.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tap/-/tap-8.0.1.tgz", + "integrity": "sha1-GxvqZDhiAT6Py3FK6wigNBjU+i4=", + "dev": true, + "requires": { + "bluebird": "^3.3.1", + "clean-yaml-object": "^0.1.0", + "color-support": "^1.1.0", + "coveralls": "^2.11.2", + "deeper": "^2.1.0", + "foreground-child": "^1.3.3", + "glob": "^7.0.0", + "isexe": "^1.0.0", + "js-yaml": "^3.3.1", + "nyc": "^9.0.1", + "only-shallow": "^1.0.2", + "opener": "^1.4.1", + "os-homedir": "1.0.1", + "readable-stream": "^2.0.2", + "signal-exit": "^3.0.0", + "stack-utils": "^0.4.0", + "tap-mocha-reporter": "^2.0.0", + "tap-parser": "^2.2.0", + "tmatch": "^3.0.0" + }, + "dependencies": { + "isexe": { + "version": "1.1.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", + "dev": true + } + } + }, + "tap-mocha-reporter": { + "version": "2.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tap-mocha-reporter/-/tap-mocha-reporter-2.0.1.tgz", + "integrity": "sha1-xwMWFz1uOhbFjhupLV1s2N5YoS4=", + "dev": true, + "requires": { + "color-support": "^1.1.0", + "debug": "^2.1.3", + "diff": "^1.3.2", + "escape-string-regexp": "^1.0.3", + "glob": "^7.0.5", + "js-yaml": "^3.3.1", + "readable-stream": "^2.1.5", + "tap-parser": "^2.0.0", + "unicode-length": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "tap-parser": { + "version": "2.2.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tap-parser/-/tap-parser-2.2.3.tgz", + "integrity": "sha1-rebpbje/04zg8WLaBn80A08GiwE=", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "js-yaml": "^3.2.7", + "readable-stream": "^2" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmatch": { + "version": "3.1.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tmatch/-/tmatch-3.1.0.tgz", + "integrity": "sha1-cBJk/XWC0BRKgMha8zWMyiacceM=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", + "dev": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha1-HL9h0F1rliaSROtqO85L2RTg8Aw=", + "dev": true + }, + "unicode-length": { + "version": "1.0.3", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/unicode-length/-/unicode-length-1.0.3.tgz", + "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", + "dev": true, + "requires": { + "punycode": "^1.3.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/which/-/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } +} diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index 4317f1f4..79d1ab0e 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -852,3 +852,19 @@ tap.test("should respect when maxWaitingClients is set to 0 ", function(t) { t.end(); }); }); + +tap.test("should provide a way to wait until the pool is ready", function(t) { + const resourceFactory = new ResourceFactory(); + const config = { + min: 2, + max: 4 + }; + + const pool = createPool(resourceFactory, config); + + pool.ready() + .then(() => { + t.equal(pool.min, 2) + t.end() + }) +}) From b556e617aab7c8bf794384c8b9d3422759852ed7 Mon Sep 17 00:00:00 2001 From: Idan Attias Date: Thu, 25 Jul 2019 17:27:40 +0300 Subject: [PATCH 53/73] support waiting until the pool is ready --- lib/Pool.js | 20 ++++++++++++++++++++ test/generic-pool-test.js | 14 ++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index addb080e..83a793c7 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -624,6 +624,26 @@ class Pool extends EventEmitter { }); } + /** + * Waits until the pool is ready. + * We define ready by checking if the current resource number is at least + * the minimum number defined. + * @returns {Promise} that resolves when the minimum number is ready. + */ + ready() { + return new Promise(resolve => { + const isReady = () => { + if (this.available >= this.min) { + resolve(); + } else { + setTimeout(isReady, 100); + } + }; + + isReady(); + }); + } + /** * How many resources are available to allocated * (includes resources that have not been tested and may faul validation) diff --git a/test/generic-pool-test.js b/test/generic-pool-test.js index 79d1ab0e..baaddfbb 100644 --- a/test/generic-pool-test.js +++ b/test/generic-pool-test.js @@ -862,9 +862,11 @@ tap.test("should provide a way to wait until the pool is ready", function(t) { const pool = createPool(resourceFactory, config); - pool.ready() - .then(() => { - t.equal(pool.min, 2) - t.end() - }) -}) + pool.ready().then(() => { + t.ok( + pool.available >= config.min, + "expected available resources to be at least as the minimum" + ); + t.end(); + }); +}); From ce198bbd0584ed7ae998f80062350110837f8d08 Mon Sep 17 00:00:00 2001 From: Idan Attias Date: Thu, 25 Jul 2019 17:30:36 +0300 Subject: [PATCH 54/73] respect passed Promise override --- lib/Pool.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index 83a793c7..afc2580c 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -631,7 +631,7 @@ class Pool extends EventEmitter { * @returns {Promise} that resolves when the minimum number is ready. */ ready() { - return new Promise(resolve => { + return new this._Promise(resolve => { const isReady = () => { if (this.available >= this.min) { resolve(); From 10a57183cb6d6123bd9baed8cf28c27da0b20f65 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Tue, 17 Sep 2019 20:24:26 +0200 Subject: [PATCH 55/73] Pass priority as second parameter --- lib/Pool.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Pool.js b/lib/Pool.js index addb080e..9f043add 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -464,8 +464,8 @@ class Pool extends EventEmitter { * @param {Function} fn [a function that accepts a resource and returns a promise that resolves/rejects once it has finished using the resource] * @return {Promise} [resolves once the resource is released to the pool] */ - use(fn) { - return this.acquire().then(resource => { + use(fn, priority) { + return this.acquire(priority).then(resource => { return fn(resource).then( result => { this.release(resource); From b3676adc8d0fd50d9b744b84bedab3f0c5047dd0 Mon Sep 17 00:00:00 2001 From: Rajesh kumar Date: Tue, 15 Dec 2020 18:33:54 +0530 Subject: [PATCH 56/73] Add architecture ppc64le to travis build Add architecture ppc64le to travis build --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index d5d90191..afea0147 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,7 @@ language: node_js +arch: + - amd64 + - ppc64le node_js: - "6" - "8" From 0c6a7aad8c2e08dc32162efb4b99937797ebc2ba Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Sat, 27 Feb 2021 10:34:09 +0100 Subject: [PATCH 57/73] docs: add priority --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3bf5fc84..e87eb6b6 100644 --- a/README.md +++ b/README.md @@ -250,6 +250,7 @@ This method handles acquiring a `resource` from the pool, handing it to your fun `use` takes one required argument: - `fn`: a function that accepts a `resource` and returns a `Promise`. Once that promise `resolve`s the `resource` is returned to the pool, else if it `reject`s then the resource is destroyed. +- `priority`: Optionally, you can specify the priority as number. See [Priority Queueing](#priority-queueing) section. and returns a `Promise` that either `resolve`s with the value from the user supplied `fn` or `reject`s with an error. From 633c65550af11b9c51be02d7a3143be988087b33 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Sat, 27 Feb 2021 18:11:52 +0100 Subject: [PATCH 58/73] 3.7.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e3b85eb5..25e6bf99 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.7.1", + "version": "3.7.2", "author": "James Cooper ", "contributors": [ { From 8505f405236a7802998044543cc8ed8e5b9d90ea Mon Sep 17 00:00:00 2001 From: Idan Attias Date: Mon, 5 Apr 2021 10:58:09 +0300 Subject: [PATCH 59/73] Delete package-lock.json --- package-lock.json | 3245 --------------------------------------------- 1 file changed, 3245 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 61421227..00000000 --- a/package-lock.json +++ /dev/null @@ -1,3245 +0,0 @@ -{ - "name": "generic-pool", - "version": "3.7.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "8.10.51", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/@types/node/-/node-8.10.51.tgz", - "integrity": "sha1-gGAIV8Ckeo6Lr8La5trtbbWONic=", - "dev": true - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha1-Z6ojG/iBKXS4UjWpZ3Hra9B+onk=", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha1-qNCv1zJR7/u9X+OEp31zADwXpx8=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", - "dev": true - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", - "dev": true - }, - "clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/commander/-/commander-2.20.0.tgz", - "integrity": "sha1-1YuytcHuj4ew00ACfp6U4iLFpCI=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "coveralls": { - "version": "2.13.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/coveralls/-/coveralls-2.13.3.tgz", - "integrity": "sha1-mtfCrlJ0F/Nh6LYmSD9I7pLdK8c=", - "dev": true, - "requires": { - "js-yaml": "3.6.1", - "lcov-parse": "0.0.10", - "log-driver": "1.2.5", - "minimist": "1.2.0", - "request": "2.79.0" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "js-yaml": { - "version": "3.6.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deeper": { - "version": "2.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/deeper/-/deeper-2.1.0.tgz", - "integrity": "sha1-vFZOX3MXT98gHgiwADDooU2nQ2g=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "diff": { - "version": "1.4.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha1-MtHWU+HZBAiFS/spbwdux+GGowA=", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - } - }, - "eslint-config-prettier": { - "version": "2.10.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz", - "integrity": "sha1-7Ae8HQH4fQn2HThA0RLcipeR4ws=", - "dev": true, - "requires": { - "get-stdin": "^5.0.1" - } - }, - "eslint-plugin-prettier": { - "version": "2.7.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz", - "integrity": "sha1-tDEtzywdllN51/nVtfiqrcakWQQ=", - "dev": true, - "requires": { - "fast-diff": "^1.1.1", - "jest-docblock": "^21.0.0" - } - }, - "eslint-plugin-promise": { - "version": "3.8.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", - "integrity": "sha1-ZevyeoRePB6db2pWIt3TgBaUtiE=", - "dev": true - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha1-u1ByANPRf2AkdjYWC0gmKEsQhTU=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0=", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/espree/-/espree-3.5.4.tgz", - "integrity": "sha1-sPRHGHyKi+2US4FaZgvd9d610ac=", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "events-to-array": { - "version": "1.1.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/extend/-/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", - "dev": true - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha1-c+4RmC2Gyq95WYKNUZz+kn+sXwM=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha1-LC73dSXMKSkAff/6HdMUqpyd7m8=", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha1-8GlhdpDBDIaOc7hGV0Z2T5fDR58=", - "dev": true, - "requires": { - "is-property": "^1.0.2" - } - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - } - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/glob/-/glob-7.1.4.tgz", - "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/globals/-/globals-11.12.0.tgz", - "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", - "dev": true - }, - "graceful-fs": { - "version": "4.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha1-jY/cc5d8sEEEchy1NmbBymTNMos=", - "dev": true - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ=", - "dev": true - }, - "is-my-json-valid": { - "version": "2.20.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", - "integrity": "sha1-E0Wm/KPo2u/BDQ+ncGf1TO2v1Zo=", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jest-docblock": { - "version": "21.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/jest-docblock/-/jest-docblock-21.2.0.tgz", - "integrity": "sha1-UVKcOzDV/RWdpgwnzu3Blfr41BQ=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/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": "4.17.15", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", - "dev": true - }, - "log-driver": { - "version": "1.2.5", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nyc": { - "version": "9.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/nyc/-/nyc-9.0.1.tgz", - "integrity": "sha1-gnde1cfyc0WVosXnxk9dcZmQTbA=", - "dev": true, - "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^1.0.0", - "convert-source-map": "^1.3.0", - "default-require-extensions": "^1.0.0", - "find-cache-dir": "^0.1.1", - "find-up": "^1.1.2", - "foreground-child": "^1.5.3", - "glob": "^7.0.6", - "istanbul-lib-coverage": "^1.0.0", - "istanbul-lib-hook": "^1.0.0-alpha.4", - "istanbul-lib-instrument": "^1.3.0", - "istanbul-lib-report": "^1.0.0-alpha.3", - "istanbul-lib-source-maps": "^1.1.0", - "istanbul-reports": "^1.0.0", - "md5-hex": "^1.2.0", - "merge-source-map": "^1.0.2", - "micromatch": "^2.3.11", - "mkdirp": "^0.5.0", - "resolve-from": "^2.0.0", - "rimraf": "^2.5.4", - "signal-exit": "^3.0.1", - "spawn-wrap": "^1.2.4", - "test-exclude": "^3.2.2", - "yargs": "^6.4.0", - "yargs-parser": "^4.0.2" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "ansi-regex": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "0.3.0", - "bundled": true, - "dev": true - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "async": { - "version": "1.5.2", - "bundled": true, - "dev": true - }, - "babel-code-frame": { - "version": "6.16.0", - "bundled": true, - "dev": true, - "requires": { - "chalk": "^1.1.0", - "esutils": "^2.0.2", - "js-tokens": "^2.0.0" - } - }, - "babel-generator": { - "version": "6.18.0", - "bundled": true, - "dev": true, - "requires": { - "babel-messages": "^6.8.0", - "babel-runtime": "^6.9.0", - "babel-types": "^6.18.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.2.0", - "source-map": "^0.5.0" - } - }, - "babel-messages": { - "version": "6.8.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "^6.0.0" - } - }, - "babel-runtime": { - "version": "6.18.0", - "bundled": true, - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.9.5" - } - }, - "babel-template": { - "version": "6.16.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "^6.9.0", - "babel-traverse": "^6.16.0", - "babel-types": "^6.16.0", - "babylon": "^6.11.0", - "lodash": "^4.2.0" - } - }, - "babel-traverse": { - "version": "6.18.0", - "bundled": true, - "dev": true, - "requires": { - "babel-code-frame": "^6.16.0", - "babel-messages": "^6.8.0", - "babel-runtime": "^6.9.0", - "babel-types": "^6.18.0", - "babylon": "^6.11.0", - "debug": "^2.2.0", - "globals": "^9.0.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - } - }, - "babel-types": { - "version": "6.18.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "^6.9.1", - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^1.0.1" - } - }, - "babylon": { - "version": "6.13.1", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.6", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "bundled": true, - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "caching-transform": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" - } - }, - "camelcase": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chalk": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cliui": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "core-js": { - "version": "2.4.1", - "bundled": true, - "dev": true - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - } - }, - "detect-indent": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "error-ex": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "esutils": { - "version": "2.0.2", - "bundled": true, - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "bundled": true, - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "bundled": true, - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "filename-regex": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "bundled": true, - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "find-cache-dir": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "for-in": { - "version": "0.1.6", - "bundled": true, - "dev": true - }, - "for-own": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "for-in": "^0.1.5" - } - }, - "foreground-child": { - "version": "1.5.3", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "glob": { - "version": "7.1.1", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "bundled": true, - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "globals": { - "version": "9.13.0", - "bundled": true, - "dev": true - }, - "graceful-fs": { - "version": "4.1.10", - "bundled": true, - "dev": true - }, - "handlebars": { - "version": "4.0.6", - "bundled": true, - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "bundled": true, - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "2.1.5", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invariant": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-buffer": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-dotfile": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "isobject": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.0.0-alpha.4", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^0.3.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.13.0", - "istanbul-lib-coverage": "^1.0.0", - "semver": "^5.3.0" - } - }, - "istanbul-lib-report": { - "version": "1.0.0-alpha.3", - "bundled": true, - "dev": true, - "requires": { - "async": "^1.4.2", - "istanbul-lib-coverage": "^1.0.0-alpha", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "rimraf": "^2.4.3", - "supports-color": "^3.1.2" - }, - "dependencies": { - "supports-color": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^1.0.0-alpha.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.4.4", - "source-map": "^0.5.3" - } - }, - "istanbul-reports": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "^4.0.3" - } - }, - "js-tokens": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.0", - "bundled": true, - "dev": true - }, - "longest": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "loose-envify": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "js-tokens": "^2.0.0" - } - }, - "lru-cache": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "md5-hex": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "merge-source-map": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "source-map": "^0.5.3" - } - }, - "micromatch": { - "version": "2.3.11", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "minimatch": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "0.7.2", - "bundled": true, - "dev": true - }, - "normalize-package-data": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-glob": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - }, - "preserve": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "randomatic": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "requires": { - "is-number": "^2.0.2", - "kind-of": "^3.0.2" - } - }, - "read-pkg": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "regenerator-runtime": { - "version": "0.9.6", - "bundled": true, - "dev": true - }, - "regex-cache": { - "version": "0.4.3", - "bundled": true, - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3", - "is-primitive": "^2.0.0" - } - }, - "repeat-element": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "bundled": true, - "dev": true - }, - "repeating": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve-from": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "right-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.5.4", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "slide": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "source-map": { - "version": "0.5.6", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.3.3", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.3.3", - "signal-exit": "^2.0.0", - "which": "^1.2.4" - }, - "dependencies": { - "signal-exit": { - "version": "2.1.2", - "bundled": true, - "dev": true - } - } - }, - "spdx-correct": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "supports-color": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^2.3.11", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - } - }, - "to-fast-properties": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uglify-js": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "bundled": true, - "dev": true, - "optional": true - }, - "yargs": { - "version": "3.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - } - }, - "which": { - "version": "1.2.12", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^1.1.1" - } - }, - "which-module": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "window-size": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "y18n": { - "version": "3.2.1", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "3.2.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "window-size": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "yargs-parser": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "yargs-parser": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "bundled": true, - "dev": true - } - } - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "only-shallow": { - "version": "1.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/only-shallow/-/only-shallow-1.2.0.tgz", - "integrity": "sha1-cc7O26kyS8BRiu8Q7AgNMkncJGU=", - "dev": true - }, - "opener": { - "version": "1.5.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/opener/-/opener-1.5.1.tgz", - "integrity": "sha1-bS8Od/GgrwAyrKcWwsH7uOfoq+0=", - "dev": true - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-homedir": { - "version": "1.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prettier": { - "version": "1.18.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/prettier/-/prettier-1.18.2.tgz", - "integrity": "sha1-aCPnxZAAF7S9Os9G/prEtNe9qeo=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/progress/-/progress-2.0.3.tgz", - "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.3.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha1-DjUW3Qt5BPQT0tQZPc5GGMOmias=", - "dev": true - }, - "request": { - "version": "2.79.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "qs": "~6.3.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1", - "uuid": "^3.0.0" - } - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/semver/-/semver-5.7.0.tgz", - "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "stack-utils": { - "version": "0.4.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/stack-utils/-/stack-utils-0.4.0.tgz", - "integrity": "sha1-lAy4L8z6hOj/Lz/fKT/ngBa+zNE=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "table": { - "version": "4.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/table/-/table-4.0.2.tgz", - "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=", - "dev": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "tap": { - "version": "8.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tap/-/tap-8.0.1.tgz", - "integrity": "sha1-GxvqZDhiAT6Py3FK6wigNBjU+i4=", - "dev": true, - "requires": { - "bluebird": "^3.3.1", - "clean-yaml-object": "^0.1.0", - "color-support": "^1.1.0", - "coveralls": "^2.11.2", - "deeper": "^2.1.0", - "foreground-child": "^1.3.3", - "glob": "^7.0.0", - "isexe": "^1.0.0", - "js-yaml": "^3.3.1", - "nyc": "^9.0.1", - "only-shallow": "^1.0.2", - "opener": "^1.4.1", - "os-homedir": "1.0.1", - "readable-stream": "^2.0.2", - "signal-exit": "^3.0.0", - "stack-utils": "^0.4.0", - "tap-mocha-reporter": "^2.0.0", - "tap-parser": "^2.2.0", - "tmatch": "^3.0.0" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - }, - "tap-mocha-reporter": { - "version": "2.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tap-mocha-reporter/-/tap-mocha-reporter-2.0.1.tgz", - "integrity": "sha1-xwMWFz1uOhbFjhupLV1s2N5YoS4=", - "dev": true, - "requires": { - "color-support": "^1.1.0", - "debug": "^2.1.3", - "diff": "^1.3.2", - "escape-string-regexp": "^1.0.3", - "glob": "^7.0.5", - "js-yaml": "^3.3.1", - "readable-stream": "^2.1.5", - "tap-parser": "^2.0.0", - "unicode-length": "^1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "tap-parser": { - "version": "2.2.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tap-parser/-/tap-parser-2.2.3.tgz", - "integrity": "sha1-rebpbje/04zg8WLaBn80A08GiwE=", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "readable-stream": "^2" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmatch": { - "version": "3.1.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tmatch/-/tmatch-3.1.0.tgz", - "integrity": "sha1-cBJk/XWC0BRKgMha8zWMyiacceM=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", - "dev": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "2.9.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha1-HL9h0F1rliaSROtqO85L2RTg8Aw=", - "dev": true - }, - "unicode-length": { - "version": "1.0.3", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/unicode-length/-/unicode-length-1.0.3.tgz", - "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", - "dev": true, - "requires": { - "punycode": "^1.3.2", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://repo.dev.wixpress.com/artifactory/api/npm/npm-repos/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } -} From 30bc347f5cf3d643df64e7785f2a9294de206897 Mon Sep 17 00:00:00 2001 From: Idan Attias Date: Mon, 5 Apr 2021 11:55:29 +0300 Subject: [PATCH 60/73] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 3bf5fc84..6e2c8051 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,14 @@ pool.start() If `autostart` is `false` then this method can be used to start the pool and therefore begin creation of resources, start the evictor, and any other internal logic. +### pool.ready + +```js +pool.ready() +``` + +Waits for the pool to fully start. + ### pool.use ```js From f1ae0f109500e406c96cdce6be1713970629903b Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Mon, 5 Apr 2021 12:08:26 +0200 Subject: [PATCH 61/73] 3.7.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 25e6bf99..bcc3cba0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.7.2", + "version": "3.7.8", "author": "James Cooper ", "contributors": [ { From ea53332c314a951d511e16dc9168122087eee05f Mon Sep 17 00:00:00 2001 From: Stephen Cresswell <229672+cressie176@users.noreply.github.com> Date: Sun, 11 Jul 2021 11:58:12 +0100 Subject: [PATCH 62/73] Add destroyTimeoutMillis option --- README.md | 1 + lib/Pool.js | 13 ++++- lib/PoolDefaults.js | 1 + lib/PoolOptions.js | 8 +++ test/generic-pool-destroytimeout-test.js | 74 ++++++++++++++++++++++++ 5 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 test/generic-pool-destroytimeout-test.js diff --git a/README.md b/README.md index 7f2ca452..9a3850d9 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,7 @@ An optional object/dictionary with the any of the following properties: - `maxWaitingClients`: maximum number of queued requests allowed, additional `acquire` calls will be callback with an `err` in a future cycle of the event loop. - `testOnBorrow`: `boolean`: should the pool validate resources before giving them to clients. Requires that `factory.validate` is specified. - `acquireTimeoutMillis`: max milliseconds an `acquire` call will wait for a resource before timing out. (default no limit), if supplied should non-zero positive integer. +- `destroyTimeoutMillis`: max milliseconds a `destroy` call will wait for a resource before timing out. (default no limit), if supplied should non-zero positive integer. - `fifo` : if true the oldest resources will be first to be allocated. If false the most recently released resources will be the first to be allocated. This in effect turns the pool's behaviour from a queue into a stack. `boolean`, (default true) - `priorityRange`: int between 1 and x - if set, borrowers can specify their relative priority in the queue if no resources are available. see example. (default 1) diff --git a/lib/Pool.js b/lib/Pool.js index db0c62d8..5a661bef 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -135,7 +135,9 @@ class Pool extends EventEmitter { this._allObjects.delete(pooledResource); // NOTE: this maybe very bad promise usage? const destroyPromise = this._factory.destroy(pooledResource.obj); - const wrappedDestroyPromise = this._Promise.resolve(destroyPromise); + const wrappedDestroyPromise = this._config.destroyTimeoutMillis + ? this._Promise.resolve(this._applyDestroyTimeout(destroyPromise)) + : this._Promise.resolve(destroyPromise); this._trackOperation( wrappedDestroyPromise, @@ -148,6 +150,15 @@ class Pool extends EventEmitter { this._ensureMinimum(); } + _applyDestroyTimeout(promise) { + const timeoutPromise = new this._Promise((resolve, reject) => { + setTimeout(() => { + reject(new Error("destroy timed out")); + }, this._config.destroyTimeoutMillis).unref(); + }); + return this._Promise.race([timeoutPromise, promise]); + } + /** * Attempt to move an available resource into test and then onto a waiting client * @return {Boolean} could we move an available resource into test diff --git a/lib/PoolDefaults.js b/lib/PoolDefaults.js index 34b36068..56d004c3 100644 --- a/lib/PoolDefaults.js +++ b/lib/PoolDefaults.js @@ -21,6 +21,7 @@ class PoolDefaults { // FIXME: no defaults! this.acquireTimeoutMillis = null; + this.destroyTimeoutMillis = null; this.maxWaitingClients = null; this.min = null; diff --git a/lib/PoolOptions.js b/lib/PoolOptions.js index 3ac3189b..f355948b 100644 --- a/lib/PoolOptions.js +++ b/lib/PoolOptions.js @@ -24,6 +24,9 @@ class PoolOptions { * @param {Number} [opts.acquireTimeoutMillis=null] * Delay in milliseconds after which the an `acquire` call will fail. optional. * Default: undefined. Should be positive and non-zero + * @param {Number} [opts.destroyTimeoutMillis=null] + * Delay in milliseconds after which the an `destroy` call will fail, causing it to emit a factoryDestroyError event. optional. + * Default: undefined. Should be positive and non-zero * @param {Number} [opts.priorityRange=1] * The range from 1 to be treated as a valid priority * @param {Boolean} [opts.fifo=true] @@ -72,6 +75,11 @@ class PoolOptions { this.acquireTimeoutMillis = parseInt(opts.acquireTimeoutMillis, 10); } + if (opts.destroyTimeoutMillis) { + // @ts-ignore + this.destroyTimeoutMillis = parseInt(opts.destroyTimeoutMillis, 10); + } + if (opts.maxWaitingClients !== undefined) { // @ts-ignore this.maxWaitingClients = parseInt(opts.maxWaitingClients, 10); diff --git a/test/generic-pool-destroytimeout-test.js b/test/generic-pool-destroytimeout-test.js new file mode 100644 index 00000000..b3fe6a5c --- /dev/null +++ b/test/generic-pool-destroytimeout-test.js @@ -0,0 +1,74 @@ +"use strict"; + +const tap = require("tap"); +const createPool = require("../").createPool; + +tap.test("destroyTimeout handles timed out destroy calls", function(t) { + const factory = { + create: function() { + return Promise.resolve({}); + }, + destroy: function() { + return new Promise(function(resolve) { + setTimeout(function() { + resolve(); + }, 100); + }); + } + }; + const config = { + destroyTimeoutMillis: 20 + }; + + const pool = createPool(factory, config); + + pool + .acquire() + .then(function(resource) { + pool.destroy(resource); + return new Promise(function(resolve, reject) { + pool.on("factoryDestroyError", function(err) { + t.match(err, /destroy timed out/); + resolve(); + }); + }); + }) + .then(t.end) + .catch(t.error); +}); + +tap.test("destroyTimeout handles non timed out destroy calls", function(t) { + const myResource = {}; + const factory = { + create: function() { + return Promise.resolve({}); + }, + destroy: function() { + return new Promise(function(resolve) { + setTimeout(function() { + resolve(); + }, 10); + }); + } + }; + + const config = { + destroyTimeoutMillis: 400 + }; + + const pool = createPool(factory, config); + + pool + .acquire() + .then(function(resource) { + pool.destroy(resource); + return new Promise(function(resolve) { + pool.on("factoryDestroyError", function(err) { + t.fail("wooops"); + }); + setTimeout(resolve, 20); + }); + }) + .then(t.end) + .catch(t.error); +}); From a9926ba20e4bc0802ba47478a3101e1b7451ccee Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Mon, 12 Jul 2021 23:12:10 +0200 Subject: [PATCH 63/73] 3.8.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bcc3cba0..809fa421 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.7.8", + "version": "3.8.0", "author": "James Cooper ", "contributors": [ { From e559098802c15b96532f8731e96e3c7568552609 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Mon, 12 Jul 2021 23:20:06 +0200 Subject: [PATCH 64/73] 3.8.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 809fa421..ab631dea 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", - "version": "3.8.0", + "version": "3.8.1", "author": "James Cooper ", "contributors": [ { From 667f97f4a91005441c5af3b6dce08fc769c74765 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Mon, 12 Jul 2021 23:25:58 +0200 Subject: [PATCH 65/73] chore: add contributors --- package.json | 260 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 234 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index ab631dea..e725a83e 100644 --- a/package.json +++ b/package.json @@ -1,68 +1,271 @@ { "name": "generic-pool", "description": "Generic resource pooling for Node.JS", + "homepage": "https://github.com/coopernurse/node-pool#readme", "version": "3.8.1", - "author": "James Cooper ", + "main": "index.js", + "author": { + "email": "james@bitmechanic.com", + "name": "James Cooper" + }, "contributors": [ + { + "name": "James Butler", + "email": "james.butler@sandfox.co.uk" + }, { "name": "James Cooper", "email": "james@bitmechanic.com" }, { - "name": "Peter Galiba", - "email": "poetro@poetro.hu", - "url": "http://poetro.hu/" + "name": "Kiko Beats", + "email": "josefrancisco.verdu@gmail.com" }, { - "name": "Gary Dusbabek" + "name": "Felipe Machado", + "email": "felipou@gmail.com" }, { - "name": "Tom MacWright", - "url": "http://www.developmentseed.org/" + "name": "Idan Attias", + "email": "idana@wix.com" }, { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com", - "url": "http://somethingdoug.com/" + "name": "Bryan Donovan", + "email": "bdondo@gmail.com" }, { - "name": "calibr" + "name": "rebareba", + "email": "forcdc1990@gmail.com" }, { - "name": "Justin Robinson", - "email": "jrobinson@redventures.com>" + "name": "Thomas Dimson", + "email": "tdimson@gmail.com" }, { - "name": "Nayana Hettiarachchi", - "email": "nayana@corp-gems.com" + "name": "C-h-e-r-r-y", + "email": "C-h-e-r-r-y@users.noreply.github.com" }, { - "name": "Felipe Machado", - "email": "felipou@gmail.com" + "name": "t3hmrman", + "email": "t3hmrman@gmail.com" + }, + { + "name": "Kevin Burke", + "email": "burke@shyp.com" + }, + { + "name": "Peter Galiba", + "email": "poetro@poetro.hu" + }, + { + "name": "Joe Z", + "email": "jzarate@gmail.com" + }, + { + "name": "Anup Baldawa", + "email": "anup@joinhoney.com" + }, + { + "name": "travis4all", + "email": "travis4all@diamon.dz" + }, + { + "name": "windyrobin", + "email": "windyrobin@Gmail.com" + }, + { + "name": "Nayana Hettiarachchi", + "email": "nayana@corp-gems.com" }, { "name": "Felix Becker", "email": "felix.b@outlook.com" }, { - "name": "sandfox", - "email": "james.butler@sandfox.co.uk" + "name": "Geovani de Souza", + "email": "geovanisouza92@gmail.com" + }, + { + "name": "Ryan Dao", + "email": "ddao@paypal.com" + }, + { + "name": "Sushant", + "email": "sushantdhiman@outlook.com" + }, + { + "name": "Jemila", + "email": "jemila.abulhawa@gmail.com" + }, + { + "name": "Christian d'Heureuse", + "email": "chdh@inventec.ch" + }, + { + "name": "Will Shaver", + "email": "will.shaver@emberex.com" + }, + { + "name": "Justin Robinson", + "email": "jrobinson@redventures.com" + }, + { + "name": "Diego Rodríguez Baquero", + "email": "diegorbaquero@gmail.com" + }, + { + "name": "Asbjørn Sannes", + "email": "asbjorn.sannes@interhost.no" + }, + { + "name": "linchuang", + "email": "linchuang@tencent.com" + }, + { + "name": "restjohn", + "email": "restjohn@users.noreply.github.com" + }, + { + "name": "san00", + "email": "c5d59d07@opayq.com" + }, + { + "name": "王秋石", + "email": "12qiushi@163.com" + }, + { + "name": "An Nguyen Le", + "email": "nguyenan169@gmail.com" + }, + { + "name": "Arek Flinik", + "email": "aflinik@gmail.com" + }, + { + "name": "Bryan Kaplan", + "email": "bryan@pinchit.com" }, { - "name": "Lewis J Ellis", - "email": "me@lewisjellis.com" + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Drew R", + "email": "drewrathbone@gmail.com" + }, + { + "name": "Dumitru Uzun", + "email": "contact@duzun.me" + }, + { + "name": "Jason Rhodes", + "email": "jason.matthew.rhodes@gmail.com" + }, + { + "name": "John Dooley", + "email": "john.j.dooley@gmail.com" + }, + { + "name": "Lewis Ellis", + "email": "lewis@getsentry.com" + }, + { + "name": "Louis Roché", + "email": "mail+github@louisroche.net" + }, + { + "name": "Magnus Eide", + "email": "eide@iterate.no" + }, + { + "name": "Mike Morris", + "email": "mikemorris@users.noreply.github.com" + }, + { + "name": "Piotr", + "email": "pwalc@agora.pl" + }, + { + "name": "Rajesh kumar", + "email": "zazzel.cvs@gmail.com" + }, + { + "name": "Randall Leeds", + "email": "randall.leeds@gmail.com" + }, + { + "name": "Roy Binux", + "email": "root@binux.me" + }, + { + "name": "Sandro Santilli", + "email": "strk@keybit.net" + }, + { + "name": "Stephen Cresswell", + "email": "229672+cressie176@users.noreply.github.com" + }, + { + "name": "Teemu Ikonen", + "email": "teemu.ikonen@iki.fi" + }, + { + "name": "Tevye Krynski", + "email": "tevye@mog.com" + }, + { + "name": "Thom Seddon", + "email": "thom@nightworld.com" + }, + { + "name": "Thomas Watson Steen", + "email": "w@tson.dk" + }, + { + "name": "Tom MacWright", + "email": "macwright@gmail.com" + }, + { + "name": "Wilfred van der Deijl", + "email": "wilfred@vanderdeijl.com" + }, + { + "name": "Young Hahn", + "email": "young@developmentseed.org" + }, + { + "name": "benny-medflyt", + "email": "benny@medflyt.com" + }, + { + "name": "calibr", + "email": "awcalibr@gmail.com" + }, + { + "name": "gdusbabek", + "email": "gdusbabek@gmail.com" + }, + { + "name": "molipet", + "email": "molipet@gmail.com" + }, + { + "name": "Alexander Tesfamichael", + "email": "Alex.Tesfamichael@gmail.com" } ], + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/coopernurse/node-pool.git" + }, + "bugs": { + "url": "https://github.com/coopernurse/node-pool/issues" + }, "keywords": [ "pool", "pooling", "throttle" ], - "main": "index.js", - "repository": { - "type": "git", - "url": "http://github.com/coopernurse/node-pool.git" - }, "devDependencies": { "@types/node": "^8.5.1", "eslint": "^4.9.0", @@ -76,6 +279,11 @@ "engines": { "node": ">= 4" }, + "files": [ + "index.d.ts", + "index.js", + "lib" + ], "scripts": { "lint": "eslint lib test index.js .eslintrc.js", "lint-fix": "eslint --fix lib test index.js .eslintrc.js", From 9b7c65b639086897d3990036f8c83effa8cec5de Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Mon, 12 Jul 2021 23:26:33 +0200 Subject: [PATCH 66/73] 3.8.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e725a83e..5f16387c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "generic-pool", "description": "Generic resource pooling for Node.JS", "homepage": "https://github.com/coopernurse/node-pool#readme", - "version": "3.8.1", + "version": "3.8.2", "main": "index.js", "author": { "email": "james@bitmechanic.com", From 0a5ef1dd9124ea7d56626c7cc295e181c15ad4e2 Mon Sep 17 00:00:00 2001 From: Teow Hua Jun Date: Fri, 1 Jul 2022 15:55:44 +0800 Subject: [PATCH 67/73] fix: add ready function to index.d.ts --- index.d.ts | 63 +++++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/index.d.ts b/index.d.ts index 44daab80..475e0602 100644 --- a/index.d.ts +++ b/index.d.ts @@ -7,44 +7,45 @@ import { EventEmitter } from "events"; export class Pool extends EventEmitter { - spareResourceCapacity: number; - size: number; - available: number; - borrowed: number; - pending: number; - max: number; - min: number; + spareResourceCapacity: number; + size: number; + available: number; + borrowed: number; + pending: number; + max: number; + min: number; - start(): void; - acquire(priority?: number): Promise; - release(resource: T): Promise; - destroy(resource: T): Promise; - drain(): Promise; - clear(): Promise; - use(cb: (resource: T) => U | Promise): Promise; - isBorrowedResource(resource: T): boolean; + start(): void; + acquire(priority?: number): Promise; + release(resource: T): Promise; + destroy(resource: T): Promise; + drain(): Promise; + clear(): Promise; + use(cb: (resource: T) => U | Promise): Promise; + isBorrowedResource(resource: T): boolean; + ready(): Promise; } export interface Factory { - create(): Promise; - destroy(client: T): Promise; - validate?(client: T): Promise; + create(): Promise; + destroy(client: T): Promise; + validate?(client: T): Promise; } export interface Options { - max?: number; - min?: number; - maxWaitingClients?: number; - testOnBorrow?: boolean; - testOnReturn?: boolean; - acquireTimeoutMillis?: number; - fifo?: boolean; - priorityRange?: number; - autostart?: boolean; - evictionRunIntervalMillis?: number; - numTestsPerEvictionRun?: number; - softIdleTimeoutMillis?: number; - idleTimeoutMillis?: number; + max?: number; + min?: number; + maxWaitingClients?: number; + testOnBorrow?: boolean; + testOnReturn?: boolean; + acquireTimeoutMillis?: number; + fifo?: boolean; + priorityRange?: number; + autostart?: boolean; + evictionRunIntervalMillis?: number; + numTestsPerEvictionRun?: number; + softIdleTimeoutMillis?: number; + idleTimeoutMillis?: number; } export function createPool(factory: Factory, opts?: Options): Pool; From 99a2eb592bf548c525db67c2fc7b848e1dd45d3f Mon Sep 17 00:00:00 2001 From: Teow Hua Jun Date: Fri, 1 Jul 2022 16:01:17 +0800 Subject: [PATCH 68/73] lint --- index.d.ts | 66 +++++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/index.d.ts b/index.d.ts index 475e0602..551cd4f4 100644 --- a/index.d.ts +++ b/index.d.ts @@ -7,45 +7,45 @@ import { EventEmitter } from "events"; export class Pool extends EventEmitter { - spareResourceCapacity: number; - size: number; - available: number; - borrowed: number; - pending: number; - max: number; - min: number; + spareResourceCapacity: number; + size: number; + available: number; + borrowed: number; + pending: number; + max: number; + min: number; - start(): void; - acquire(priority?: number): Promise; - release(resource: T): Promise; - destroy(resource: T): Promise; - drain(): Promise; - clear(): Promise; - use(cb: (resource: T) => U | Promise): Promise; - isBorrowedResource(resource: T): boolean; - ready(): Promise; + start(): void; + acquire(priority?: number): Promise; + release(resource: T): Promise; + destroy(resource: T): Promise; + drain(): Promise; + clear(): Promise; + use(cb: (resource: T) => U | Promise): Promise; + isBorrowedResource(resource: T): boolean; + ready(): Promise; } export interface Factory { - create(): Promise; - destroy(client: T): Promise; - validate?(client: T): Promise; + create(): Promise; + destroy(client: T): Promise; + validate?(client: T): Promise; } export interface Options { - max?: number; - min?: number; - maxWaitingClients?: number; - testOnBorrow?: boolean; - testOnReturn?: boolean; - acquireTimeoutMillis?: number; - fifo?: boolean; - priorityRange?: number; - autostart?: boolean; - evictionRunIntervalMillis?: number; - numTestsPerEvictionRun?: number; - softIdleTimeoutMillis?: number; - idleTimeoutMillis?: number; + max?: number; + min?: number; + maxWaitingClients?: number; + testOnBorrow?: boolean; + testOnReturn?: boolean; + acquireTimeoutMillis?: number; + fifo?: boolean; + priorityRange?: number; + autostart?: boolean; + evictionRunIntervalMillis?: number; + numTestsPerEvictionRun?: number; + softIdleTimeoutMillis?: number; + idleTimeoutMillis?: number; } -export function createPool(factory: Factory, opts?: Options): Pool; +export function createPool(factory: Factory, opts?: Options): Pool; \ No newline at end of file From 7d588796bd73f713caeb4197117b520dcaffec2e Mon Sep 17 00:00:00 2001 From: Teow Hua Jun Date: Fri, 1 Jul 2022 17:53:06 +0800 Subject: [PATCH 69/73] chore: newline --- index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index 551cd4f4..8b4bae85 100644 --- a/index.d.ts +++ b/index.d.ts @@ -48,4 +48,4 @@ export interface Options { idleTimeoutMillis?: number; } -export function createPool(factory: Factory, opts?: Options): Pool; \ No newline at end of file +export function createPool(factory: Factory, opts?: Options): Pool; From e94fd374266acb1531b986050ba7486b03b18250 Mon Sep 17 00:00:00 2001 From: Yanlong Wang Date: Wed, 3 Aug 2022 18:26:33 +0800 Subject: [PATCH 70/73] fix: unref setTimeout in pool As a library don't block the process quit. Simply `unref` all the `setTimeout`s. --- lib/Pool.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Pool.js b/lib/Pool.js index 0a006dda..d0140528 100644 --- a/lib/Pool.js +++ b/lib/Pool.js @@ -402,7 +402,7 @@ class Pool extends EventEmitter { this._scheduledEviction = setTimeout(() => { this._evict(); this._scheduleEvictorRun(); - }, this._config.evictionRunIntervalMillis); + }, this._config.evictionRunIntervalMillis).unref(); } } From 89080aea76252728aeabd28d36ef3e2e77fc950b Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Sat, 10 Sep 2022 08:53:41 +0200 Subject: [PATCH 71/73] chore(release): 3.9.0 --- CHANGELOG.md | 12 +++- package.json | 170 ++++++++++++++++++++++++++------------------------- 2 files changed, 98 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9000f331..500ba7f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ -# Change Log +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [3.9.0](https://github.com/coopernurse/node-pool/compare/v3.8.2...v3.9.0) (2022-09-10) + + +### Bug Fixes + +* add ready function to index.d.ts ([0a5ef1d](https://github.com/coopernurse/node-pool/commit/0a5ef1dd9124ea7d56626c7cc295e181c15ad4e2)) +* unref setTimeout in pool ([e94fd37](https://github.com/coopernurse/node-pool/commit/e94fd374266acb1531b986050ba7486b03b18250)) ## [3.7.1] - March 28 2019 - fix #257 - `pool.use` now destroys resources on rejection, matching the docs. diff --git a/package.json b/package.json index 5f16387c..a4fa922d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "generic-pool", "description": "Generic resource pooling for Node.JS", "homepage": "https://github.com/coopernurse/node-pool#readme", - "version": "3.8.2", + "version": "3.9.0", "main": "index.js", "author": { "email": "james@bitmechanic.com", @@ -13,10 +13,6 @@ "name": "James Butler", "email": "james.butler@sandfox.co.uk" }, - { - "name": "James Cooper", - "email": "james@bitmechanic.com" - }, { "name": "Kiko Beats", "email": "josefrancisco.verdu@gmail.com" @@ -33,118 +29,138 @@ "name": "Bryan Donovan", "email": "bdondo@gmail.com" }, + { + "name": "C-h-e-r-r-y", + "email": "C-h-e-r-r-y@users.noreply.github.com" + }, { "name": "rebareba", "email": "forcdc1990@gmail.com" }, { - "name": "Thomas Dimson", - "email": "tdimson@gmail.com" + "name": "t3hmrman", + "email": "t3hmrman@gmail.com" }, { - "name": "C-h-e-r-r-y", - "email": "C-h-e-r-r-y@users.noreply.github.com" + "name": "Thomas Dimson", + "email": "tdimson@gmail.com" }, { - "name": "t3hmrman", - "email": "t3hmrman@gmail.com" + "name": "Anup Baldawa", + "email": "anup@joinhoney.com" }, { "name": "Kevin Burke", "email": "burke@shyp.com" }, { - "name": "Peter Galiba", - "email": "poetro@poetro.hu" + "name": "Teow Hua Jun", + "email": "huajun@Teows-MacBook-Pro.local" }, { "name": "Joe Z", "email": "jzarate@gmail.com" }, { - "name": "Anup Baldawa", - "email": "anup@joinhoney.com" + "name": "Peter Galiba", + "email": "poetro@poetro.hu" }, { - "name": "travis4all", - "email": "travis4all@diamon.dz" + "name": "Asbjørn Sannes", + "email": "asbjorn.sannes@interhost.no" }, { - "name": "windyrobin", - "email": "windyrobin@Gmail.com" + "name": "san00", + "email": "c5d59d07@opayq.com" }, { - "name": "Nayana Hettiarachchi", - "email": "nayana@corp-gems.com" + "name": "Christian d'Heureuse", + "email": "chdh@inventec.ch" }, { - "name": "Felix Becker", - "email": "felix.b@outlook.com" + "name": "Ryan Dao", + "email": "ddao@paypal.com" }, { - "name": "Geovani de Souza", - "email": "geovanisouza92@gmail.com" + "name": "Diego Rodríguez Baquero", + "email": "diegorbaquero@gmail.com" }, { - "name": "Ryan Dao", - "email": "ddao@paypal.com" + "name": "Felix Becker", + "email": "felix.b@outlook.com" }, { - "name": "Sushant", - "email": "sushantdhiman@outlook.com" + "name": "Geovani de Souza", + "email": "geovanisouza92@gmail.com" }, { "name": "Jemila", "email": "jemila.abulhawa@gmail.com" }, { - "name": "Christian d'Heureuse", - "email": "chdh@inventec.ch" + "name": "Justin Robinson", + "email": "jrobinson@redventures.com" }, { - "name": "Will Shaver", - "email": "will.shaver@emberex.com" + "name": "linchuang", + "email": "linchuang@tencent.com" }, { - "name": "Justin Robinson", - "email": "jrobinson@redventures.com" + "name": "Nayana Hettiarachchi", + "email": "nayana@corp-gems.com" }, { - "name": "Diego Rodríguez Baquero", - "email": "diegorbaquero@gmail.com" + "name": "restjohn", + "email": "restjohn@users.noreply.github.com" }, { - "name": "Asbjørn Sannes", - "email": "asbjorn.sannes@interhost.no" + "name": "Sushant", + "email": "sushantdhiman@outlook.com" }, { - "name": "linchuang", - "email": "linchuang@tencent.com" + "name": "travis4all", + "email": "travis4all@diamon.dz" }, { - "name": "restjohn", - "email": "restjohn@users.noreply.github.com" + "name": "Will Shaver", + "email": "will.shaver@emberex.com" }, { - "name": "san00", - "email": "c5d59d07@opayq.com" + "name": "windyrobin", + "email": "windyrobin@Gmail.com" }, { "name": "王秋石", "email": "12qiushi@163.com" }, { - "name": "An Nguyen Le", - "email": "nguyenan169@gmail.com" + "name": "Stephen Cresswell", + "email": "229672+cressie176@users.noreply.github.com" }, { "name": "Arek Flinik", "email": "aflinik@gmail.com" }, + { + "name": "Alexander Tesfamichael", + "email": "Alex.Tesfamichael@gmail.com" + }, + { + "name": "calibr", + "email": "awcalibr@gmail.com" + }, + { + "name": "benny-medflyt", + "email": "benny@medflyt.com" + }, { "name": "Bryan Kaplan", "email": "bryan@pinchit.com" }, + { + "name": "Dumitru Uzun", + "email": "contact@duzun.me" + }, { "name": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com" @@ -154,8 +170,12 @@ "email": "drewrathbone@gmail.com" }, { - "name": "Dumitru Uzun", - "email": "contact@duzun.me" + "name": "Magnus Eide", + "email": "eide@iterate.no" + }, + { + "name": "gdusbabek", + "email": "gdusbabek@gmail.com" }, { "name": "Jason Rhodes", @@ -170,24 +190,28 @@ "email": "lewis@getsentry.com" }, { - "name": "Louis Roché", - "email": "mail+github@louisroche.net" + "name": "Tom MacWright", + "email": "macwright@gmail.com" }, { - "name": "Magnus Eide", - "email": "eide@iterate.no" + "name": "Louis Roché", + "email": "mail+github@louisroche.net" }, { "name": "Mike Morris", "email": "mikemorris@users.noreply.github.com" }, { - "name": "Piotr", - "email": "pwalc@agora.pl" + "name": "molipet", + "email": "molipet@gmail.com" }, { - "name": "Rajesh kumar", - "email": "zazzel.cvs@gmail.com" + "name": "An Nguyen Le", + "email": "nguyenan169@gmail.com" + }, + { + "name": "Piotr", + "email": "pwalc@agora.pl" }, { "name": "Randall Leeds", @@ -201,10 +225,6 @@ "name": "Sandro Santilli", "email": "strk@keybit.net" }, - { - "name": "Stephen Cresswell", - "email": "229672+cressie176@users.noreply.github.com" - }, { "name": "Teemu Ikonen", "email": "teemu.ikonen@iki.fi" @@ -221,37 +241,21 @@ "name": "Thomas Watson Steen", "email": "w@tson.dk" }, - { - "name": "Tom MacWright", - "email": "macwright@gmail.com" - }, { "name": "Wilfred van der Deijl", "email": "wilfred@vanderdeijl.com" }, { - "name": "Young Hahn", - "email": "young@developmentseed.org" - }, - { - "name": "benny-medflyt", - "email": "benny@medflyt.com" - }, - { - "name": "calibr", - "email": "awcalibr@gmail.com" - }, - { - "name": "gdusbabek", - "email": "gdusbabek@gmail.com" + "name": "Yanlong Wang", + "email": "yanlong.wang@naiver.org" }, { - "name": "molipet", - "email": "molipet@gmail.com" + "name": "Young Hahn", + "email": "young@developmentseed.org" }, { - "name": "Alexander Tesfamichael", - "email": "Alex.Tesfamichael@gmail.com" + "name": "Rajesh kumar", + "email": "zazzel.cvs@gmail.com" } ], "repository": { From 9dc5569f5bb44071befeda3c83b8ed8e199c1dfc Mon Sep 17 00:00:00 2001 From: Regev Brody Date: Sun, 2 Oct 2022 15:35:55 +0300 Subject: [PATCH 72/73] add missing types --- index.d.ts | 214 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 180 insertions(+), 34 deletions(-) diff --git a/index.d.ts b/index.d.ts index 8b4bae85..88465cf4 100644 --- a/index.d.ts +++ b/index.d.ts @@ -6,46 +6,192 @@ import { EventEmitter } from "events"; -export class Pool extends EventEmitter { - spareResourceCapacity: number; - size: number; - available: number; - borrowed: number; - pending: number; - max: number; - min: number; - - start(): void; - acquire(priority?: number): Promise; - release(resource: T): Promise; - destroy(resource: T): Promise; - drain(): Promise; - clear(): Promise; - use(cb: (resource: T) => U | Promise): Promise; - isBorrowedResource(resource: T): boolean; - ready(): Promise; +export class Deferred { + get state(): 'PENDING' | 'FULFILLED' | 'REJECTED'; + + get promise(): Promise; + + reject(reason: any): void; + + resolve(value: T): void; +} + +export class ResourceRequest extends Deferred { + setTimeout(delay: number): void; + + removeTimeout(): void; +} + +export enum PooledResourceStateEnum { + ALLOCATED = 'ALLOCATED', + IDLE = 'IDLE', + INVALID = 'INVALID', + RETURNING = 'RETURNING', + VALIDATION = 'VALIDATION', +} + +export class PooledResource { + creationTime: number; + lastReturnTime?: number; + lastBorrowTime?: number; + lastIdleTime?: number; + obj: T; + state: PooledResourceStateEnum; + + allocate(): void; + + deallocate(): void; + + invalidate(): void; + + test(): void; + + idle(): void; + + returning(): void; +} + +export interface IDeque extends Iterable { + shift(): T | undefined; + + unshift(element: T): void; + + push(element: T): void; + + pop(): T | undefined; + + get head(): T | undefined; + + get tail(): T | undefined; + + get length(): number; + + iterator(): Iterator; + + reverseIterator(): Iterator; +} + +export class Deque implements IDeque { + shift(): T | undefined; + + unshift(element: T): void; + + push(element: T): void; + + pop(): T | undefined; + + get head(): T | undefined; + + get tail(): T | undefined; + + get length(): number; + + iterator(): Iterator; + + reverseIterator(): Iterator; + + [Symbol.iterator](): Iterator; +} + +export interface IPriorityQueue { + get length(): number; + + enqueue(obj: T, priority?: number): void; + + dequeue(): T | undefined; + + get head(): T | undefined; + + get tail(): T | undefined; +} + +export class PriorityQueue implements IPriorityQueue { + constructor(priorityRange: number); + + get length(): number; + + enqueue(obj: T, priority?: number): void; + + dequeue(): T | undefined; + + get head(): T | undefined; + + get tail(): T | undefined; +} + +export interface IEvictorConfig { + softIdleTimeoutMillis: number; + idleTimeoutMillis: number; + min: number; +} + +export interface IEvictor { + evict(config: IEvictorConfig, pooledResource: PooledResource, availableObjectsCount: number): boolean; +} + +export class DefaultEvictor implements IEvictor { + evict(config: IEvictorConfig, pooledResource: PooledResource, availableObjectsCount: number): boolean; } export interface Factory { - create(): Promise; - destroy(client: T): Promise; - validate?(client: T): Promise; + create(): Promise; + + destroy(client: T): Promise; + + validate?(client: T): Promise; } export interface Options { - max?: number; - min?: number; - maxWaitingClients?: number; - testOnBorrow?: boolean; - testOnReturn?: boolean; - acquireTimeoutMillis?: number; - fifo?: boolean; - priorityRange?: number; - autostart?: boolean; - evictionRunIntervalMillis?: number; - numTestsPerEvictionRun?: number; - softIdleTimeoutMillis?: number; - idleTimeoutMillis?: number; + max?: number; + min?: number; + maxWaitingClients?: number; + testOnBorrow?: boolean; + testOnReturn?: boolean; + acquireTimeoutMillis?: number; + destroyTimeoutMillis?: number; + fifo?: boolean; + priorityRange?: number; + autostart?: boolean; + evictionRunIntervalMillis?: number; + numTestsPerEvictionRun?: number; + softIdleTimeoutMillis?: number; + idleTimeoutMillis?: number; +} + +export class Pool extends EventEmitter { + spareResourceCapacity: number; + size: number; + available: number; + borrowed: number; + pending: number; + max: number; + min: number; + + constructor( + Evictor: { new (): IEvictor }, + Deque: { new (): IDeque> }, + PriorityQueue: { new (priorityRange: number): IPriorityQueue> }, + factory: Factory, + options?: Options, + ); + + start(): void; + + acquire(priority?: number): Promise; + + release(resource: T): Promise; + + destroy(resource: T): Promise; + + drain(): Promise; + + clear(): Promise; + + use(cb: (resource: T) => U | Promise): Promise; + + isBorrowedResource(resource: T): boolean; + + ready(): Promise; } export function createPool(factory: Factory, opts?: Options): Pool; From 348b6845ac7ea9fb7e39195a436f0ff75ee2ec5f Mon Sep 17 00:00:00 2001 From: Regev Brody Date: Sun, 2 Oct 2022 18:47:33 +0300 Subject: [PATCH 73/73] Update index.d.ts --- index.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index 88465cf4..2c02bade 100644 --- a/index.d.ts +++ b/index.d.ts @@ -146,7 +146,6 @@ export interface Options { min?: number; maxWaitingClients?: number; testOnBorrow?: boolean; - testOnReturn?: boolean; acquireTimeoutMillis?: number; destroyTimeoutMillis?: number; fifo?: boolean;