commit af66cd5e42e2c022aec93b5c6a841fce3ab5b742 Author: Sven Slootweg Date: Mon Jul 20 23:53:32 2020 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/README.md b/README.md new file mode 100644 index 0000000..179608d --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ +# @ppstreams/buffer + + + + +Normally, a ppstream can only return exactly one value. A buffer stream changes this, and allows a stream to return zero-or-more values instead. + +You'll probably only need this module if you're implementing a custom (transform) stream of some sort. + +How it works: simply place a buffer stream *after* the stream whose results you want to buffer, in the pipeline. It will accept arrays of values from the previous stream, store them internally, and dispense the values *in* those arrays one at a time, whenever the next stream in the pipeline asks for a value. + +If the previous stream returns an empty array, the buffer stream will keep requesting new values from the previous stream until it gets either a non-empty array or an `EndOfStream`. This is what allows streams to return zero values. + +## Example + +In the following example, the `duplicateEven` stream always returns exactly one value at a time, even though the internal `buffer` stream *receives* arrays with two or zero values from the `map` stream before it. + +This example also demonstrates how you can create custom streams by piping together existing stream modules. + +```js +"use strict"; + +const Promise = require("bluebird"); +const pipe = require("@ppstreams/pipe"); +const rangeNumbers = require("@ppstreams/range-numbers"); +const map = require("@ppstreams/map"); +const buffer = require("@ppstreams/buffer"); +const collect = require("@ppstreams/collect"); + +function duplicateEven() { + return pipe([ + map((value) => { + if (value % 2 === 0) { + return [value, value]; + } else { + return []; + } + }), + buffer() + ]); +} + +return Promise.try(() => { + return pipe([ + rangeNumbers(0, 20), + duplicateEven(), + collect() + ]).read(); +}).then((result) => { + console.log(result); + // [ 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18 ] +}); +``` + +## API + +### buffer() + +Returns a new buffer stream. Takes no arguments. + +Stream behaviour: + +- __Reads from source:__ Zero or more times, depending on the internal buffer. +- __Consumes:__ An array of zero or more values. This stream will *only* accept arrays; any other values will result in an error. +- __Produces:__ Exactly one value, error, EndOfStream marker, or Aborted marker. +- __Throws:__ When a non-array value is consumed from the previous stream. Upstream errors are rethrown without changes. +- __Aborts:__ Never. diff --git a/example.js b/example.js new file mode 100644 index 0000000..9374457 --- /dev/null +++ b/example.js @@ -0,0 +1,32 @@ +"use strict"; + +const Promise = require("bluebird"); +const pipe = require("@ppstreams/pipe"); +const rangeNumbers = require("@ppstreams/range-numbers"); +const map = require("@ppstreams/map"); +const buffer = require("./"); +const collect = require("@ppstreams/collect"); + +function duplicateEven() { + return pipe([ + map((value) => { + if (value % 2 === 0) { + return [value, value]; + } else { + return []; + } + }), + buffer() + ]); +} + +return Promise.try(() => { + return pipe([ + rangeNumbers(0, 20), + duplicateEven(), + collect() + ]).read(); +}).then((result) => { + console.log(result); + // [ 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18 ] +}); diff --git a/index.js b/index.js new file mode 100644 index 0000000..a6d9f1a --- /dev/null +++ b/index.js @@ -0,0 +1,67 @@ +"use strict"; + +const Promise = require("bluebird"); +const propagateAbort = require("@ppstreams/propagate-abort"); +const unreachable = require("@joepie91/unreachable")("@ppstreams/buffer"); + +module.exports = function bufferStream() { + let buffer; + let bufferPeeked; + + function attemptRead(readFunc) { + return Promise.try(() => { + return readFunc(); + }).then((result) => { + if (Array.isArray(result)) { + if (result.length > 0) { + buffer = result; + bufferPeeked = result.map(() => false); + } else { + return attemptRead(readFunc); + } + } else { + throw new Error("Buffered stream produced a non-array value"); + } + }); + } + + return { + description: "buffer stream", + abort: propagateAbort, + peek: function peekValue_bufferedSourceStream(source) { + if (buffer == null) { + return source.peek(); + } else { + let unpeekedIndex = bufferPeeked.indexOf(false); + + if (unpeekedIndex > 0) { + bufferPeeked[unpeekedIndex] = true; + return true; + } else { + return source.peek(); + } + } + }, + read: function produceValue_bufferedSourceStream(source) { + return Promise.try(() => { + if (buffer == null) { + return attemptRead(source.read); + } + }).then(() => { + if (buffer != null) { + let value = buffer.shift(); + bufferPeeked.shift(); + + if (buffer.length === 0) { + buffer = null; + bufferPeeked = null; + } + + return value; + } else { + unreachable("No buffer was present"); + } + }); + } + }; +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..0ac92e4 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "@ppstreams/buffer", + "version": "0.1.0", + "main": "index.js", + "repository": "http://git.cryto.net/ppstreams/buffer.git", + "author": "Sven Slootweg ", + "license": "WTFPL OR CC0-1.0", + "dependencies": { + "@joepie91/unreachable": "^1.0.0", + "@ppstreams/propagate-abort": "^0.1.2", + "bluebird": "^3.5.4" + }, + "devDependencies": { + "@ppstreams/collect": "^0.1.0", + "@ppstreams/map": "^0.1.0", + "@ppstreams/pipe": "^0.1.0", + "@ppstreams/range-numbers": "^0.1.1" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..d470230 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,371 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@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== + +"@ppstreams/aborted@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ppstreams/aborted/-/aborted-0.1.0.tgz#0e7d89be4234403412dda522600ad991abd0c9b6" + integrity sha512-KNrfltZBVZqcTML2ix6Pg5KjKCnD0pA4hNKEYo+PX4iNfk3oaQa+ma54lvgPEhTSOB9Vq2PKdq1ekxD/UAaMMQ== + dependencies: + create-error "^0.3.1" + +"@ppstreams/collect@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ppstreams/collect/-/collect-0.1.0.tgz#b0405b8614d965eb01b2f69e3c3c2a34bac4ec04" + integrity sha512-Y+tYGI1M6CPiMPibQRK1vjsoSOb0f3WMHfMDytTBjL81WRmjNyXegHxpR8YoaAtKZRW23Xy94EdtDPBpiCxOmA== + dependencies: + "@ppstreams/simple-sink" "^0.1.0" + +"@ppstreams/end-of-stream@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ppstreams/end-of-stream/-/end-of-stream-0.1.0.tgz#fa1d3c7cbef9c2cdfdd5132a9467221826eef0b1" + integrity sha512-Fo3ljetPOuy0cV8bDtYc9vFxtRnePr4+1hy3vVmD8uxR2/oZWTgL64R91RkJSxh2FpI33X6hstnP7qEbbSQfhQ== + dependencies: + create-error "^0.3.1" + +"@ppstreams/is-aborted@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ppstreams/is-aborted/-/is-aborted-0.1.0.tgz#0beb590a663a09683898de9f335320e07cc2afd3" + integrity sha512-Y/th7e/VtLjnUUuYo/URkN+BEF9GYmUPo91kd2YS//L3wmmeeXwCy+cMuFLf1v4T3szLQqUbdX1YM6vyfXpiIg== + +"@ppstreams/is-end-of-stream@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ppstreams/is-end-of-stream/-/is-end-of-stream-0.1.0.tgz#703b0530698dc920a8fbdeea9812ef63a6fdb42c" + integrity sha512-F7J7ey5oApuH/+QD/CCotePi9ID1b5Wl1h7/IAArjL7ETDOEyHuQevsi/KXIq8kY+0YArW3F0c4QqgQujjvSnQ== + +"@ppstreams/map@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ppstreams/map/-/map-0.1.0.tgz#c951f9283ee3468a58ca7ea0d82ff879fc67a9a6" + integrity sha512-w18W1OJeOSRF7slHFRlaGowQRJcocWYpiI5qhlNDBqubACvEPUvwLzZ4Y9BMA9tFeVGitRu2nVPa74eDHW/tgA== + dependencies: + "@ppstreams/propagate-abort" "^0.1.2" + "@ppstreams/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" + +"@ppstreams/pipe@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ppstreams/pipe/-/pipe-0.1.0.tgz#52e72e15b4c8b8c59bcdbd757abfa4546ab380db" + integrity sha512-aYcQSoNS/uc1wIo+mvVCfpY8LthOHDUkhgH97wS0kWlS7kH5NDJPlTLiaphpvghhB4NgySn20OGZ3iAFa9IC2w== + +"@ppstreams/propagate-abort@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@ppstreams/propagate-abort/-/propagate-abort-0.1.2.tgz#2d0fae7b88075fb984bf15598b2a907786cd256e" + integrity sha512-YAVuJSi415hjeOPAUvnFErUZeQ2xQ/mddmPsmpRJ7RJB1DKT0ZY7IEVHO8jNKw7ebRuGm5B046X8tFcK8eLAEg== + +"@ppstreams/propagate-peek@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ppstreams/propagate-peek/-/propagate-peek-0.1.0.tgz#b8d24aa611845f64cf56b8cfd84266ce443b5f24" + integrity sha512-rX3ECnMxdD70fkEB6gQPr4aFg5bgOQ2Cks1LgFZv7Fj7qbj2SIjj1jHnhlFD1Wm6OZlcGXWuH2nbQp1hKoutkg== + +"@ppstreams/range-numbers@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@ppstreams/range-numbers/-/range-numbers-0.1.1.tgz#44cc6bbd91a443a68ef4a7a7f934a60f4d9ab41f" + integrity sha512-Vxvtl0PVyL8TpuDKrTO/B/UtrCRPU6wMhQUUcQ+I8HPnMzApGLHxpwazr7NyLZV3BjLblp9oDWDzxgYd/2zarQ== + dependencies: + "@ppstreams/end-of-stream" "^0.1.0" + "@ppstreams/simple-source" "^0.1.0" + +"@ppstreams/simple-sink@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ppstreams/simple-sink/-/simple-sink-0.1.0.tgz#add7aae3068b9130a9b74d0e840a767c8b22bd0f" + integrity sha512-JjfPW9NNZmddzX724bXeht+9COVLlmq1LqL/DmLa9r3JQ5JxhvUCHVYLEjE7ER7ab4psCwxVxkmslUPpa/7+fQ== + dependencies: + "@ppstreams/is-aborted" "^0.1.0" + "@ppstreams/is-end-of-stream" "^0.1.0" + "@ppstreams/propagate-abort" "^0.1.2" + "@ppstreams/propagate-peek" "^0.1.0" + "@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" + +"@ppstreams/simple-source@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@ppstreams/simple-source/-/simple-source-0.1.1.tgz#a8f276f2b6a27632edc0f123dc64c183414c4f9e" + integrity sha512-q0jpPZSGmld9VIhM+GmMRqwE9PXRiEJSXf3jhypf5VqiEs1JfrSNENvFeLYL/OxaF5PV+Jh0Up1hRfBWVK4+Sw== + dependencies: + "@ppstreams/aborted" "^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" + +"@validatem/annotate-errors@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@validatem/annotate-errors/-/annotate-errors-0.1.2.tgz#fa9152bb30f4f42b69496b527e38f0c31ff605a9" + integrity sha512-EuX7pzdYI/YpTmZcgdPG481Oi3elAg8JWh/LYXuE1h6MaZk3A8eP5DD33/l7EoKzrysn6y8nCsqNa1ngei562w== + dependencies: + "@validatem/match-validation-error" "^0.1.0" + +"@validatem/any-property@^0.1.0": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@validatem/any-property/-/any-property-0.1.3.tgz#fc7768c1922a8bacff9369ae48913672e5350f52" + integrity sha512-jYWxif5ff9pccu7566LIQ/4+snlApXEJUimBywzAriBgS3r4eDBbz3oZFHuiPmhxNK/NNof5YUS+L6Sk3zaMfg== + dependencies: + "@validatem/annotate-errors" "^0.1.2" + "@validatem/combinator" "^0.1.0" + "@validatem/error" "^1.0.0" + "@validatem/validation-result" "^0.1.1" + "@validatem/virtual-property" "^0.1.0" + default-value "^1.0.0" + +"@validatem/combinator@^0.1.0", "@validatem/combinator@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@validatem/combinator/-/combinator-0.1.2.tgz#eab893d55f1643b9c6857eaf6ff7ed2a728e89ff" + integrity sha512-vE8t1tNXknmN62FlN6LxQmA2c6TwVKZ+fl/Wit3H2unFdOhu7SZj2kRPGjAXdK/ARh/3svYfUBeD75pea0j1Sw== + +"@validatem/core@^0.3.11", "@validatem/core@^0.3.12": + version "0.3.12" + resolved "https://registry.yarnpkg.com/@validatem/core/-/core-0.3.12.tgz#e4e8a566850571bf55412862e88a3b06e75c8072" + integrity sha512-ngrFk6PT/pPZntpleG6q55SByongNxRk7wJhUiCihyv4yqIqqG+bNGH4wb6yW33IHefreWxkkJ53yM1Yj9srNA== + dependencies: + "@validatem/annotate-errors" "^0.1.2" + "@validatem/any-property" "^0.1.0" + "@validatem/error" "^1.0.0" + "@validatem/match-validation-error" "^0.1.0" + "@validatem/match-versioned-special" "^0.1.0" + "@validatem/match-virtual-property" "^0.1.0" + "@validatem/normalize-rules" "^0.1.0" + "@validatem/required" "^0.1.0" + "@validatem/validation-result" "^0.1.1" + "@validatem/virtual-property" "^0.1.0" + as-expression "^1.0.0" + assure-array "^1.0.0" + create-error "^0.3.1" + default-value "^1.0.0" + execall "^2.0.0" + flatten "^1.0.3" + indent-string "^4.0.0" + is-arguments "^1.0.4" + 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/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": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@validatem/error/-/error-1.1.0.tgz#bef46e7066c39761b494ebe3eec2ecdc7348f4ed" + integrity sha512-gZJEoZq1COi/8/5v0fVKQ9uX54x5lb5HbV7mzIOhY6dqjmLNfxdQmpECZPQrCAOpcRkRMJ7zaFhq4UTslpY9yA== + +"@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" + integrity sha512-x2i8toW1uraFF2Vl6WBl4CScbBeg5alrtoCKMyXbJkHf2B5QxL/ftUh2RQRcBzx6U0i7KUb8vdShcWAa+fehRQ== + dependencies: + "@validatem/annotate-errors" "^0.1.2" + "@validatem/combinator" "^0.1.0" + "@validatem/error" "^1.0.0" + "@validatem/validation-result" "^0.1.1" + array-union "^2.1.0" + as-expression "^1.0.0" + assure-array "^1.0.0" + default-value "^1.0.0" + flatten "^1.0.3" + +"@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== + dependencies: + "@validatem/error" "^1.0.0" + is-plain-obj "^2.1.0" + +"@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" + integrity sha512-TFiq9Wk/1Hoja4PK85WwNYnwBXk3+Lgoj59ZIMxm2an1qmNYp8j+BnSvkKBflba451yIn6V1laU9NJf+/NYZgw== + +"@validatem/match-validation-error@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@validatem/match-validation-error/-/match-validation-error-0.1.0.tgz#fa87f5f1836e7c1d9bf6b75b2addf0a5b21e4c1e" + integrity sha512-6akGTk7DdulOreyqDiGdikwRSixQz/AlvARSX18dcWaTFc79KxCLouL2hyoFcor9IIUhu5RTY4/i756y4T1yxA== + dependencies: + "@validatem/match-versioned-special" "^0.1.0" + +"@validatem/match-versioned-special@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@validatem/match-versioned-special/-/match-versioned-special-0.1.0.tgz#2eacc48debecdbbe7e3d02f0c0a665afaea9bedf" + integrity sha512-xoOTY0bdA2ELj+ntcDVJ8YyMEFIJpjZ4HNPL9lGcbnRFwJBhQcHUAhUpZwkMxu02zH9wkNM1FvYGHxPz40745Q== + +"@validatem/match-virtual-property@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@validatem/match-virtual-property/-/match-virtual-property-0.1.0.tgz#4de2de1075987b5f3b356d3f2bcf6c0be5b5fb83" + integrity sha512-ssd3coFgwbLuqvZftLZTy3eHN0TFST8oTS2XTViQdXJPXVoJmwEKBpFhXgwnb5Ly1CE037R/KWpjhd1TP/56kQ== + +"@validatem/normalize-rules@^0.1.0": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@validatem/normalize-rules/-/normalize-rules-0.1.3.tgz#59fd6193b1091ff97b5c723b32c9bb1fe2a9dc9c" + integrity sha512-HHPceAP2ce9NWymIZrgLCTzpdwXNRBCCB5H6ZPc5ggOrbmh4STpT83fLazleHtvYNlqgXZ4GjQOvCwrjaM+qEA== + dependencies: + "@validatem/has-shape" "^0.1.0" + "@validatem/is-plain-object" "^0.1.0" + "@validatem/match-special" "^0.1.0" + assure-array "^1.0.0" + default-value "^1.0.0" + flatten "^1.0.3" + is-plain-obj "^2.1.0" + +"@validatem/required@^0.1.0", "@validatem/required@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@validatem/required/-/required-0.1.1.tgz#64f4a87333fc5955511634036b7f8948ed269170" + integrity sha512-vI4NzLfay4RFAzp7xyU34PHb8sAo6w/3frrNh1EY9Xjnw2zxjY5oaxwmbFP1jVevBE6QQEnKogtzUHz/Zuvh6g== + +"@validatem/validation-result@^0.1.1", "@validatem/validation-result@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@validatem/validation-result/-/validation-result-0.1.2.tgz#4e75cfd87305fc78f8d05ac84921a2c99a0348e0" + integrity sha512-okmP8JarIwIgfpaVcvZGuQ1yOsLKT3Egt49Ynz6h1MAeGsP/bGHXkkXtbiWOVsk5Tzku5vDVFSrFnF+5IEHKxw== + dependencies: + default-value "^1.0.0" + +"@validatem/virtual-property@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@validatem/virtual-property/-/virtual-property-0.1.0.tgz#880540dfd149f98ecf1095d93912e34443381fe4" + integrity sha512-JUUvWtdqoSkOwlsl20oB3qFHYIL05a/TAfdY4AJcs55QeVTiX5iI1b8IoQW644sIWWooBuLv+XwoxjRsQFczlQ== + +"@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" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +as-expression@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/as-expression/-/as-expression-1.0.0.tgz#7bc620ca4cb2fe0ee90d86729bd6add33b8fd831" + integrity sha512-Iqh4GxNUfxbJdGn6b7/XMzc8m1Dz2ZHouBQ9DDTzyMRO3VPPIAXeoY/sucRxxxXKbUtzwzWZSN6jPR3zfpYHHA== + +assure-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assure-array/-/assure-array-1.0.0.tgz#4f4ad16a87659d6200a4fb7103462033d216ec1f" + integrity sha1-T0rRaodlnWIApPtxA0YgM9IW7B8= + +bluebird@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" + integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== + +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== + +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== + dependencies: + is-regexp "^2.0.0" + +create-error@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23" + integrity sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM= + +default-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-value/-/default-value-1.0.0.tgz#8c6f52a5a1193fe78fdc9f86eb71d16c9757c83a" + integrity sha1-jG9SpaEZP+eP3J+G63HRbJdXyDo= + dependencies: + es6-promise-try "0.0.1" + +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= + +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== + dependencies: + clone-regexp "^2.1.0" + +flatten@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-callable@^1.1.5: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +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" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +syncpipe@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/syncpipe/-/syncpipe-1.0.0.tgz#170340f813150bc8fcb8878b1b9c71ea0ccd3727" + integrity sha512-cdiAFTnFJRvUaNPDc2n9CqoFvtIL3+JUMJZrC3kA3FzpugHOqu0TvkgNwmnxPZ5/WjAzMcfMS3xm+AO7rg/j/w== + dependencies: + assure-array "^1.0.0"