diff --git a/index.js b/index.js index c517baa..9f1baed 100644 --- a/index.js +++ b/index.js @@ -8,6 +8,7 @@ const pipe = require("@promistream/pipe"); const sequentialize = require("@promistream/sequentialize"); const defaultValue = require("default-value"); const debug = require("debug")("promistream:parallelize"); +const debugListener = require("debug")("promistream:parallelize:queue-listener"); const createPromiseListener = require("./promise-listener"); @@ -18,17 +19,23 @@ module.exports = function parallelizeStream(threadCount, options = {}) { /* TODO: Does this need a more efficient FIFO queue implementation? */ let signals = []; - let storedErrors = []; let queueListener = createPromiseListener(); let parallelMode = true; let filling = false; let currentSource = null; + function stopFilling() { + debug(`Paused internal queue fill (parallel mode = ${parallelMode}, thread count = ${threadCount}, in-flight requests = ${signals.length})`); + filling = false; + } + function fillRequest() { if (parallelMode === true && signals.length < threadCount) { return Promise.try(() => { return currentSource.peek(); }).then((valueAvailable) => { + debug(`Result of upstream peek: ${valueAvailable}`); + if (valueAvailable) { queueRead(); @@ -38,17 +45,22 @@ module.exports = function parallelizeStream(threadCount, options = {}) { } }); } else { - debug(`Paused internal queue fill (parallel mode = ${parallelMode}, thread count = ${threadCount}, in-flight requests = ${signals.length})`); - filling = false; + stopFilling(); } } function tryStartFilling() { if (!filling) { - debug("Starting internal queue fill..."); - filling = true; - - return fillRequest(currentSource); + Promise.try(() => { + debug("Starting internal queue fill..."); + filling = true; + + return fillRequest(currentSource); + }).catch((err) => { + debugListener("Rejecting", err); + queueListener.reject(err); + debug(`Error occurred during filling: ${err.stack}`); + }); } } @@ -62,6 +74,8 @@ module.exports = function parallelizeStream(threadCount, options = {}) { function switchToSequentialMode() { debug("Switching to sequential mode"); parallelMode = false; + + return stopFilling(); } function bufferNotEmpty() { @@ -102,6 +116,7 @@ module.exports = function parallelizeStream(threadCount, options = {}) { debug("Waiting for queue to be non-empty..."); return Promise.try(() => { + debugListener("Listening..."); return queueListener.listen(); }).tap(() => { debug("Got queue-filled notification"); @@ -128,6 +143,7 @@ module.exports = function parallelizeStream(threadCount, options = {}) { }) }); + debugListener("Resolving"); queueListener.resolve(); } @@ -142,6 +158,7 @@ module.exports = function parallelizeStream(threadCount, options = {}) { return Promise.race(signals.map((item) => item.trackingPromise)); } }).then((signalObject) => { + debug("A read attempt completed!"); let resultPromise = signalObject.promise; signals = signals.filter((signal) => (signal.object !== signalObject)); @@ -170,57 +187,50 @@ module.exports = function parallelizeStream(threadCount, options = {}) { _promistreamVersion: 0, description: `parallelize (${threadCount} threads)`, abort: propagateAbort, - peek: function (source) { - return Promise.try(() => { - debug("Processing peek..."); + peek: async function (source) { + debug("Processing peek..."); - if (bufferNotEmpty()) { - return true; + if (bufferNotEmpty()) { + return true; + } else { + if (parallelMode === true) { + return source.peek(); } else { - if (parallelMode === true) { - return source.peek(); - } else { - return false; - } + return false; } - }); + } }, read: function (source) { return Promise.try(() => { debug("Processing read..."); currentSource = source; - if (storedErrors.length > 0) { - throw storedErrors.shift(); - } else { - if (parallelMode) { - /* This runs in the background, potentially perpetually */ - Promise.try(() => { - return tryStartFilling(); - }).catch((err) => { - queueListener.reject(err); - debug(`Error occurred during filling: ${err.stack}`); - // storedErrors.push(err); - }); + if (parallelMode) { + /* This runs in the background, potentially perpetually */ + tryStartFilling(); + return awaitResult(); + } else { + /* Sequential mode */ + if (signals.length > 0) { + /* Clear out the remaining in-flight reads from the previous parallel-mode operation, first. */ + debug(`Awaiting in-flight read... (in-flight reads = ${signals.length})`); return awaitResult(); } else { - /* Sequential mode */ - if (signals.length > 0) { - /* Clear out the remaining in-flight reads from the previous parallel-mode operation, first. */ - return awaitResult(); - } else { - debug("Passing through read to upstream..."); - - return Promise.try(() => { - return source.read(); - }).then((result) => { - switchToParallelMode(); - return result; - }); - } + debug("Passing through read to upstream..."); + + return Promise.try(() => { + return source.read(); + }).then((result) => { + switchToParallelMode(); + return result; + }); } } + }).tap(() => { + debug("Read request was satisfied with a value"); + }).tapCatch((error) => { + debug("Read request was satisfied with an error:", error.message); }); } }; diff --git a/package.json b/package.json index 021091a..89df206 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,16 @@ "@joepie91/consumable": "^1.0.1", "@promistream/is-aborted": "^0.1.1", "@promistream/is-end-of-stream": "^0.1.1", - "@promistream/pipe": "^0.1.4", + "@promistream/pipe": "^0.1.6", "@promistream/propagate-abort": "^0.1.2", "@promistream/sequentialize": "^0.1.0", "bluebird": "^3.5.4", "debug": "^4.1.1", "default-value": "^1.0.0" + }, + "devDependencies": { + "@promistream/collect": "^0.1.1", + "@promistream/map": "^0.1.1", + "@promistream/range-numbers": "^0.1.2" } } diff --git a/yarn.lock b/yarn.lock index 4a1728f..3f90035 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,25 +2,65 @@ # yarn lockfile v1 +"@joepie91/consumable@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@joepie91/consumable/-/consumable-1.0.1.tgz#fd223a481b89b43bfe98687bd7f7ce586826f832" + integrity sha512-LUOoJmFAJ6ocqymtVUiADFvx7T+EFQsfsY6LAOvYBKHlxpWQ/LiQGAi/k5tzATxXpH4/vLC4C9ttRl09/g+HRw== + "@joepie91/unreachable@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@joepie91/unreachable/-/unreachable-1.0.0.tgz#8032bb8a5813e81bbbe516cb3031d60818526687" integrity sha512-vZRJ5UDq4mqP1vgSrcOLD3aIfS/nzwsvGFOOHv5sj5fa1Ss0dT1xnIzrXKLD9pu5EcUvF3K6n6jdaMW8uXpNEQ== +"@promistream/aborted@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@promistream/aborted/-/aborted-0.1.2.tgz#49a5c57fa346db14b7cb84e000d473e0852138c6" + integrity sha512-rLQgZTFr0r7yWtDbqA8zT5F4TKDiOiyowlAxSKiSY4XM+XVYeNq7k9SXIxVhLczjKh1Cv0nlvvZ7cZ41UjZPwQ== + dependencies: + default-value "^1.0.0" + error-chain "^0.1.0" + +"@promistream/collect@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@promistream/collect/-/collect-0.1.1.tgz#085360a66c5cab7616833542009212be34a447ff" + integrity sha512-zXnp8SFm2dFsvJBASLfYMUxfaNkvzyhU56WT1iAXxlN5w2Rb0vArP2pIXvpbiSVrWkUObNeZ8t715nGxqsWEow== + dependencies: + "@promistream/simple-sink" "^0.1.0" + +"@promistream/end-of-stream@^0.1.0", "@promistream/end-of-stream@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@promistream/end-of-stream/-/end-of-stream-0.1.2.tgz#45820c8d29353c480c0219920db95ba075396438" + integrity sha512-rOeAIkcVZW6oYox2Jc1z/00iLVx0w0cIlcD/TbR798Qg5M5/nhErtjSG08QAtuaPSxAFKNl5ipAD8HHGV5esJw== + dependencies: + default-value "^1.0.0" + error-chain "^0.1.0" + "@promistream/is-aborted@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@promistream/is-aborted/-/is-aborted-0.1.1.tgz#58d714dbd5f20bf851c77339c2213128ac50f0bf" integrity sha512-2AYo+MFu0wNKXCEDHexaFWoESiUzHfGZgWpazbdA6OyU/AJsHRfMwKzE7awmgi1u0T43k5nLwwJXIiTypajSiw== -"@promistream/is-end-of-stream@^0.1.1": +"@promistream/is-end-of-stream@^0.1.0", "@promistream/is-end-of-stream@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@promistream/is-end-of-stream/-/is-end-of-stream-0.1.1.tgz#7f84e630c9e49a92739df6a8c574eff99dd4c09d" integrity sha512-GZn7W0wrUen7kkgWCcwFFgr0g/ftfuddnuK/Tp0MLWCCJA4hyAboglCZP0JzEJdi34gClEP8lCfDwGekw18LHg== -"@promistream/pipe@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@promistream/pipe/-/pipe-0.1.4.tgz#ef05fe582a33768c7eb56ad20635e1b7b48ac95b" - integrity sha512-4js6lhu/aTNEMosIBFcCz8Rkxc1S2V4zzI2QvZp9HqglhL5UTuxnv5VbU2ZlPFAFVID1aJOurZ8KdiVagHfOCw== +"@promistream/map@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@promistream/map/-/map-0.1.1.tgz#2f771372e5d1dd12f41b6efd57874014d406f123" + integrity sha512-ggyNqWlvNXVY9Gf/pLUgbHROK8mEqu46hbpJftmN9etPr724YPhL+vxA7+9b6bBmTLAU1Tw4Th3BWG5EHVBn1g== + dependencies: + "@promistream/propagate-abort" "^0.1.2" + "@promistream/propagate-peek" "^0.1.0" + "@validatem/core" "^0.3.12" + "@validatem/is-function" "^0.1.0" + "@validatem/required" "^0.1.1" + bluebird "^3.5.4" + +"@promistream/pipe@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@promistream/pipe/-/pipe-0.1.6.tgz#fb7d930fd7011a9542502904049023fdaa87b82d" + integrity sha512-B/n4WPJ/goXALCWJYgZV0M/lLMIF5OuaqvxezJq/lcSCo9RuV82wmdJBZd+IEmc6Ykn/EYTFtUHCnRjkl56+3w== dependencies: "@validatem/allow-extra-properties" "^0.1.0" "@validatem/anything" "^0.1.0" @@ -36,6 +76,24 @@ resolved "https://registry.yarnpkg.com/@promistream/propagate-abort/-/propagate-abort-0.1.6.tgz#dfc3c78c2e22662b9e5d548afce2180c40584ef5" integrity sha512-Ap4eDFiIcLb4yuJdin2tQM1+2ZJZm78sYWkKVdqECJY0UGkwNsbaMMeYyfZpFRpJGmW8mCCuOkWs0fQl5H9DGA== +"@promistream/propagate-abort@^0.1.6": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@promistream/propagate-abort/-/propagate-abort-0.1.7.tgz#06a5af16adb433ae27b25bb38b957b01619bf9e8" + integrity sha512-BR0XZMirAjO1IRpyTtOG4n0fGuuvRGJsO8Hmn4HOJXhi10onX3GlfCNZN2tqe4Mq/5fEDgRNGNUHjCY7naDYUA== + +"@promistream/propagate-peek@^0.1.0", "@promistream/propagate-peek@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@promistream/propagate-peek/-/propagate-peek-0.1.1.tgz#c7dd69efcd894c408d7a3e9713b6a9036f70a501" + integrity sha512-4xfkSmtPQzlvL4+KCquPHX7sPXiAACGJac/y7fB3Sv6ZKXAT/cjTfms1nEjlDGn1nroN0MzReBza2HnpF59deg== + +"@promistream/range-numbers@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@promistream/range-numbers/-/range-numbers-0.1.2.tgz#2e5bbe012338eb238ee7ba469cde3ecb8a135239" + integrity sha512-yoCstn6vYhGjl0swIspyVUck3N/X8B97yODcbrCd2sqaFJoLClepIW9Fz24lZ26PHQc6pZTUrubrw+Fc7Dcvng== + dependencies: + "@promistream/end-of-stream" "^0.1.0" + "@promistream/simple-source" "^0.1.0" + "@promistream/sequentialize@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@promistream/sequentialize/-/sequentialize-0.1.0.tgz#8cab499c2518ee856fcb1e13943859ca5b77ba71" @@ -46,6 +104,38 @@ bluebird "^3.5.4" p-defer "^3.0.0" +"@promistream/simple-sink@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@promistream/simple-sink/-/simple-sink-0.1.1.tgz#e3808179102ffe4bc10d70d681f19c649e1f3811" + integrity sha512-M6dQMUIPjFTRB+xIwBMqIrPghWORoreGoNAl2F/5oshBlX6+X2F+RAeUuz6plDymwq2eoVL5pvSUR4zYdMdRjQ== + dependencies: + "@promistream/is-aborted" "^0.1.1" + "@promistream/is-end-of-stream" "^0.1.1" + "@promistream/propagate-abort" "^0.1.6" + "@promistream/propagate-peek" "^0.1.1" + "@validatem/core" "^0.3.11" + "@validatem/default-to" "^0.1.0" + "@validatem/is-function" "^0.1.0" + "@validatem/required" "^0.1.1" + "@validatem/wrap-value-as-option" "^0.1.0" + bluebird "^3.5.4" + +"@promistream/simple-source@^0.1.0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@promistream/simple-source/-/simple-source-0.1.4.tgz#a0029040660cd577e51eede1978b49b04b1e5ed0" + integrity sha512-dMAVpcX2WC40IVMA6zvSAcgwxXjDVj4QIQzOyDdXgOnKjCRnGPhtUvK2ST5Jiw8/lVpEYx0bviqgezttU3IaFg== + dependencies: + "@joepie91/unreachable" "^1.0.0" + "@promistream/aborted" "^0.1.1" + "@promistream/end-of-stream" "^0.1.1" + "@promistream/is-end-of-stream" "^0.1.0" + "@validatem/core" "^0.3.12" + "@validatem/is-function" "^0.1.0" + "@validatem/required" "^0.1.1" + "@validatem/wrap-value-as-option" "^0.1.0" + bluebird "^3.7.2" + error-chain "^0.1.0" + "@validatem/allow-extra-properties@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@validatem/allow-extra-properties/-/allow-extra-properties-0.1.0.tgz#e8c434818d6fd74b8cb237cfaa4d548295de13c1" @@ -92,7 +182,7 @@ resolved "https://registry.yarnpkg.com/@validatem/combinator/-/combinator-0.1.2.tgz#eab893d55f1643b9c6857eaf6ff7ed2a728e89ff" integrity sha512-vE8t1tNXknmN62FlN6LxQmA2c6TwVKZ+fl/Wit3H2unFdOhu7SZj2kRPGjAXdK/ARh/3svYfUBeD75pea0j1Sw== -"@validatem/core@^0.3.15": +"@validatem/core@^0.3.10", "@validatem/core@^0.3.11", "@validatem/core@^0.3.12", "@validatem/core@^0.3.15": version "0.3.15" resolved "https://registry.yarnpkg.com/@validatem/core/-/core-0.3.15.tgz#645a0734dbc6efa3a5c39c62c5f2d8fa773f89f3" integrity sha512-4nBLGzgpPrPsZ5DDXDXwL5p+GUEvpAFt6I3/YUHoah+ckYmKNh9qwmWKkFZHxJVdRrTewGFRj0FPw5fqje1yxA== @@ -118,11 +208,43 @@ supports-color "^7.1.0" syncpipe "^1.0.0" +"@validatem/default-to@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@validatem/default-to/-/default-to-0.1.0.tgz#62766a3ca24d2f61a96c713bcb629a5b3c6427c5" + integrity sha512-UE/mJ6ZcHFlBLUhX75PQHDRYf80GFFhB+vZfIcsEWduh7Nm6lTMDnCPj4MI+jd9E/A7HV5D1yCZhaRSwoWo4vg== + dependencies: + is-callable "^1.1.5" + +"@validatem/dynamic@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@validatem/dynamic/-/dynamic-0.1.2.tgz#70e4b238631328874f03ffa1f062f41b71512230" + integrity sha512-TNZMUO9McL2kFYdLWTYSD+zxxZ9fbK9Si+3X5u/JngOWAq7PFxbU7o2oxREkwiSIZi5cjBCK/hvrZMWyl+FWEA== + dependencies: + "@validatem/combinator" "^0.1.1" + +"@validatem/either@^0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@validatem/either/-/either-0.1.9.tgz#0d753ef8fe04486d2b7122de3dd3ac51b3acaacf" + integrity sha512-cUqlRjy02qDcZ166/D6duk8lrtqrHynHuSakU0TvMGMBiLzjWpMJ+3beAWHe+kILB5/dlXVyc68ZIjSNhBi8Kw== + dependencies: + "@validatem/combinator" "^0.1.1" + "@validatem/error" "^1.0.0" + "@validatem/match-validation-error" "^0.1.0" + "@validatem/validation-result" "^0.1.2" + flatten "^1.0.3" + "@validatem/error@^1.0.0", "@validatem/error@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@validatem/error/-/error-1.1.0.tgz#bef46e7066c39761b494ebe3eec2ecdc7348f4ed" integrity sha512-gZJEoZq1COi/8/5v0fVKQ9uX54x5lb5HbV7mzIOhY6dqjmLNfxdQmpECZPQrCAOpcRkRMJ7zaFhq4UTslpY9yA== +"@validatem/forbidden@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@validatem/forbidden/-/forbidden-0.1.0.tgz#f96a5ac38e322a411eb74c9be1458f80e30348a0" + integrity sha512-5GpgXt33z15oXZJwd+BKzEcX56YrU1Ysqe3NM20L9OzuSCJYbWU6xR6mMHkYVfF3TDLfkC8csOiKG2UnduCLhw== + dependencies: + "@validatem/error" "^1.0.0" + "@validatem/has-shape@^0.1.0": version "0.1.8" resolved "https://registry.yarnpkg.com/@validatem/has-shape/-/has-shape-0.1.8.tgz#dff0f0449c12b96d150091b7a980154d810ae63d" @@ -145,7 +267,23 @@ dependencies: "@validatem/error" "^1.0.0" -"@validatem/is-plain-object@^0.1.0": +"@validatem/is-boolean@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@validatem/is-boolean/-/is-boolean-0.1.1.tgz#b7fafd4143ab6d23bca597c86d8c4e0ba6f6cacf" + integrity sha512-eIFq+mCBEDgAp4ezaPn1mbVZd2H+IkQG3CcEFnLSlqfg1XKY5uv8AOI08+UqeWS+C7AIFk3rEqRg63+OuPCpsg== + dependencies: + "@validatem/error" "^1.0.0" + is-boolean-object "^1.0.1" + +"@validatem/is-function@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@validatem/is-function/-/is-function-0.1.0.tgz#15a2e95259dc5e32256e8c21872455661437d069" + integrity sha512-UtVrwTGhaIdIJ0mPG5XkAmYZUeWgRoMP1G9ZEHbKvAZJ4+SXf/prC0jPgE0pw+sPjdQG4hblsXSfo/9Bf3PGdQ== + dependencies: + "@validatem/error" "^1.0.0" + is-callable "^1.1.5" + +"@validatem/is-plain-object@^0.1.0", "@validatem/is-plain-object@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@validatem/is-plain-object/-/is-plain-object-0.1.1.tgz#b7a3ef8ef960882c7c41e84ed709fa0bfb932e93" integrity sha512-aNGbNIbKRpYI0lRBczlTBbiA+nqN52ADAASdySKg2/QeSCVtYS4uOIeCNIJRAgXe/5sUnLTuL4pgq628uAl7Kw== @@ -153,6 +291,14 @@ "@validatem/error" "^1.0.0" is-plain-obj "^2.1.0" +"@validatem/is-string@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@validatem/is-string/-/is-string-0.1.1.tgz#0710d8cebedd4d6861b4a8c63d7803ed6d2f9d6c" + integrity sha512-iyRVYRPgRt2ZlWyc7pzN1WkO6apzE8at39XQa4WUr8qRPfJn12V4khS9MumWbZs8N2qqajrxMigB2LJUCKOCRg== + dependencies: + "@validatem/error" "^1.0.0" + is-string "^1.0.5" + "@validatem/match-special@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@validatem/match-special/-/match-special-0.1.0.tgz#4e0c28f1aee5bf53c1ef30bbf8c755d4946ae0ff" @@ -188,6 +334,13 @@ flatten "^1.0.3" is-plain-obj "^2.1.0" +"@validatem/one-of@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@validatem/one-of/-/one-of-0.1.1.tgz#df40f6d2780021b8557b640b99c7b217bda10b95" + integrity sha512-lIgxnkNRouPx5Ydddi8OaAxmzp1ox44OJnrJPRrJkU4ccz9Yb7GSJ+wQJNVkAZCar+DGTDMoXoy51NwDnsf4sw== + dependencies: + "@validatem/error" "^1.0.0" + "@validatem/remove-nullish-items@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@validatem/remove-nullish-items/-/remove-nullish-items-0.1.0.tgz#fe1a8b64d11276b506fae2bd2c41da4985a5b5ff" @@ -217,6 +370,19 @@ dependencies: "@validatem/combinator" "^0.1.1" +"@validatem/wrap-error@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@validatem/wrap-error/-/wrap-error-0.1.3.tgz#2470d24c17325ad97d852a21be6c0227da908d3c" + integrity sha512-86ANJACPGbH8jD/C/tUTZNgQh9xCePUKq4wf5ZRcwOvtIDaZO98FI9cdoT2/zS1CzQCp3VWlwz16YT6FNjJJJA== + dependencies: + "@validatem/combinator" "^0.1.1" + "@validatem/error" "^1.0.0" + "@validatem/match-validation-error" "^0.1.0" + "@validatem/validation-result" "^0.1.2" + as-expression "^1.0.0" + default-value "^1.0.0" + split-filter-n "^1.1.2" + "@validatem/wrap-error@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@validatem/wrap-error/-/wrap-error-0.3.0.tgz#f8d170e79b6fdd68321d82c60581ad345be7d6b9" @@ -230,6 +396,21 @@ default-value "^1.0.0" split-filter-n "^1.1.2" +"@validatem/wrap-value-as-option@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@validatem/wrap-value-as-option/-/wrap-value-as-option-0.1.0.tgz#57fa8d535f6cdf40cf8c8846ad45f4dd68f44568" + integrity sha512-gWDkfyU0DOsbinE9iqvRSJ+NxuynChyueJsC+AFm3EYbe8+s7V2gRs3qkJ4mq7hOlUbEh8tgCWQfZZvr+IdVFw== + dependencies: + "@validatem/either" "^0.1.9" + "@validatem/is-plain-object" "^0.1.1" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -250,7 +431,12 @@ bluebird@^3.5.4: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== -call-bind@^1.0.0: +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -258,6 +444,15 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.2" +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + clone-regexp@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" @@ -265,6 +460,18 @@ clone-regexp@^2.1.0: dependencies: is-regexp "^2.0.0" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + create-error@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23" @@ -284,11 +491,39 @@ default-value@^1.0.0: dependencies: es6-promise-try "0.0.1" +error-chain@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/error-chain/-/error-chain-0.1.3.tgz#5575bdeca295224f6301123bb85b52a79547bdcd" + integrity sha512-Hx/Yd7w6ku+bTIGzPxdgKAoZSADCf4EnM9CEcIyr75vw/FH/wbZ23YnKKv7ZQB80F4s7ZSVJ/9UPXk03SQsACQ== + dependencies: + "@validatem/allow-extra-properties" "^0.1.0" + "@validatem/core" "^0.3.10" + "@validatem/default-to" "^0.1.0" + "@validatem/dynamic" "^0.1.2" + "@validatem/error" "^1.1.0" + "@validatem/forbidden" "^0.1.0" + "@validatem/is-boolean" "^0.1.1" + "@validatem/is-function" "^0.1.0" + "@validatem/is-plain-object" "^0.1.1" + "@validatem/is-string" "^0.1.1" + "@validatem/one-of" "^0.1.1" + "@validatem/required" "^0.1.1" + "@validatem/wrap-error" "^0.1.3" + chalk "^2.4.2" + fromentries "^1.2.0" + is.object "^1.0.0" + syncpipe "^1.0.0" + es6-promise-try@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/es6-promise-try/-/es6-promise-try-0.0.1.tgz#10f140dad27459cef949973e5d21a087f7274b20" integrity sha1-EPFA2tJ0Wc75SZc+XSGgh/cnSyA= +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + execall@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" @@ -301,6 +536,11 @@ flatten@^1.0.3: resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -315,6 +555,11 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -344,6 +589,18 @@ is-arguments@^1.0.4: dependencies: call-bind "^1.0.0" +is-boolean-object@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + +is-callable@^1.1.5: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" @@ -354,6 +611,16 @@ is-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== +is-string@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + +is.object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is.object/-/is.object-1.0.0.tgz#e4f4117e9f083b35c8df5cf817ea3efb0452fdfa" + integrity sha1-5PQRfp8IOzXI31z4F+o++wRS/fo= + ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" @@ -369,6 +636,13 @@ split-filter-n@^1.1.2: resolved "https://registry.yarnpkg.com/split-filter-n/-/split-filter-n-1.1.2.tgz#268be1ec9c4d93dfb27b030c06165ac1b6f70f66" integrity sha512-+hXSQYpKe1uyXPXI4zQtAJAlaF2EzEc+BaF2goMeNL5oUD5YLqrVcpjxELJxpomXfwMCUaYLAszEbdY9gKVdHQ== +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"