├── .editorconfig ├── .github └── workflows │ └── build.yml ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── prottle.d.ts ├── prottle.js └── prottle.test.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | 7 | indent_style = space 8 | indent_size = 2 9 | 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | on: [push, pull_request] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v2 8 | - uses: actions/setup-node@v2 9 | with: 10 | node-version: 14.x 11 | check-latest: true 12 | - run: npm install 13 | - run: npm test 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![NPM version](https://img.shields.io/npm/v/prottle.svg?style=flat-square)](https://www.npmjs.com/package/prottle) 2 | [![Build Status](https://github.com/zewish/prottle/workflows/build/badge.svg)](https://github.com/zewish/prottle/actions?query=workflow%3Abuild) 3 | [![Downloads](https://img.shields.io/npm/dm/prottle.svg?style=flat-square)](https://www.npmjs.com/package/prottle) 4 | 5 | Promise.all() throttle - Prottle 6 | 7 | - Executes promise-returning functions in batches; 8 | - Once batch 1 is finished it's time for the next one; 9 | - Backend - Node 4.0+ supported; 10 | - Frontend - works with the env preset using babel. Use a Promise polyfill for IE. 11 | 12 | Installation 13 | ------------ 14 | ```bash 15 | $ npm install prottle --save 16 | ``` 17 | 18 | Example - resolved 19 | ------------------ 20 | ```js 21 | const prottle = require('prottle'); 22 | 23 | prottle(2, [ 24 | // batch 1 25 | () => Promise.resolve(1), 26 | () => Promise.resolve(2), 27 | // batch 2 28 | () => Promise.resolve(3), 29 | () => new Promise((resolve, reject) => { 30 | setTimeout(() => resolve(4), 3000); 31 | }), 32 | // batch 3 33 | () => Promise.resolve(5), 34 | ]) 35 | .then(res => { 36 | console.log(res); // [ 1, 2, 3, 4, 5 ] 37 | }); 38 | ``` 39 | 40 | Example - rejected 41 | ------------------ 42 | ```js 43 | const prottle = require('prottle'); 44 | 45 | prottle(2, [ 46 | () => Promise.resolve('yay'), 47 | () => Promise.reject('beep boop'), 48 | () => Promise.resolve('wow') 49 | ]) 50 | .catch(err => { 51 | console.log(err); // beep boop 52 | }); 53 | ``` 54 | 55 | Works with returned values too! 56 | ------------------------------- 57 | ```js 58 | const prottle = require('prottle'); 59 | 60 | prottle(2, [ 61 | () => 1, 62 | () => 2, 63 | () => 3 64 | ]) 65 | .then(res => { 66 | console.log(res); // [ 1, 2, 3 ] 67 | }); 68 | ``` 69 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prottle", 3 | "version": "1.0.6", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@ungap/promise-all-settled": { 8 | "version": "1.1.2", 9 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 10 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 11 | "dev": true 12 | }, 13 | "ansi-colors": { 14 | "version": "4.1.1", 15 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 16 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 17 | "dev": true 18 | }, 19 | "ansi-regex": { 20 | "version": "3.0.0", 21 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 22 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 23 | "dev": true 24 | }, 25 | "ansi-styles": { 26 | "version": "4.3.0", 27 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 28 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 29 | "dev": true, 30 | "requires": { 31 | "color-convert": "^2.0.1" 32 | } 33 | }, 34 | "anymatch": { 35 | "version": "3.1.1", 36 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 37 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 38 | "dev": true, 39 | "requires": { 40 | "normalize-path": "^3.0.0", 41 | "picomatch": "^2.0.4" 42 | } 43 | }, 44 | "argparse": { 45 | "version": "2.0.1", 46 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 47 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 48 | "dev": true 49 | }, 50 | "assertion-error": { 51 | "version": "1.1.0", 52 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 53 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 54 | "dev": true 55 | }, 56 | "balanced-match": { 57 | "version": "1.0.0", 58 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 59 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 60 | "dev": true 61 | }, 62 | "binary-extensions": { 63 | "version": "2.2.0", 64 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 65 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 66 | "dev": true 67 | }, 68 | "brace-expansion": { 69 | "version": "1.1.11", 70 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 71 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 72 | "dev": true, 73 | "requires": { 74 | "balanced-match": "^1.0.0", 75 | "concat-map": "0.0.1" 76 | } 77 | }, 78 | "braces": { 79 | "version": "3.0.2", 80 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 81 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 82 | "dev": true, 83 | "requires": { 84 | "fill-range": "^7.0.1" 85 | } 86 | }, 87 | "browser-stdout": { 88 | "version": "1.3.1", 89 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 90 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 91 | "dev": true 92 | }, 93 | "camelcase": { 94 | "version": "6.2.0", 95 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", 96 | "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", 97 | "dev": true 98 | }, 99 | "chai": { 100 | "version": "4.3.4", 101 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", 102 | "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", 103 | "dev": true, 104 | "requires": { 105 | "assertion-error": "^1.1.0", 106 | "check-error": "^1.0.2", 107 | "deep-eql": "^3.0.1", 108 | "get-func-name": "^2.0.0", 109 | "pathval": "^1.1.1", 110 | "type-detect": "^4.0.5" 111 | } 112 | }, 113 | "chai-as-promised": { 114 | "version": "7.1.1", 115 | "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", 116 | "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", 117 | "dev": true, 118 | "requires": { 119 | "check-error": "^1.0.2" 120 | } 121 | }, 122 | "chalk": { 123 | "version": "4.1.0", 124 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 125 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 126 | "dev": true, 127 | "requires": { 128 | "ansi-styles": "^4.1.0", 129 | "supports-color": "^7.1.0" 130 | }, 131 | "dependencies": { 132 | "supports-color": { 133 | "version": "7.2.0", 134 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 135 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 136 | "dev": true, 137 | "requires": { 138 | "has-flag": "^4.0.0" 139 | } 140 | } 141 | } 142 | }, 143 | "check-error": { 144 | "version": "1.0.2", 145 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 146 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 147 | "dev": true 148 | }, 149 | "chokidar": { 150 | "version": "3.5.1", 151 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 152 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 153 | "dev": true, 154 | "requires": { 155 | "anymatch": "~3.1.1", 156 | "braces": "~3.0.2", 157 | "fsevents": "~2.3.1", 158 | "glob-parent": "~5.1.0", 159 | "is-binary-path": "~2.1.0", 160 | "is-glob": "~4.0.1", 161 | "normalize-path": "~3.0.0", 162 | "readdirp": "~3.5.0" 163 | } 164 | }, 165 | "cliui": { 166 | "version": "7.0.4", 167 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 168 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 169 | "dev": true, 170 | "requires": { 171 | "string-width": "^4.2.0", 172 | "strip-ansi": "^6.0.0", 173 | "wrap-ansi": "^7.0.0" 174 | }, 175 | "dependencies": { 176 | "ansi-regex": { 177 | "version": "5.0.0", 178 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 179 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 180 | "dev": true 181 | }, 182 | "is-fullwidth-code-point": { 183 | "version": "3.0.0", 184 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 185 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 186 | "dev": true 187 | }, 188 | "string-width": { 189 | "version": "4.2.2", 190 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 191 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 192 | "dev": true, 193 | "requires": { 194 | "emoji-regex": "^8.0.0", 195 | "is-fullwidth-code-point": "^3.0.0", 196 | "strip-ansi": "^6.0.0" 197 | } 198 | }, 199 | "strip-ansi": { 200 | "version": "6.0.0", 201 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 202 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 203 | "dev": true, 204 | "requires": { 205 | "ansi-regex": "^5.0.0" 206 | } 207 | } 208 | } 209 | }, 210 | "color-convert": { 211 | "version": "2.0.1", 212 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 213 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 214 | "dev": true, 215 | "requires": { 216 | "color-name": "~1.1.4" 217 | } 218 | }, 219 | "color-name": { 220 | "version": "1.1.4", 221 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 222 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 223 | "dev": true 224 | }, 225 | "concat-map": { 226 | "version": "0.0.1", 227 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 228 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 229 | "dev": true 230 | }, 231 | "debug": { 232 | "version": "4.3.1", 233 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 234 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 235 | "dev": true, 236 | "requires": { 237 | "ms": "2.1.2" 238 | }, 239 | "dependencies": { 240 | "ms": { 241 | "version": "2.1.2", 242 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 243 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 244 | "dev": true 245 | } 246 | } 247 | }, 248 | "decamelize": { 249 | "version": "4.0.0", 250 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 251 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 252 | "dev": true 253 | }, 254 | "deep-eql": { 255 | "version": "3.0.1", 256 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 257 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 258 | "dev": true, 259 | "requires": { 260 | "type-detect": "^4.0.0" 261 | } 262 | }, 263 | "diff": { 264 | "version": "5.0.0", 265 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 266 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 267 | "dev": true 268 | }, 269 | "emoji-regex": { 270 | "version": "8.0.0", 271 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 272 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 273 | "dev": true 274 | }, 275 | "escalade": { 276 | "version": "3.1.1", 277 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 278 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 279 | "dev": true 280 | }, 281 | "escape-string-regexp": { 282 | "version": "4.0.0", 283 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 284 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 285 | "dev": true 286 | }, 287 | "fill-range": { 288 | "version": "7.0.1", 289 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 290 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 291 | "dev": true, 292 | "requires": { 293 | "to-regex-range": "^5.0.1" 294 | } 295 | }, 296 | "find-up": { 297 | "version": "5.0.0", 298 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 299 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 300 | "dev": true, 301 | "requires": { 302 | "locate-path": "^6.0.0", 303 | "path-exists": "^4.0.0" 304 | } 305 | }, 306 | "flat": { 307 | "version": "5.0.2", 308 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 309 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 310 | "dev": true 311 | }, 312 | "fs.realpath": { 313 | "version": "1.0.0", 314 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 315 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 316 | "dev": true 317 | }, 318 | "fsevents": { 319 | "version": "2.3.2", 320 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 321 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 322 | "dev": true, 323 | "optional": true 324 | }, 325 | "get-caller-file": { 326 | "version": "2.0.5", 327 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 328 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 329 | "dev": true 330 | }, 331 | "get-func-name": { 332 | "version": "2.0.0", 333 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 334 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 335 | "dev": true 336 | }, 337 | "glob": { 338 | "version": "7.1.6", 339 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 340 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 341 | "dev": true, 342 | "requires": { 343 | "fs.realpath": "^1.0.0", 344 | "inflight": "^1.0.4", 345 | "inherits": "2", 346 | "minimatch": "^3.0.4", 347 | "once": "^1.3.0", 348 | "path-is-absolute": "^1.0.0" 349 | } 350 | }, 351 | "glob-parent": { 352 | "version": "5.1.2", 353 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 354 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 355 | "dev": true, 356 | "requires": { 357 | "is-glob": "^4.0.1" 358 | } 359 | }, 360 | "growl": { 361 | "version": "1.10.5", 362 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 363 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 364 | "dev": true 365 | }, 366 | "has-flag": { 367 | "version": "4.0.0", 368 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 369 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 370 | "dev": true 371 | }, 372 | "he": { 373 | "version": "1.2.0", 374 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 375 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 376 | "dev": true 377 | }, 378 | "inflight": { 379 | "version": "1.0.6", 380 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 381 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 382 | "dev": true, 383 | "requires": { 384 | "once": "^1.3.0", 385 | "wrappy": "1" 386 | } 387 | }, 388 | "inherits": { 389 | "version": "2.0.4", 390 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 391 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 392 | "dev": true 393 | }, 394 | "is-binary-path": { 395 | "version": "2.1.0", 396 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 397 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 398 | "dev": true, 399 | "requires": { 400 | "binary-extensions": "^2.0.0" 401 | } 402 | }, 403 | "is-extglob": { 404 | "version": "2.1.1", 405 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 406 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 407 | "dev": true 408 | }, 409 | "is-fullwidth-code-point": { 410 | "version": "2.0.0", 411 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 412 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 413 | "dev": true 414 | }, 415 | "is-glob": { 416 | "version": "4.0.1", 417 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 418 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 419 | "dev": true, 420 | "requires": { 421 | "is-extglob": "^2.1.1" 422 | } 423 | }, 424 | "is-number": { 425 | "version": "7.0.0", 426 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 427 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 428 | "dev": true 429 | }, 430 | "is-plain-obj": { 431 | "version": "2.1.0", 432 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 433 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 434 | "dev": true 435 | }, 436 | "isexe": { 437 | "version": "2.0.0", 438 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 439 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 440 | "dev": true 441 | }, 442 | "js-yaml": { 443 | "version": "4.0.0", 444 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", 445 | "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", 446 | "dev": true, 447 | "requires": { 448 | "argparse": "^2.0.1" 449 | } 450 | }, 451 | "locate-path": { 452 | "version": "6.0.0", 453 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 454 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 455 | "dev": true, 456 | "requires": { 457 | "p-locate": "^5.0.0" 458 | } 459 | }, 460 | "log-symbols": { 461 | "version": "4.0.0", 462 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", 463 | "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", 464 | "dev": true, 465 | "requires": { 466 | "chalk": "^4.0.0" 467 | } 468 | }, 469 | "minimatch": { 470 | "version": "3.0.4", 471 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 472 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 473 | "dev": true, 474 | "requires": { 475 | "brace-expansion": "^1.1.7" 476 | } 477 | }, 478 | "mocha": { 479 | "version": "8.3.2", 480 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", 481 | "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", 482 | "dev": true, 483 | "requires": { 484 | "@ungap/promise-all-settled": "1.1.2", 485 | "ansi-colors": "4.1.1", 486 | "browser-stdout": "1.3.1", 487 | "chokidar": "3.5.1", 488 | "debug": "4.3.1", 489 | "diff": "5.0.0", 490 | "escape-string-regexp": "4.0.0", 491 | "find-up": "5.0.0", 492 | "glob": "7.1.6", 493 | "growl": "1.10.5", 494 | "he": "1.2.0", 495 | "js-yaml": "4.0.0", 496 | "log-symbols": "4.0.0", 497 | "minimatch": "3.0.4", 498 | "ms": "2.1.3", 499 | "nanoid": "3.1.20", 500 | "serialize-javascript": "5.0.1", 501 | "strip-json-comments": "3.1.1", 502 | "supports-color": "8.1.1", 503 | "which": "2.0.2", 504 | "wide-align": "1.1.3", 505 | "workerpool": "6.1.0", 506 | "yargs": "16.2.0", 507 | "yargs-parser": "20.2.4", 508 | "yargs-unparser": "2.0.0" 509 | } 510 | }, 511 | "ms": { 512 | "version": "2.1.3", 513 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 514 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 515 | "dev": true 516 | }, 517 | "nanoid": { 518 | "version": "3.1.20", 519 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", 520 | "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", 521 | "dev": true 522 | }, 523 | "normalize-path": { 524 | "version": "3.0.0", 525 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 526 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 527 | "dev": true 528 | }, 529 | "once": { 530 | "version": "1.4.0", 531 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 532 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 533 | "dev": true, 534 | "requires": { 535 | "wrappy": "1" 536 | } 537 | }, 538 | "p-limit": { 539 | "version": "3.1.0", 540 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 541 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 542 | "dev": true, 543 | "requires": { 544 | "yocto-queue": "^0.1.0" 545 | } 546 | }, 547 | "p-locate": { 548 | "version": "5.0.0", 549 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 550 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 551 | "dev": true, 552 | "requires": { 553 | "p-limit": "^3.0.2" 554 | } 555 | }, 556 | "path-exists": { 557 | "version": "4.0.0", 558 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 559 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 560 | "dev": true 561 | }, 562 | "path-is-absolute": { 563 | "version": "1.0.1", 564 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 565 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 566 | "dev": true 567 | }, 568 | "pathval": { 569 | "version": "1.1.1", 570 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 571 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 572 | "dev": true 573 | }, 574 | "picomatch": { 575 | "version": "2.2.2", 576 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 577 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 578 | "dev": true 579 | }, 580 | "randombytes": { 581 | "version": "2.1.0", 582 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 583 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 584 | "dev": true, 585 | "requires": { 586 | "safe-buffer": "^5.1.0" 587 | } 588 | }, 589 | "readdirp": { 590 | "version": "3.5.0", 591 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 592 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 593 | "dev": true, 594 | "requires": { 595 | "picomatch": "^2.2.1" 596 | } 597 | }, 598 | "require-directory": { 599 | "version": "2.1.1", 600 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 601 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 602 | "dev": true 603 | }, 604 | "safe-buffer": { 605 | "version": "5.2.1", 606 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 607 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 608 | "dev": true 609 | }, 610 | "serialize-javascript": { 611 | "version": "5.0.1", 612 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", 613 | "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", 614 | "dev": true, 615 | "requires": { 616 | "randombytes": "^2.1.0" 617 | } 618 | }, 619 | "string-width": { 620 | "version": "2.1.1", 621 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 622 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 623 | "dev": true, 624 | "requires": { 625 | "is-fullwidth-code-point": "^2.0.0", 626 | "strip-ansi": "^4.0.0" 627 | } 628 | }, 629 | "strip-ansi": { 630 | "version": "4.0.0", 631 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 632 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 633 | "dev": true, 634 | "requires": { 635 | "ansi-regex": "^3.0.0" 636 | } 637 | }, 638 | "strip-json-comments": { 639 | "version": "3.1.1", 640 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 641 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 642 | "dev": true 643 | }, 644 | "supports-color": { 645 | "version": "8.1.1", 646 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 647 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 648 | "dev": true, 649 | "requires": { 650 | "has-flag": "^4.0.0" 651 | } 652 | }, 653 | "to-regex-range": { 654 | "version": "5.0.1", 655 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 656 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 657 | "dev": true, 658 | "requires": { 659 | "is-number": "^7.0.0" 660 | } 661 | }, 662 | "type-detect": { 663 | "version": "4.0.8", 664 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 665 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 666 | "dev": true 667 | }, 668 | "which": { 669 | "version": "2.0.2", 670 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 671 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 672 | "dev": true, 673 | "requires": { 674 | "isexe": "^2.0.0" 675 | } 676 | }, 677 | "wide-align": { 678 | "version": "1.1.3", 679 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 680 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 681 | "dev": true, 682 | "requires": { 683 | "string-width": "^1.0.2 || 2" 684 | } 685 | }, 686 | "workerpool": { 687 | "version": "6.1.0", 688 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", 689 | "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", 690 | "dev": true 691 | }, 692 | "wrap-ansi": { 693 | "version": "7.0.0", 694 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 695 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 696 | "dev": true, 697 | "requires": { 698 | "ansi-styles": "^4.0.0", 699 | "string-width": "^4.1.0", 700 | "strip-ansi": "^6.0.0" 701 | }, 702 | "dependencies": { 703 | "ansi-regex": { 704 | "version": "5.0.0", 705 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 706 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 707 | "dev": true 708 | }, 709 | "is-fullwidth-code-point": { 710 | "version": "3.0.0", 711 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 712 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 713 | "dev": true 714 | }, 715 | "string-width": { 716 | "version": "4.2.2", 717 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 718 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 719 | "dev": true, 720 | "requires": { 721 | "emoji-regex": "^8.0.0", 722 | "is-fullwidth-code-point": "^3.0.0", 723 | "strip-ansi": "^6.0.0" 724 | } 725 | }, 726 | "strip-ansi": { 727 | "version": "6.0.0", 728 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 729 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 730 | "dev": true, 731 | "requires": { 732 | "ansi-regex": "^5.0.0" 733 | } 734 | } 735 | } 736 | }, 737 | "wrappy": { 738 | "version": "1.0.2", 739 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 740 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 741 | "dev": true 742 | }, 743 | "y18n": { 744 | "version": "5.0.5", 745 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", 746 | "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", 747 | "dev": true 748 | }, 749 | "yargs": { 750 | "version": "16.2.0", 751 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 752 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 753 | "dev": true, 754 | "requires": { 755 | "cliui": "^7.0.2", 756 | "escalade": "^3.1.1", 757 | "get-caller-file": "^2.0.5", 758 | "require-directory": "^2.1.1", 759 | "string-width": "^4.2.0", 760 | "y18n": "^5.0.5", 761 | "yargs-parser": "^20.2.2" 762 | }, 763 | "dependencies": { 764 | "ansi-regex": { 765 | "version": "5.0.0", 766 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 767 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 768 | "dev": true 769 | }, 770 | "is-fullwidth-code-point": { 771 | "version": "3.0.0", 772 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 773 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 774 | "dev": true 775 | }, 776 | "string-width": { 777 | "version": "4.2.2", 778 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 779 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 780 | "dev": true, 781 | "requires": { 782 | "emoji-regex": "^8.0.0", 783 | "is-fullwidth-code-point": "^3.0.0", 784 | "strip-ansi": "^6.0.0" 785 | } 786 | }, 787 | "strip-ansi": { 788 | "version": "6.0.0", 789 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 790 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 791 | "dev": true, 792 | "requires": { 793 | "ansi-regex": "^5.0.0" 794 | } 795 | } 796 | } 797 | }, 798 | "yargs-parser": { 799 | "version": "20.2.4", 800 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 801 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 802 | "dev": true 803 | }, 804 | "yargs-unparser": { 805 | "version": "2.0.0", 806 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 807 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 808 | "dev": true, 809 | "requires": { 810 | "camelcase": "^6.0.0", 811 | "decamelize": "^4.0.0", 812 | "flat": "^5.0.2", 813 | "is-plain-obj": "^2.1.0" 814 | } 815 | }, 816 | "yocto-queue": { 817 | "version": "0.1.0", 818 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 819 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 820 | "dev": true 821 | } 822 | } 823 | } 824 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prottle", 3 | "version": "1.0.6", 4 | "description": "Promise.all() throttle", 5 | "main": "prottle.js", 6 | "typings": "prottle.d.ts", 7 | "scripts": { 8 | "test": "mocha ./*.test.js" 9 | }, 10 | "author": "Iskren Slavov ", 11 | "license": "BSD-2-Clause", 12 | "devDependencies": { 13 | "chai": "^4.3.4", 14 | "chai-as-promised": "^7.1.1", 15 | "mocha": "^8.3.2" 16 | }, 17 | "files": [ 18 | "prottle.js", 19 | "prottle.d.ts" 20 | ], 21 | "keywords": [ 22 | "promise", 23 | "throttle", 24 | "limit", 25 | "promise.all", 26 | "promises", 27 | "browserify" 28 | ], 29 | "repository": { 30 | "type": "git", 31 | "url": "https://github.com/zewish/prottle.git" 32 | }, 33 | "bugs": { 34 | "url": "https://github.com/zewish/prottle/issues" 35 | }, 36 | "homepage": "https://github.com/zewish/prottle" 37 | } 38 | -------------------------------------------------------------------------------- /prottle.d.ts: -------------------------------------------------------------------------------- 1 | declare const prottle: ( 2 | limit: number, 3 | arr: Array<() => any> 4 | ) => Promise; 5 | 6 | export = prottle; 7 | -------------------------------------------------------------------------------- /prottle.js: -------------------------------------------------------------------------------- 1 | const EventEmitter = require('events'); 2 | 3 | module.exports = (limit, arr) => { 4 | limit = parseInt(limit); 5 | 6 | if (isNaN(limit) || limit <= 0) { 7 | return Promise.reject(Error('Limit must be at least 1')); 8 | } 9 | 10 | if (!Array.isArray(arr)) { 11 | return Promise.reject(Error('Array of promises required')); 12 | } 13 | 14 | const promises = [].concat(arr); 15 | const results = []; 16 | const emitter = new EventEmitter(); 17 | 18 | const run = (batch, id) => { 19 | Promise.all(batch.map( 20 | (fn) => Promise.resolve(fn()) 21 | )) 22 | .then((res) => { 23 | results.push.apply(results, res); 24 | emitter.emit(`end:${id}`); 25 | }) 26 | .catch((err) => { 27 | emitter.emit('error', err); 28 | }); 29 | }; 30 | 31 | let add = (batch, id) => { 32 | if (id === 0) { 33 | return run(batch, id); 34 | } 35 | 36 | emitter.once(`end:${id-1}`, () => run(batch, id)); 37 | }; 38 | 39 | let idx = -1; 40 | while (promises.length) { 41 | add( 42 | promises.splice(0, limit), 43 | ++idx 44 | ); 45 | } 46 | 47 | return new Promise((resolve, reject) => { 48 | emitter 49 | .once(`end:${idx}`, () => { 50 | resolve(results); 51 | }) 52 | .once('error', err => { 53 | emitter.removeAllListeners(); 54 | reject(err); 55 | }); 56 | }); 57 | }; 58 | -------------------------------------------------------------------------------- /prottle.test.js: -------------------------------------------------------------------------------- 1 | require('chai') 2 | .use(require('chai-as-promised')) 3 | .should(); 4 | 5 | describe('prottle.js', () => { 6 | let prottle; 7 | 8 | beforeEach(() => { 9 | prottle = require('./prottle.js'); 10 | }); 11 | 12 | it('rejects with limit error', () => { 13 | return prottle() 14 | .catch((err) => { 15 | err.message.should.equal('Limit must be at least 1'); 16 | }); 17 | }); 18 | 19 | it('rejects with limit error', () => { 20 | return prottle(0) 21 | .catch((err) => { 22 | err.message.should.equal('Limit must be at least 1'); 23 | }); 24 | }); 25 | 26 | it('rejects with limit error', () => { 27 | return prottle('dsad') 28 | .catch((err) => { 29 | err.message.should.equal('Limit must be at least 1'); 30 | }); 31 | }); 32 | 33 | it('rejects with array error', () => { 34 | return prottle(1, 'boo') 35 | .catch((err) => { 36 | err.message.should.equal('Array of promises required'); 37 | }); 38 | }); 39 | 40 | it('does not modify given array', () => { 41 | const arr = [ 42 | () => Promise.resolve(1), 43 | () => Promise.resolve(2), 44 | () => Promise.resolve(3) 45 | ]; 46 | 47 | let length = arr.length; 48 | 49 | return prottle(1, arr) 50 | .then(() => { 51 | arr.length.should.equal(length); 52 | }); 53 | }); 54 | 55 | it('resolves', () => { 56 | return prottle(3, [ 57 | () => Promise.resolve(1), 58 | () => Promise.resolve(2), 59 | () => Promise.resolve(3), 60 | () => Promise.resolve(4), 61 | () => Promise.resolve(5) 62 | ]) 63 | .should.eventually.eql([ 64 | 1, 2, 3, 4, 5 65 | ]); 66 | }); 67 | 68 | it('rejects', () => { 69 | return prottle(2, [ 70 | () => Promise.resolve(1), 71 | () => Promise.resolve(2), 72 | () => Promise.resolve(3), 73 | () => Promise.reject('beep boop'), 74 | () => Promise.resolve(5) 75 | ]) 76 | .should.be.rejectedWith('beep boop'); 77 | }); 78 | }); 79 | --------------------------------------------------------------------------------