├── .gitignore ├── LICENSE.txt ├── changelog.md ├── documentation └── images │ └── demo-screen.png ├── examples ├── arrayHelpers │ ├── mapParallel.html │ └── mapParallel.js ├── basic │ ├── worka.html │ ├── workaRunTimeError.html │ └── workaSyntaxError.html ├── css.css ├── deno │ ├── deno_raw_worker_test.js │ ├── file_usage.js │ ├── readme.md │ └── w.ts ├── estimatePi │ ├── estimatePi.js │ ├── estimatePiPrepared.js │ ├── estimatePiWorker.js │ ├── example.html │ └── example.js ├── index.js ├── node │ ├── file_usage.js │ ├── patchNodeWorker.js │ ├── readme.md │ └── sort.js ├── package-lock.json ├── package.json └── sendFile.js ├── package-lock.json ├── package.json ├── readme.md ├── source ├── arrayParallel.js ├── decorateWorker.js ├── worka.js ├── workerErrorHandler.js ├── workerGlue.js └── workerGlueMulti.js └── tools └── glueAsExportedString.js /.gitignore: -------------------------------------------------------------------------------- 1 | pivatenoten.txt 2 | node_modules/ 3 | readme-draft.de.md 4 | 5 | webspree_session.json 6 | built/ 7 | example-node/sort_worka.js 8 | sort_worka.js -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Boost Software License - Version 1.0 - August 17th, 2003 2 | 3 | Permission is hereby granted, free of charge, to any person or organization 4 | obtaining a copy of the software and accompanying documentation covered by 5 | this license (the "Software") to use, reproduce, display, distribute, 6 | execute, and transmit the Software, and to prepare derivative works of the 7 | Software, and to permit third-parties to whom the Software is furnished to 8 | do so, all subject to the following: 9 | 10 | The copyright notices in the Software and this entire statement, including 11 | the above license grant, this restriction and the following disclaimer, 12 | must be included in all copies of the Software, in whole or in part, and 13 | all derivative works of the Software, unless such copies or derivative 14 | works are solely in the form of machine-executable object code generated by 15 | a source language processor. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 12.0.0 4 | 5 | * use `Object.hasOwn` which requires ES2022 or a polyfill 6 | 7 | ## 11.0.0 8 | 9 | * decorateWorker requires Node 14+ 10 | 11 | ## 10.1.0 12 | 13 | * Functions provided to registerWorker can also return Promises 14 | * Requires async await support 15 | 16 | 17 | ## 10.0.0 18 | 19 | * Worker is a module by default 20 | * Works with Deno 21 | 22 | 23 | ## 9.1.0 24 | 25 | * Add arrayParallel.js 26 | 27 | ## 9.0.0 28 | 29 | * Rename `built/worka_require.js` into `built/worka.cjs` 30 | * Rename `built/worka_script.js` into `built/worka.iife.js` 31 | * Move Changelog to changelog.md 32 | 33 | ## 8.0.0 34 | 35 | * Symbols are exported individually 36 | * work expects an object as argument 37 | * for MULTI_FUNCTION, functionName is separated from name 38 | 39 | ## 7.0.0 40 | 41 | * Move to ES Module first 42 | 43 | ## 6.1.0 44 | 45 | * build-time decorateWorker exposed, FILE loadMode support 46 | 47 | ## 6.0.0 48 | 49 | * built/worka_script.js and built/worka_require.js removed from git 50 | * Use npm or run build yourself. 51 | 52 | ## 5.0.0 53 | 54 | * Symbol is expected to be defined. Cleanup behaviour after error occurs, instead of never settled promised 55 | 56 | ## 4.0.3 57 | 58 | * Now importable with require. See built/worka_require.js 59 | 60 | ## 4.0.0 61 | 62 | * Run time errors inside the worker will cause the catch statement to be executed with the error message inside as String. See example/workaRunTimeError.html Syntax Errors are not managed (same as before) 63 | 64 | ## 3.1.3 65 | 66 | * Now importable as script. See built/worka_script.js 67 | 68 | ## 3.0.0 69 | 70 | * Renamed SYMBOLS into WORKA_SYMBOLS 71 | 72 | ## 2.1.1 73 | 74 | * Do less when there is no web worker support 75 | 76 | ## 2.0.6 77 | 78 | * add `.npmignore` for light npm install 79 | -------------------------------------------------------------------------------- /documentation/images/demo-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GrosSacASac/worka/25b2f5671ef13bebfe09fe0ce2788b6084abf688/documentation/images/demo-screen.png -------------------------------------------------------------------------------- /examples/arrayHelpers/mapParallel.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Parrallel array helpers 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Worka

14 |

Open console. If nothing show up try with a browser that supports modules. And launch form localhost not file system

15 | github 16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /examples/arrayHelpers/mapParallel.js: -------------------------------------------------------------------------------- 1 | import { mapParallel } from "../../source/arrayParallel.js"; 2 | import { estimatePi } from "../estimatePi/estimatePi.js"; 3 | 4 | 5 | const precisionFromPrecisionLevel = function (precisionLevel) { 6 | if (!precisionLevel) { 7 | precisionLevel = 3; 8 | } 9 | return 10 ** precisionLevel; 10 | }; 11 | 12 | const levels = [8,8,8,8].map(precisionFromPrecisionLevel); 13 | 14 | 15 | console.time(`regular`); 16 | const regularResults = levels.map(estimatePi); 17 | console.timeEnd(`regular`); 18 | console.log(regularResults); 19 | 20 | (async function () { 21 | console.time(`worka`); 22 | const results = await Promise.all(mapParallel(estimatePi, levels)); 23 | console.timeEnd(`worka`); 24 | console.log(results); 25 | 26 | }()); 27 | -------------------------------------------------------------------------------- /examples/basic/worka.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Open console. If nothing show up try with a browser that supports modules. And launch form localhost not file system

9 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /examples/basic/workaRunTimeError.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Open console. If nothing show up try with a browser that supports modules. And launch form localhost not file system

9 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /examples/basic/workaSyntaxError.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Open console. If nothing show up try with a browser that supports modules. And launch form localhost not file system

9 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /examples/css.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | font-family: sans-serif; 4 | font-size: 1.1em; 5 | } 6 | 7 | table { 8 | min-width: 60%; 9 | border-collapse: collapse; 10 | border: 1px solid #d8cccb; 11 | margin-top: 1em; 12 | margin-bottom: 1em; 13 | } 14 | 15 | table > caption { 16 | font-size: 1.1em; 17 | font-weight: bold; 18 | text-decoration: underline; 19 | padding: 8px; 20 | } 21 | 22 | table > thead > tr, 23 | table > tbody > tr { 24 | border-bottom: 1px solid #d8cccb; 25 | } 26 | 27 | table > thead > tr > th { 28 | } 29 | 30 | table > thead > tr > th, 31 | table > tbody > tr > td { 32 | padding: 8px; 33 | text-align: center; 34 | } 35 | 36 | details > summary { 37 | background-color: #f6f4ff; 38 | padding: 8px; 39 | } 40 | 41 | details > summary:hover { 42 | background-color: #aaa2d8; 43 | } 44 | 45 | details[open] > summary:hover { 46 | background-color: #8876b8; 47 | } 48 | 49 | -------------------------------------------------------------------------------- /examples/deno/deno_raw_worker_test.js: -------------------------------------------------------------------------------- 1 | import makeloc from "https://cdn.deno.land/dirname/versions/1.1.2/raw/mod.ts";//https://x.nest.land/dirname@v1.1.2/mod.ts" 2 | 3 | 4 | const { __dirname, __filename } = makeloc(import.meta); 5 | 6 | 7 | console.log(`${__dirname}w.ts`.substr(1)); 8 | 9 | const tsWorker = new Worker(`file:///${__dirname}w.ts`, { 10 | type: `module`, 11 | }); 12 | tsWorker.postMessage(`Hello World`); 13 | -------------------------------------------------------------------------------- /examples/deno/file_usage.js: -------------------------------------------------------------------------------- 1 | import { registerWorker, FILE, NO_SUPPORT_ERROR, TIME_OUT_ERROR, work } from "../../source/worka.js"; 2 | import makeloc from "https://cdn.deno.land/dirname/versions/1.1.2/raw/mod.ts";//https://x.nest.land/dirname@v1.1.2/mod.ts" 3 | 4 | 5 | const { __dirname, __filename } = makeloc(import.meta); 6 | 7 | 8 | // console.log(`file:///${__dirname}../../sort_worka.js`); 9 | 10 | registerWorker({ 11 | name: `sort`, 12 | resource: `file:///${__dirname}../../sort_worka.js`, 13 | loadMode: FILE, 14 | hope: 0, 15 | timeout: 100, 16 | }); 17 | 18 | work({ name: `sort`, input: [1, 2, 3, -8, -5, 2, 3, 45, 5] }).then(function (result) { 19 | console.log(result); 20 | console.log(`after success`); 21 | }).catch(error => { 22 | if (error === NO_SUPPORT_ERROR) { 23 | console.error(`missing support`); 24 | } else if (error === TIME_OUT_ERROR) { 25 | console.error(`time out error`); 26 | } else { 27 | console.error(error); 28 | } 29 | }); 30 | -------------------------------------------------------------------------------- /examples/deno/readme.md: -------------------------------------------------------------------------------- 1 | # use worka in Deno 2 | 3 | see file_usage.js 4 | -------------------------------------------------------------------------------- /examples/deno/w.ts: -------------------------------------------------------------------------------- 1 | onmessage = function (e): void { 2 | console.log(e.data); 3 | 4 | // postMessage(e.data); 5 | 6 | // workerClose(); 7 | }; -------------------------------------------------------------------------------- /examples/estimatePi/estimatePi.js: -------------------------------------------------------------------------------- 1 | export { estimatePi }; 2 | 3 | 4 | const estimatePi = function (precision) { 5 | /* PI Estimation, 6 | precision is also limited by the Number type precision 7 | correctness can be affected by the randomness Math.random()*/ 8 | const radius = 1; 9 | let xCoordinate; 10 | let yCoordinate; 11 | let intermediary; 12 | let i; 13 | let insideCounter = 0; 14 | 15 | for (i = 0; i < precision; i += 1) { 16 | xCoordinate = Math.random(); 17 | yCoordinate = Math.random(); 18 | 19 | intermediary = (xCoordinate ** 2) + (yCoordinate ** 2); 20 | // ** 0.5 is not required because we compare with 1; 21 | if (intermediary < radius) { 22 | insideCounter += 1; 23 | } 24 | } 25 | return (insideCounter / precision) * 4; 26 | }; 27 | -------------------------------------------------------------------------------- /examples/estimatePi/estimatePiPrepared.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | /*copy from estimatePi.js*/ 4 | const estimatePiWorkerCode = ` 5 | const estimatePi = function (precision) { 6 | /* PI Estimation, precision is also limiter by the Number type type precision 7 | correctness is affected by the randomness Math.random()*/ 8 | const radius = 1; 9 | let xCoordinate; 10 | let yCoordinate; 11 | let intermediary; 12 | let i; 13 | let insideCounter = 0; 14 | 15 | for (i = 0; i < precision; i += 1) { 16 | xCoordinate = Math.random(); 17 | yCoordinate = Math.random(); 18 | 19 | intermediary = (xCoordinate ** 2) + (yCoordinate ** 2) 20 | // ** 0.5 is not required because we compare with 1; 21 | if (intermediary < radius) { 22 | insideCounter += 1; 23 | } 24 | } 25 | return (insideCounter / precision) * 4; 26 | }; 27 | 28 | self.addEventListener("message", function(event) { 29 | const message = event.data; 30 | if (!message.hasOwnProperty("action")) { 31 | return; 32 | } 33 | const action = message.action; 34 | 35 | if (action === "estimatePi") { 36 | 37 | const precision = message.input; 38 | const result = estimatePi(precision); 39 | 40 | self.postMessage({ 41 | result 42 | }); 43 | } 44 | 45 | });`; 46 | 47 | const estimatePiWorkerJsBlob = new Blob([estimatePiWorkerCode], { type: `text/javascript` }); 48 | export const estimatePiWorkerURL = URL.createObjectURL(estimatePiWorkerJsBlob); 49 | -------------------------------------------------------------------------------- /examples/estimatePi/estimatePiWorker.js: -------------------------------------------------------------------------------- 1 | const estimatePi = function (precision) { 2 | /* PI Estimation, precision is also limiter by the Number type type precision 3 | correctness is affected by the randomness Math.random()*/ 4 | const radius = 1; 5 | let xCoordinate; 6 | let yCoordinate; 7 | let intermediary; 8 | let i; 9 | let insideCounter = 0; 10 | 11 | for (i = 0; i < precision; i += 1) { 12 | xCoordinate = Math.random(); 13 | yCoordinate = Math.random(); 14 | 15 | intermediary = (xCoordinate ** 2) + (yCoordinate ** 2); 16 | // ** 0.5 is not required because we compare with 1; 17 | if (intermediary < radius) { 18 | insideCounter += 1; 19 | } 20 | } 21 | return (insideCounter / precision) * 4; 22 | }; 23 | 24 | self.addEventListener(`message`, function (event) { 25 | const message = event.data; 26 | if (!Object.hasOwn(message, `action`)) { 27 | return; 28 | } 29 | const { action } = message; 30 | 31 | if (action === `estimatePi`) { 32 | 33 | const precision = message.input; 34 | const result = estimatePi(precision); 35 | 36 | self.postMessage({ 37 | result, 38 | }); 39 | } 40 | 41 | }); 42 | -------------------------------------------------------------------------------- /examples/estimatePi/example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Estimate Pi 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

Worka

14 | github 15 |
16 |

Individual tests

17 | 30 | 31 | 36 | 41 | 42 | 47 | 48 | 53 | 54 | 59 |
60 | 61 |
62 |

Results

63 | 66 | 69 |
70 | 71 |
72 |

Statistics

73 | 78 | 85 | 114 |
115 |
116 | 117 |
118 | 119 | 120 | -------------------------------------------------------------------------------- /examples/estimatePi/example.js: -------------------------------------------------------------------------------- 1 | import { registerWorker, FUNCTION, work } from "../../source/worka.js"; 2 | import * as d from "../node_modules/dom99/built/dom99.es.js"; 3 | import { 4 | doNTimes, 5 | chainPromises, 6 | chainPromiseNTimes, 7 | timeFunction, 8 | timePromise, 9 | } from "../node_modules/utilsac/utility.js"; 10 | import { estimatePi } from "./estimatePi.js"; 11 | import { estimatePiWorkerURL } from "./estimatePiPrepared.js"; 12 | 13 | const ESTIMATEPI_RAW_WORKER_URL = `estimatePiWorker.js`; 14 | const ESTIMATEPI_RAW_WORKER_URL_NO_CACHE = `estimatePiWorkerNoCache.js`; 15 | const ESTIMATE_PI_ACTION = `estimatePi`; 16 | const SAMPLE_SIZE = 10; 17 | const INITIAL_PRECISION_LEVEL = 2; 18 | 19 | const getReferenceTime = function () { 20 | // return Date.now(); 21 | return performance.now(); // can be more precise 22 | }; 23 | 24 | const precisionFromPrecisionLevel = function (precisionLevel) { 25 | if (!precisionLevel) { 26 | precisionLevel = 3; 27 | } 28 | return 10 ** precisionLevel; 29 | }; 30 | 31 | let precision = precisionFromPrecisionLevel(INITIAL_PRECISION_LEVEL); 32 | 33 | 34 | registerWorker({ 35 | name: `getPiEstimation`, 36 | resource: estimatePi, 37 | loadMode: FUNCTION, 38 | }); 39 | 40 | registerWorker({ 41 | name: `getPiEstimationForceRestart`, 42 | resource: estimatePi, 43 | loadMode: FUNCTION, 44 | hope: 5, 45 | }); 46 | 47 | 48 | 49 | d.functions.setPrecision = function () { 50 | precision = precisionFromPrecisionLevel(Number(d.variables[`precisionLevel`])); 51 | }; 52 | 53 | d.functions.webWorkerPreloaded = function () { 54 | const startTime = getReferenceTime(); 55 | 56 | const worker = new Worker(estimatePiWorkerURL); 57 | worker.addEventListener(`message`, function (event) { 58 | const message = event.data; 59 | if (Object.hasOwn(message, `result`)) { 60 | const { result } = message; 61 | const endTime = getReferenceTime(); 62 | const duration = endTime - startTime; 63 | d.feed({ 64 | result: `PI estimation: ${result}`, 65 | duration: `Computation time: ${duration}ms`, 66 | }); 67 | worker.terminate(); 68 | } 69 | 70 | }); 71 | //the worker starts with the first postMessage 72 | worker.postMessage({ 73 | action: ESTIMATE_PI_ACTION, 74 | input: precision, 75 | }); 76 | }; 77 | 78 | d.functions.webWorkerNoCache = function () { 79 | const startTime = getReferenceTime(); 80 | 81 | const worker = new Worker(ESTIMATEPI_RAW_WORKER_URL_NO_CACHE); 82 | worker.addEventListener(`message`, function (event) { 83 | const message = event.data; 84 | if (Object.hasOwn(message, `result`)) { 85 | 86 | const { result } = message; 87 | const endTime = getReferenceTime(); 88 | const duration = endTime - startTime; 89 | d.feed({ 90 | result: `PI estimation: ${result}`, 91 | duration: `Computation time: ${duration}ms`, 92 | }); 93 | worker.terminate(); 94 | } 95 | 96 | }, false); 97 | 98 | worker.postMessage({ 99 | action: ESTIMATE_PI_ACTION, 100 | input: precision, 101 | }); 102 | }; 103 | 104 | d.functions.webWorkerWithCache = function () { 105 | const startTime = getReferenceTime(); 106 | 107 | const worker = new Worker(ESTIMATEPI_RAW_WORKER_URL); 108 | worker.addEventListener(`message`, function (event) { 109 | const message = event.data; 110 | if (Object.hasOwn(message, `result`)) { 111 | 112 | const { result } = message; 113 | const endTime = getReferenceTime(); 114 | const duration = endTime - startTime; 115 | d.feed({ 116 | result: `PI estimation: ${result}`, 117 | duration: `Computation time: ${duration}ms`, 118 | }); 119 | worker.terminate(); 120 | } 121 | 122 | }, false); 123 | 124 | worker.postMessage({ 125 | action: ESTIMATE_PI_ACTION, 126 | input: precision, 127 | }); 128 | }; 129 | 130 | d.functions.remoteServer = function () { 131 | timePromise(function () { 132 | return fetch(`../estimatePi?input=${precision}`, {}).then(function (response) { 133 | return response.text(); 134 | }).then(function (resultString) { 135 | const result = Number(resultString); 136 | return result; 137 | }); 138 | }).then(function ({ timeElapsed, value }) { 139 | d.feed({ 140 | result: value, 141 | duration: `Computation time: ${timeElapsed}ms`, 142 | }); 143 | }); 144 | 145 | }; 146 | 147 | 148 | 149 | d.functions.withOutWebWorker = function () { 150 | let result; 151 | const duration = timeFunction(function () { 152 | result = estimatePi(precision); 153 | }); 154 | d.feed({ 155 | result: `PI estimation: ${result}`, 156 | duration: `Computation time: ${duration}ms`, 157 | }); 158 | }; 159 | 160 | d.functions.runFullTestSuite = function () { 161 | chainPromises([ 162 | testWithoutWorker, 163 | testWithRemoteServer, 164 | testWithRawWorker, 165 | testWithWorkerCreatedEveryTime, 166 | testWithWorker, 167 | testWithWorkerAutoSplit, 168 | ]).then(function (allResults) { 169 | console.log(allResults); 170 | d.feed({ 171 | allResults, 172 | }); 173 | }); 174 | 175 | }; 176 | 177 | const addAggregatesStats = function (aggregates) { 178 | aggregates.meanTime = aggregates.totalComputationTime / aggregates.sampleSize; 179 | aggregates.setupTime = aggregates.totalTime - aggregates.totalComputationTime; 180 | }; 181 | 182 | const testWithoutWorker = function () { 183 | const aggregates = { 184 | title: `Without Web Worker`, 185 | totalComputationTime: 0, 186 | meanTime: 0, 187 | totalTime: 0, 188 | setupTime: 0, 189 | sampleSize: SAMPLE_SIZE, 190 | results: [], 191 | }; 192 | 193 | aggregates.totalTime = timeFunction(function () { 194 | doNTimes(function () { 195 | let piEstimation; 196 | const duration = timeFunction(function () { 197 | piEstimation = estimatePi(precision); 198 | }); 199 | aggregates.results.push({ 200 | precision, 201 | duration, 202 | piEstimation, 203 | }); 204 | aggregates.totalComputationTime += duration; 205 | }, SAMPLE_SIZE); 206 | }); 207 | addAggregatesStats(aggregates); 208 | 209 | return Promise.resolve(aggregates); 210 | }; 211 | 212 | 213 | const testWithRemoteServer = function () { 214 | const aggregates = { 215 | title: `With Remote Server (delay 50ms)`, 216 | totalComputationTime: 0, 217 | meanTime: 0, 218 | totalTime: 0, 219 | setupTime: 0, 220 | sampleSize: SAMPLE_SIZE, 221 | results: [], 222 | }; 223 | 224 | const remoteSeverWork = function () { 225 | return timePromise(function () { 226 | return fetch(`../estimatePi?input=${precision}`, {}).then(function (response) { 227 | return response.text(); 228 | }).then(function (resultString) { 229 | const result = Number(resultString); 230 | return result; 231 | }); 232 | }).then(function ({ timeElapsed, value }) { 233 | aggregates.totalComputationTime += timeElapsed; 234 | return { 235 | precision, 236 | duration: timeElapsed, 237 | piEstimation: value, 238 | }; 239 | }); 240 | }; 241 | 242 | return timePromise(function () { 243 | return chainPromiseNTimes(remoteSeverWork, SAMPLE_SIZE); 244 | }).then(function ({ timeElapsed, value }) { 245 | aggregates.results = value; 246 | aggregates.totalTime = timeElapsed; 247 | addAggregatesStats(aggregates); 248 | return aggregates; 249 | }); 250 | }; 251 | 252 | const testWithRawWorker = function () { 253 | const aggregates = { 254 | title: `With Raw Web Worker`, 255 | totalComputationTime: 0, 256 | meanTime: 0, 257 | totalTime: 0, 258 | setupTime: 0, 259 | sampleSize: SAMPLE_SIZE, 260 | results: [], 261 | }; 262 | 263 | const rawWorkerWork = function () { 264 | return new Promise(function (resolve) { 265 | const startTime = getReferenceTime(); 266 | const worker = new Worker(ESTIMATEPI_RAW_WORKER_URL); 267 | worker.addEventListener(`message`, function (event) { 268 | const message = event.data; 269 | if (Object.hasOwn(message, `result`)) { 270 | const piEstimation = message.result; 271 | const endTime = getReferenceTime(); 272 | const duration = endTime - startTime; 273 | 274 | worker.terminate(); 275 | aggregates.totalComputationTime += duration; 276 | resolve({ 277 | precision, 278 | duration, 279 | piEstimation, 280 | }); 281 | } 282 | }); 283 | 284 | worker.postMessage({ 285 | action: ESTIMATE_PI_ACTION, 286 | input: precision, 287 | }); 288 | }); 289 | }; 290 | 291 | return timePromise(function () { 292 | return chainPromiseNTimes(rawWorkerWork, SAMPLE_SIZE); 293 | }).then(function ({ timeElapsed, value }) { 294 | aggregates.results = value; 295 | aggregates.totalTime = timeElapsed; 296 | addAggregatesStats(aggregates); 297 | return aggregates; 298 | }); 299 | }; 300 | 301 | const testWithWorkerCreatedEveryTime = function () { 302 | const aggregates = { 303 | title: `With Web Worker Created every time (worka)`, 304 | totalComputationTime: 0, 305 | meanTime: 0, 306 | totalTime: 0, 307 | setupTime: 0, 308 | sampleSize: SAMPLE_SIZE, 309 | results: [], 310 | }; 311 | 312 | const workerWork = function () { 313 | return timePromise(function () { 314 | return work({ name: `getPiEstimationForceRestart`, input: precision }).catch(console.error); 315 | }).then(function ({ timeElapsed, value }) { 316 | aggregates.totalComputationTime += timeElapsed; 317 | return { 318 | precision, 319 | duration: timeElapsed, 320 | piEstimation: value, 321 | }; 322 | }); 323 | }; 324 | 325 | return timePromise(function () { 326 | return chainPromiseNTimes(workerWork, SAMPLE_SIZE); 327 | }).then(function ({ timeElapsed, value }) { 328 | aggregates.results = value; 329 | aggregates.totalTime = timeElapsed; 330 | addAggregatesStats(aggregates); 331 | return aggregates; 332 | }); 333 | }; 334 | 335 | const testWithWorker = function () { 336 | const aggregates = { 337 | title: `With Web Worker (worka)`, 338 | totalComputationTime: 0, 339 | meanTime: 0, 340 | totalTime: 0, 341 | setupTime: 0, 342 | sampleSize: SAMPLE_SIZE, 343 | results: [], 344 | }; 345 | 346 | const workerWork = function () { 347 | return timePromise(function () { 348 | return work({ name: `getPiEstimation`, input: precision }).catch(console.error); 349 | }).then(function ({ timeElapsed, value }) { 350 | aggregates.totalComputationTime += timeElapsed; 351 | return { 352 | precision, 353 | duration: timeElapsed, 354 | piEstimation: value, 355 | }; 356 | }); 357 | }; 358 | 359 | return timePromise(function () { 360 | return chainPromiseNTimes(workerWork, SAMPLE_SIZE); 361 | }).then(function ({ timeElapsed, value }) { 362 | aggregates.results = value; 363 | aggregates.totalTime = timeElapsed; 364 | addAggregatesStats(aggregates); 365 | return aggregates; 366 | }); 367 | }; 368 | 369 | const testWithWorkerAutoSplit = function () { 370 | const aggregates = { 371 | title: `With Web Worker auto split (worka)`, 372 | totalComputationTime: 0, 373 | meanTime: 0, 374 | totalTime: 0, 375 | setupTime: 0, 376 | sampleSize: SAMPLE_SIZE, 377 | results: [], 378 | }; 379 | 380 | const workerWork = function () { 381 | return timePromise(function () { 382 | return work({ name: `getPiEstimation`, input: precision }).catch(console.error); 383 | }).then(function ({ timeElapsed, value }) { 384 | aggregates.totalComputationTime += timeElapsed; 385 | return { 386 | precision, 387 | duration: timeElapsed, 388 | piEstimation: value, 389 | }; 390 | }); 391 | }; 392 | 393 | return timePromise(function () { 394 | const allPromises = Array.from({length: SAMPLE_SIZE}, workerWork); 395 | return Promise.all(allPromises); 396 | }).then(function ({ timeElapsed, value }) { 397 | aggregates.results = value; 398 | aggregates.totalTime = timeElapsed; 399 | addAggregatesStats(aggregates); 400 | return aggregates; 401 | }); 402 | }; 403 | 404 | d.feed({ 405 | precisionLevel: INITIAL_PRECISION_LEVEL, 406 | }); 407 | d.start(); 408 | -------------------------------------------------------------------------------- /examples/index.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from "node:url"; 2 | import { dirname } from "node:path"; 3 | import polka from "polka"; 4 | import serveStatic from "serve-static"; 5 | import { estimatePi } from "./estimatePi/estimatePi.js"; 6 | import { makeSendFileAvailable } from "./sendFile.js"; 7 | 8 | 9 | const __filename = fileURLToPath(import.meta.url); 10 | const __dirname = dirname(__filename); 11 | const parent = dirname(__dirname); 12 | const serveStaticHere = serveStatic(parent); 13 | 14 | const commandLineInput = process.argv.slice(2); 15 | const [port] = commandLineInput; 16 | const ARTIFICIAL_DELAY = 50; // ms 17 | const EXPLANATION = `using artificial delay to simulate real network: ` + ARTIFICIAL_DELAY + `ms`; 18 | 19 | const PORT = port || 3000; 20 | const realSimulation = true; 21 | const app = polka(); 22 | 23 | 24 | app.get(`/examples/estimatePi`, function (req, res) { 25 | const {query} = req; 26 | if (!Object.hasOwn(query, `input`)) { 27 | res.status(400); 28 | res.end(); 29 | return; 30 | } 31 | const {input} = query; 32 | const precision = parseInt(input, 10); 33 | if (!isFinite(precision)) { 34 | res.status(400); 35 | res.end(); 36 | return; 37 | } 38 | let stringToSend; 39 | if (realSimulation) { 40 | stringToSend = String(estimatePi(precision)); 41 | } else { 42 | stringToSend = String(Math.PI); 43 | } 44 | console.log(EXPLANATION); 45 | setTimeout(function () { 46 | res.end(stringToSend); 47 | }, ARTIFICIAL_DELAY); 48 | 49 | }); 50 | 51 | app.get(`/examples/estimatePi/estimatePiWorkerNoCache.js`, function (req, res) { 52 | // force no cache, to get an idea how much it is helping 53 | console.log(EXPLANATION); 54 | setTimeout(function () { 55 | res.sendFile(`${__dirname}/estimatePiWorker.js`, { 56 | lastModified: false, 57 | cacheControl: false, 58 | etag: false, 59 | }); 60 | }, ARTIFICIAL_DELAY); 61 | 62 | 63 | }); 64 | app.get(`/examples/estimatePi/estimatePiWorker.js`, function (req, res) { 65 | console.log(`estimatePiWorker.js from network `); 66 | console.log(EXPLANATION); 67 | setTimeout(function () { 68 | res.sendFile(`${__dirname}/estimatePiWorker.js`, { 69 | maxAge: 120000, 70 | }); 71 | }, ARTIFICIAL_DELAY); 72 | }); 73 | 74 | app.use(serveStaticHere); 75 | app.use(makeSendFileAvailable); 76 | app.listen(PORT, function () { 77 | console.log( 78 | `Example app listening on port ${PORT}! , 79 | open one of 80 | http://localhost:${PORT}/examples/estimatePi/example.html 81 | 82 | http://localhost:${PORT}/examples/basic/worka.html 83 | http://localhost:${PORT}/examples/basic/workaRunTimeError.html 84 | http://localhost:${PORT}/examples/basic/workaSyntaxError.html 85 | 86 | http://localhost:${PORT}/examples/arrayHelpers/mapParallel.html 87 | `, 88 | ); 89 | }); 90 | -------------------------------------------------------------------------------- /examples/node/file_usage.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, pathToFileURL } from "node:url"; 2 | import { dirname } from "node:path"; 3 | import "./patchNodeWorker.js"; 4 | import { registerWorker, FILE, NO_SUPPORT_ERROR, TIME_OUT_ERROR, work } from "../../source/worka.js"; 5 | 6 | 7 | const __filename = fileURLToPath(import.meta.url); 8 | const __dirname = dirname(__filename); 9 | 10 | console.log(pathToFileURL(`${__dirname}/../../sort_worka.js`).href); 11 | // console.log(`file:///C:/files/worka/sort_worka.js`) 12 | 13 | registerWorker({ 14 | name: `sort`, 15 | /* Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only file and data URLs are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'c:' */ 16 | resource: pathToFileURL(`${__dirname}/../../sort_worka.js`).href, 17 | 18 | /* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must be absolute */ 19 | // resource: `file:///C/files/worka/sort_worka.js`, 20 | 21 | /* TypeError [ERR_INVALID_URL_SCHEME]: The URL must be of scheme file */ 22 | // resource: `${__dirname}/../../sort_worka.js`, 23 | loadMode: FILE, 24 | hope: 0, 25 | timeout: 100, 26 | }); 27 | 28 | work({ name: `sort`, input: [1, 2, 3, -8, -5, 2, 3, 45, 5] }).then(function (result) { 29 | console.log(result); 30 | console.log(`after success`); 31 | }).catch(error => { 32 | if (error === NO_SUPPORT_ERROR) { 33 | console.error(`missing support`); 34 | } else if (error === TIME_OUT_ERROR) { 35 | console.error(`time out error`); 36 | } else { 37 | console.error(error); 38 | } 39 | }); 40 | -------------------------------------------------------------------------------- /examples/node/patchNodeWorker.js: -------------------------------------------------------------------------------- 1 | // incomatible with regular web worker 2 | // import { Worker } from "worker_threads"; // node (core module) 10+ 3 | 4 | import Worker from "node:web-worker"; 5 | 6 | // patch 7 | if (!global.Worker) { 8 | global.Worker = Worker; 9 | } 10 | -------------------------------------------------------------------------------- /examples/node/readme.md: -------------------------------------------------------------------------------- 1 | # use worka in NodeJs 2 | 3 | **Warning** Does not work 4 | 5 | - .addEventListener is not defined 6 | - self is not defined in a Worker 7 | 8 | https://github.com/nodejs/node/issues/28728 9 | -------------------------------------------------------------------------------- /examples/node/sort.js: -------------------------------------------------------------------------------- 1 | (array) => { 2 | array.sort(function (a, b) { 3 | return a - b; 4 | }); 5 | return array; 6 | }; 7 | -------------------------------------------------------------------------------- /examples/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "6.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@arr/every": { 8 | "version": "1.0.0", 9 | "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.0.tgz", 10 | "integrity": "sha1-MU+BaPUK5IoDLP2tX9tDb0ZKl6w=" 11 | }, 12 | "@polka/url": { 13 | "version": "0.5.0", 14 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", 15 | "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==" 16 | }, 17 | "debug": { 18 | "version": "2.6.9", 19 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 20 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 21 | "requires": { 22 | "ms": "2.0.0" 23 | }, 24 | "dependencies": { 25 | "ms": { 26 | "version": "2.0.0", 27 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 28 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 29 | } 30 | } 31 | }, 32 | "depd": { 33 | "version": "1.1.2", 34 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 35 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 36 | }, 37 | "destroy": { 38 | "version": "1.0.4", 39 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 40 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 41 | }, 42 | "dom99": { 43 | "version": "21.1.3", 44 | "resolved": "https://registry.npmjs.org/dom99/-/dom99-21.1.3.tgz", 45 | "integrity": "sha512-2KTuvK9nWNRy5WXVNRJ1fb016NbV5OYJJZOe/Qyc+xHAkjjNuJrtNr8u82aSeWJ3ifYwLjcEj3oTnamAkdULwA==" 46 | }, 47 | "ee-first": { 48 | "version": "1.1.1", 49 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 50 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 51 | }, 52 | "encodeurl": { 53 | "version": "1.0.2", 54 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 55 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 56 | }, 57 | "escape-html": { 58 | "version": "1.0.3", 59 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 60 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 61 | }, 62 | "etag": { 63 | "version": "1.8.1", 64 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 65 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 66 | }, 67 | "fresh": { 68 | "version": "0.5.2", 69 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 70 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 71 | }, 72 | "http-errors": { 73 | "version": "1.7.3", 74 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 75 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 76 | "requires": { 77 | "depd": "~1.1.2", 78 | "inherits": "2.0.4", 79 | "setprototypeof": "1.1.1", 80 | "statuses": ">= 1.5.0 < 2", 81 | "toidentifier": "1.0.0" 82 | } 83 | }, 84 | "inherits": { 85 | "version": "2.0.4", 86 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 87 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 88 | }, 89 | "matchit": { 90 | "version": "1.0.8", 91 | "resolved": "https://registry.npmjs.org/matchit/-/matchit-1.0.8.tgz", 92 | "integrity": "sha512-CwPPICzozd/ezCzpVwGYG5bMVieaapnA0vvHDQnmQ2u2vZtVLynoPmvFsZjL67hFOvTBhhpqSR0bq3uloDP/Rw==", 93 | "requires": { 94 | "@arr/every": "^1.0.0" 95 | } 96 | }, 97 | "mime": { 98 | "version": "1.6.0", 99 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 100 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 101 | }, 102 | "ms": { 103 | "version": "2.1.1", 104 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 105 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 106 | }, 107 | "on-finished": { 108 | "version": "2.3.0", 109 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 110 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 111 | "requires": { 112 | "ee-first": "1.1.1" 113 | } 114 | }, 115 | "parseurl": { 116 | "version": "1.3.3", 117 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 118 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 119 | }, 120 | "polka": { 121 | "version": "0.5.2", 122 | "resolved": "https://registry.npmjs.org/polka/-/polka-0.5.2.tgz", 123 | "integrity": "sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==", 124 | "requires": { 125 | "@polka/url": "^0.5.0", 126 | "trouter": "^2.0.1" 127 | } 128 | }, 129 | "promise-memoize": { 130 | "version": "1.2.1", 131 | "resolved": "https://registry.npmjs.org/promise-memoize/-/promise-memoize-1.2.1.tgz", 132 | "integrity": "sha1-cflVSpic9r+Jh7Q6UhMtXHkxJlc=" 133 | }, 134 | "range-parser": { 135 | "version": "1.2.1", 136 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 137 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 138 | }, 139 | "send": { 140 | "version": "0.17.1", 141 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 142 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 143 | "requires": { 144 | "debug": "2.6.9", 145 | "depd": "~1.1.2", 146 | "destroy": "~1.0.4", 147 | "encodeurl": "~1.0.2", 148 | "escape-html": "~1.0.3", 149 | "etag": "~1.8.1", 150 | "fresh": "0.5.2", 151 | "http-errors": "~1.7.2", 152 | "mime": "1.6.0", 153 | "ms": "2.1.1", 154 | "on-finished": "~2.3.0", 155 | "range-parser": "~1.2.1", 156 | "statuses": "~1.5.0" 157 | } 158 | }, 159 | "serve-static": { 160 | "version": "1.14.1", 161 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 162 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 163 | "requires": { 164 | "encodeurl": "~1.0.2", 165 | "escape-html": "~1.0.3", 166 | "parseurl": "~1.3.3", 167 | "send": "0.17.1" 168 | } 169 | }, 170 | "setprototypeof": { 171 | "version": "1.1.1", 172 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 173 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 174 | }, 175 | "statuses": { 176 | "version": "1.5.0", 177 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 178 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 179 | }, 180 | "toidentifier": { 181 | "version": "1.0.0", 182 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 183 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 184 | }, 185 | "trouter": { 186 | "version": "2.0.1", 187 | "resolved": "https://registry.npmjs.org/trouter/-/trouter-2.0.1.tgz", 188 | "integrity": "sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==", 189 | "requires": { 190 | "matchit": "^1.0.0" 191 | } 192 | }, 193 | "utilsac": { 194 | "version": "13.0.1", 195 | "resolved": "https://registry.npmjs.org/utilsac/-/utilsac-13.0.1.tgz", 196 | "integrity": "sha512-jQtIB09CcPEYvFcK2RH1wM8pHNR8XCZ6I5GfNO9kjyZW8H7smRgCF4cs59yRwxkbesUg0EIhYvhiQKiO/GgNNA==" 197 | } 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /examples/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "type": "module", 4 | "version": "6.0.2", 5 | "dependencies": { 6 | "dom99": "^21.1.3", 7 | "polka": "^0.5.2", 8 | "promise-memoize": "^1.2.1", 9 | "serve-static": "^1.14.1", 10 | "utilsac": "^13.0.1" 11 | }, 12 | "private": true 13 | } 14 | -------------------------------------------------------------------------------- /examples/sendFile.js: -------------------------------------------------------------------------------- 1 | export { makeSendFileAvailable }; 2 | 3 | import { createReadStream } from "node:fs"; 4 | 5 | 6 | // probably not the right way to do it 7 | // todo 8 | const makeSendFileAvailable = function (req, res, next) { 9 | res.sendFile = sendFile.bind(undefined, res); 10 | next(); 11 | }; 12 | 13 | const sendFile = function (res, filePath) { 14 | createReadStream(filePath).pipe(res); 15 | }; 16 | 17 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "worka", 3 | "version": "12.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "worka", 9 | "version": "12.0.0", 10 | "license": "BSL-1.0", 11 | "devDependencies": { 12 | "eslint": "^8.5.0", 13 | "eslint-config-red": "^1.9.0", 14 | "filesac": "^13.0.0", 15 | "rollup": "^2.61.1" 16 | } 17 | }, 18 | "node_modules/@eslint/eslintrc": { 19 | "version": "1.0.5", 20 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", 21 | "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", 22 | "dev": true, 23 | "dependencies": { 24 | "ajv": "^6.12.4", 25 | "debug": "^4.3.2", 26 | "espree": "^9.2.0", 27 | "globals": "^13.9.0", 28 | "ignore": "^4.0.6", 29 | "import-fresh": "^3.2.1", 30 | "js-yaml": "^4.1.0", 31 | "minimatch": "^3.0.4", 32 | "strip-json-comments": "^3.1.1" 33 | }, 34 | "engines": { 35 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 36 | } 37 | }, 38 | "node_modules/@humanwhocodes/config-array": { 39 | "version": "0.9.2", 40 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", 41 | "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", 42 | "dev": true, 43 | "dependencies": { 44 | "@humanwhocodes/object-schema": "^1.2.1", 45 | "debug": "^4.1.1", 46 | "minimatch": "^3.0.4" 47 | }, 48 | "engines": { 49 | "node": ">=10.10.0" 50 | } 51 | }, 52 | "node_modules/@humanwhocodes/object-schema": { 53 | "version": "1.2.1", 54 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 55 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 56 | "dev": true 57 | }, 58 | "node_modules/acorn": { 59 | "version": "8.6.0", 60 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", 61 | "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", 62 | "dev": true, 63 | "bin": { 64 | "acorn": "bin/acorn" 65 | }, 66 | "engines": { 67 | "node": ">=0.4.0" 68 | } 69 | }, 70 | "node_modules/acorn-jsx": { 71 | "version": "5.3.2", 72 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 73 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 74 | "dev": true, 75 | "peerDependencies": { 76 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 77 | } 78 | }, 79 | "node_modules/ajv": { 80 | "version": "6.12.6", 81 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 82 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 83 | "dev": true, 84 | "dependencies": { 85 | "fast-deep-equal": "^3.1.1", 86 | "fast-json-stable-stringify": "^2.0.0", 87 | "json-schema-traverse": "^0.4.1", 88 | "uri-js": "^4.2.2" 89 | }, 90 | "funding": { 91 | "type": "github", 92 | "url": "https://github.com/sponsors/epoberezkin" 93 | } 94 | }, 95 | "node_modules/ansi-colors": { 96 | "version": "4.1.1", 97 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 98 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 99 | "dev": true, 100 | "engines": { 101 | "node": ">=6" 102 | } 103 | }, 104 | "node_modules/ansi-regex": { 105 | "version": "5.0.1", 106 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 107 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 108 | "dev": true, 109 | "engines": { 110 | "node": ">=8" 111 | } 112 | }, 113 | "node_modules/argparse": { 114 | "version": "2.0.1", 115 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 116 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 117 | "dev": true 118 | }, 119 | "node_modules/balanced-match": { 120 | "version": "1.0.2", 121 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 122 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 123 | "dev": true 124 | }, 125 | "node_modules/brace-expansion": { 126 | "version": "1.1.11", 127 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 128 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 129 | "dev": true, 130 | "dependencies": { 131 | "balanced-match": "^1.0.0", 132 | "concat-map": "0.0.1" 133 | } 134 | }, 135 | "node_modules/callsites": { 136 | "version": "3.1.0", 137 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 138 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 139 | "dev": true, 140 | "engines": { 141 | "node": ">=6" 142 | } 143 | }, 144 | "node_modules/chalk": { 145 | "version": "4.1.0", 146 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 147 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 148 | "dev": true, 149 | "dependencies": { 150 | "ansi-styles": "^4.1.0", 151 | "supports-color": "^7.1.0" 152 | }, 153 | "engines": { 154 | "node": ">=10" 155 | }, 156 | "funding": { 157 | "url": "https://github.com/chalk/chalk?sponsor=1" 158 | } 159 | }, 160 | "node_modules/chalk/node_modules/ansi-styles": { 161 | "version": "4.3.0", 162 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 163 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 164 | "dev": true, 165 | "dependencies": { 166 | "color-convert": "^2.0.1" 167 | }, 168 | "engines": { 169 | "node": ">=8" 170 | }, 171 | "funding": { 172 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 173 | } 174 | }, 175 | "node_modules/chalk/node_modules/color-convert": { 176 | "version": "2.0.1", 177 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 178 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 179 | "dev": true, 180 | "dependencies": { 181 | "color-name": "~1.1.4" 182 | }, 183 | "engines": { 184 | "node": ">=7.0.0" 185 | } 186 | }, 187 | "node_modules/chalk/node_modules/color-name": { 188 | "version": "1.1.4", 189 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 190 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 191 | "dev": true 192 | }, 193 | "node_modules/chalk/node_modules/has-flag": { 194 | "version": "4.0.0", 195 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 196 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 197 | "dev": true, 198 | "engines": { 199 | "node": ">=8" 200 | } 201 | }, 202 | "node_modules/chalk/node_modules/supports-color": { 203 | "version": "7.2.0", 204 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 205 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 206 | "dev": true, 207 | "dependencies": { 208 | "has-flag": "^4.0.0" 209 | }, 210 | "engines": { 211 | "node": ">=8" 212 | } 213 | }, 214 | "node_modules/concat-map": { 215 | "version": "0.0.1", 216 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 217 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 218 | "dev": true 219 | }, 220 | "node_modules/cross-spawn": { 221 | "version": "7.0.3", 222 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 223 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 224 | "dev": true, 225 | "dependencies": { 226 | "path-key": "^3.1.0", 227 | "shebang-command": "^2.0.0", 228 | "which": "^2.0.1" 229 | }, 230 | "engines": { 231 | "node": ">= 8" 232 | } 233 | }, 234 | "node_modules/debug": { 235 | "version": "4.3.3", 236 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 237 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 238 | "dev": true, 239 | "dependencies": { 240 | "ms": "2.1.2" 241 | }, 242 | "engines": { 243 | "node": ">=6.0" 244 | }, 245 | "peerDependenciesMeta": { 246 | "supports-color": { 247 | "optional": true 248 | } 249 | } 250 | }, 251 | "node_modules/deep-is": { 252 | "version": "0.1.3", 253 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 254 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 255 | "dev": true 256 | }, 257 | "node_modules/doctrine": { 258 | "version": "3.0.0", 259 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 260 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 261 | "dev": true, 262 | "dependencies": { 263 | "esutils": "^2.0.2" 264 | }, 265 | "engines": { 266 | "node": ">=6.0.0" 267 | } 268 | }, 269 | "node_modules/enquirer": { 270 | "version": "2.3.6", 271 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 272 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 273 | "dev": true, 274 | "dependencies": { 275 | "ansi-colors": "^4.1.1" 276 | }, 277 | "engines": { 278 | "node": ">=8.6" 279 | } 280 | }, 281 | "node_modules/eslint": { 282 | "version": "8.5.0", 283 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", 284 | "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", 285 | "dev": true, 286 | "dependencies": { 287 | "@eslint/eslintrc": "^1.0.5", 288 | "@humanwhocodes/config-array": "^0.9.2", 289 | "ajv": "^6.10.0", 290 | "chalk": "^4.0.0", 291 | "cross-spawn": "^7.0.2", 292 | "debug": "^4.3.2", 293 | "doctrine": "^3.0.0", 294 | "enquirer": "^2.3.5", 295 | "escape-string-regexp": "^4.0.0", 296 | "eslint-scope": "^7.1.0", 297 | "eslint-utils": "^3.0.0", 298 | "eslint-visitor-keys": "^3.1.0", 299 | "espree": "^9.2.0", 300 | "esquery": "^1.4.0", 301 | "esutils": "^2.0.2", 302 | "fast-deep-equal": "^3.1.3", 303 | "file-entry-cache": "^6.0.1", 304 | "functional-red-black-tree": "^1.0.1", 305 | "glob-parent": "^6.0.1", 306 | "globals": "^13.6.0", 307 | "ignore": "^4.0.6", 308 | "import-fresh": "^3.0.0", 309 | "imurmurhash": "^0.1.4", 310 | "is-glob": "^4.0.0", 311 | "js-yaml": "^4.1.0", 312 | "json-stable-stringify-without-jsonify": "^1.0.1", 313 | "levn": "^0.4.1", 314 | "lodash.merge": "^4.6.2", 315 | "minimatch": "^3.0.4", 316 | "natural-compare": "^1.4.0", 317 | "optionator": "^0.9.1", 318 | "progress": "^2.0.0", 319 | "regexpp": "^3.2.0", 320 | "semver": "^7.2.1", 321 | "strip-ansi": "^6.0.1", 322 | "strip-json-comments": "^3.1.0", 323 | "text-table": "^0.2.0", 324 | "v8-compile-cache": "^2.0.3" 325 | }, 326 | "bin": { 327 | "eslint": "bin/eslint.js" 328 | }, 329 | "engines": { 330 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 331 | }, 332 | "funding": { 333 | "url": "https://opencollective.com/eslint" 334 | } 335 | }, 336 | "node_modules/eslint-config-red": { 337 | "version": "1.9.0", 338 | "resolved": "https://registry.npmjs.org/eslint-config-red/-/eslint-config-red-1.9.0.tgz", 339 | "integrity": "sha512-bFE4eZBuO4gt/RGLjFGXmbAcFBb4vlFUQ/JWI9eMROJtcwTEJl6nJPz9DLcMrTc69AVBsjAbjFgyt5atR8gnXA==", 340 | "dev": true 341 | }, 342 | "node_modules/eslint-scope": { 343 | "version": "7.1.0", 344 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", 345 | "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", 346 | "dev": true, 347 | "dependencies": { 348 | "esrecurse": "^4.3.0", 349 | "estraverse": "^5.2.0" 350 | }, 351 | "engines": { 352 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 353 | } 354 | }, 355 | "node_modules/eslint-utils": { 356 | "version": "3.0.0", 357 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 358 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 359 | "dev": true, 360 | "dependencies": { 361 | "eslint-visitor-keys": "^2.0.0" 362 | }, 363 | "engines": { 364 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 365 | }, 366 | "funding": { 367 | "url": "https://github.com/sponsors/mysticatea" 368 | }, 369 | "peerDependencies": { 370 | "eslint": ">=5" 371 | } 372 | }, 373 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 374 | "version": "2.1.0", 375 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 376 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 377 | "dev": true, 378 | "engines": { 379 | "node": ">=10" 380 | } 381 | }, 382 | "node_modules/eslint-visitor-keys": { 383 | "version": "3.1.0", 384 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", 385 | "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", 386 | "dev": true, 387 | "engines": { 388 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 389 | } 390 | }, 391 | "node_modules/eslint/node_modules/escape-string-regexp": { 392 | "version": "4.0.0", 393 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 394 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 395 | "dev": true, 396 | "engines": { 397 | "node": ">=10" 398 | }, 399 | "funding": { 400 | "url": "https://github.com/sponsors/sindresorhus" 401 | } 402 | }, 403 | "node_modules/espree": { 404 | "version": "9.2.0", 405 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", 406 | "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", 407 | "dev": true, 408 | "dependencies": { 409 | "acorn": "^8.6.0", 410 | "acorn-jsx": "^5.3.1", 411 | "eslint-visitor-keys": "^3.1.0" 412 | }, 413 | "engines": { 414 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 415 | } 416 | }, 417 | "node_modules/esquery": { 418 | "version": "1.4.0", 419 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 420 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 421 | "dev": true, 422 | "dependencies": { 423 | "estraverse": "^5.1.0" 424 | }, 425 | "engines": { 426 | "node": ">=0.10" 427 | } 428 | }, 429 | "node_modules/esrecurse": { 430 | "version": "4.3.0", 431 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 432 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 433 | "dev": true, 434 | "dependencies": { 435 | "estraverse": "^5.2.0" 436 | }, 437 | "engines": { 438 | "node": ">=4.0" 439 | } 440 | }, 441 | "node_modules/estraverse": { 442 | "version": "5.3.0", 443 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 444 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 445 | "dev": true, 446 | "engines": { 447 | "node": ">=4.0" 448 | } 449 | }, 450 | "node_modules/esutils": { 451 | "version": "2.0.3", 452 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 453 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 454 | "dev": true, 455 | "engines": { 456 | "node": ">=0.10.0" 457 | } 458 | }, 459 | "node_modules/fast-deep-equal": { 460 | "version": "3.1.3", 461 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 462 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 463 | "dev": true 464 | }, 465 | "node_modules/fast-json-stable-stringify": { 466 | "version": "2.1.0", 467 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 468 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 469 | "dev": true 470 | }, 471 | "node_modules/fast-levenshtein": { 472 | "version": "2.0.6", 473 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 474 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 475 | "dev": true 476 | }, 477 | "node_modules/file-entry-cache": { 478 | "version": "6.0.1", 479 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 480 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 481 | "dev": true, 482 | "dependencies": { 483 | "flat-cache": "^3.0.4" 484 | }, 485 | "engines": { 486 | "node": "^10.12.0 || >=12.0.0" 487 | } 488 | }, 489 | "node_modules/filesac": { 490 | "version": "13.0.0", 491 | "resolved": "https://registry.npmjs.org/filesac/-/filesac-13.0.0.tgz", 492 | "integrity": "sha512-FobLQs+T1meN+iaG9+Gy+aeySno382ZRt9rl+9fB5qcyGPT5XcWazi0sraOiW9q9FxBi1rmi/AOeLQkNqX4xVQ==", 493 | "dev": true 494 | }, 495 | "node_modules/flat-cache": { 496 | "version": "3.0.4", 497 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 498 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 499 | "dev": true, 500 | "dependencies": { 501 | "flatted": "^3.1.0", 502 | "rimraf": "^3.0.2" 503 | }, 504 | "engines": { 505 | "node": "^10.12.0 || >=12.0.0" 506 | } 507 | }, 508 | "node_modules/flatted": { 509 | "version": "3.1.1", 510 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", 511 | "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", 512 | "dev": true 513 | }, 514 | "node_modules/fs.realpath": { 515 | "version": "1.0.0", 516 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 517 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 518 | "dev": true 519 | }, 520 | "node_modules/fsevents": { 521 | "version": "2.3.2", 522 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 523 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 524 | "dev": true, 525 | "hasInstallScript": true, 526 | "optional": true, 527 | "os": [ 528 | "darwin" 529 | ], 530 | "engines": { 531 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 532 | } 533 | }, 534 | "node_modules/functional-red-black-tree": { 535 | "version": "1.0.1", 536 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 537 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 538 | "dev": true 539 | }, 540 | "node_modules/glob": { 541 | "version": "7.1.6", 542 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 543 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 544 | "dev": true, 545 | "dependencies": { 546 | "fs.realpath": "^1.0.0", 547 | "inflight": "^1.0.4", 548 | "inherits": "2", 549 | "minimatch": "^3.0.4", 550 | "once": "^1.3.0", 551 | "path-is-absolute": "^1.0.0" 552 | }, 553 | "engines": { 554 | "node": "*" 555 | }, 556 | "funding": { 557 | "url": "https://github.com/sponsors/isaacs" 558 | } 559 | }, 560 | "node_modules/glob-parent": { 561 | "version": "6.0.2", 562 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 563 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 564 | "dev": true, 565 | "dependencies": { 566 | "is-glob": "^4.0.3" 567 | }, 568 | "engines": { 569 | "node": ">=10.13.0" 570 | } 571 | }, 572 | "node_modules/globals": { 573 | "version": "13.12.0", 574 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", 575 | "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", 576 | "dev": true, 577 | "dependencies": { 578 | "type-fest": "^0.20.2" 579 | }, 580 | "engines": { 581 | "node": ">=8" 582 | }, 583 | "funding": { 584 | "url": "https://github.com/sponsors/sindresorhus" 585 | } 586 | }, 587 | "node_modules/ignore": { 588 | "version": "4.0.6", 589 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 590 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 591 | "dev": true, 592 | "engines": { 593 | "node": ">= 4" 594 | } 595 | }, 596 | "node_modules/import-fresh": { 597 | "version": "3.3.0", 598 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 599 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 600 | "dev": true, 601 | "dependencies": { 602 | "parent-module": "^1.0.0", 603 | "resolve-from": "^4.0.0" 604 | }, 605 | "engines": { 606 | "node": ">=6" 607 | }, 608 | "funding": { 609 | "url": "https://github.com/sponsors/sindresorhus" 610 | } 611 | }, 612 | "node_modules/imurmurhash": { 613 | "version": "0.1.4", 614 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 615 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 616 | "dev": true, 617 | "engines": { 618 | "node": ">=0.8.19" 619 | } 620 | }, 621 | "node_modules/inflight": { 622 | "version": "1.0.6", 623 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 624 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 625 | "dev": true, 626 | "dependencies": { 627 | "once": "^1.3.0", 628 | "wrappy": "1" 629 | } 630 | }, 631 | "node_modules/inherits": { 632 | "version": "2.0.4", 633 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 634 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 635 | "dev": true 636 | }, 637 | "node_modules/is-extglob": { 638 | "version": "2.1.1", 639 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 640 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 641 | "dev": true, 642 | "engines": { 643 | "node": ">=0.10.0" 644 | } 645 | }, 646 | "node_modules/is-glob": { 647 | "version": "4.0.3", 648 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 649 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 650 | "dev": true, 651 | "dependencies": { 652 | "is-extglob": "^2.1.1" 653 | }, 654 | "engines": { 655 | "node": ">=0.10.0" 656 | } 657 | }, 658 | "node_modules/isexe": { 659 | "version": "2.0.0", 660 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 661 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 662 | "dev": true 663 | }, 664 | "node_modules/js-yaml": { 665 | "version": "4.1.0", 666 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 667 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 668 | "dev": true, 669 | "dependencies": { 670 | "argparse": "^2.0.1" 671 | }, 672 | "bin": { 673 | "js-yaml": "bin/js-yaml.js" 674 | } 675 | }, 676 | "node_modules/json-schema-traverse": { 677 | "version": "0.4.1", 678 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 679 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 680 | "dev": true 681 | }, 682 | "node_modules/json-stable-stringify-without-jsonify": { 683 | "version": "1.0.1", 684 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 685 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 686 | "dev": true 687 | }, 688 | "node_modules/levn": { 689 | "version": "0.4.1", 690 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 691 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 692 | "dev": true, 693 | "dependencies": { 694 | "prelude-ls": "^1.2.1", 695 | "type-check": "~0.4.0" 696 | }, 697 | "engines": { 698 | "node": ">= 0.8.0" 699 | } 700 | }, 701 | "node_modules/lodash.merge": { 702 | "version": "4.6.2", 703 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 704 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 705 | "dev": true 706 | }, 707 | "node_modules/lru-cache": { 708 | "version": "6.0.0", 709 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 710 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 711 | "dev": true, 712 | "dependencies": { 713 | "yallist": "^4.0.0" 714 | }, 715 | "engines": { 716 | "node": ">=10" 717 | } 718 | }, 719 | "node_modules/minimatch": { 720 | "version": "3.0.4", 721 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 722 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 723 | "dev": true, 724 | "dependencies": { 725 | "brace-expansion": "^1.1.7" 726 | }, 727 | "engines": { 728 | "node": "*" 729 | } 730 | }, 731 | "node_modules/ms": { 732 | "version": "2.1.2", 733 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 734 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 735 | "dev": true 736 | }, 737 | "node_modules/natural-compare": { 738 | "version": "1.4.0", 739 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 740 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 741 | "dev": true 742 | }, 743 | "node_modules/once": { 744 | "version": "1.4.0", 745 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 746 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 747 | "dev": true, 748 | "dependencies": { 749 | "wrappy": "1" 750 | } 751 | }, 752 | "node_modules/optionator": { 753 | "version": "0.9.1", 754 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 755 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 756 | "dev": true, 757 | "dependencies": { 758 | "deep-is": "^0.1.3", 759 | "fast-levenshtein": "^2.0.6", 760 | "levn": "^0.4.1", 761 | "prelude-ls": "^1.2.1", 762 | "type-check": "^0.4.0", 763 | "word-wrap": "^1.2.3" 764 | }, 765 | "engines": { 766 | "node": ">= 0.8.0" 767 | } 768 | }, 769 | "node_modules/parent-module": { 770 | "version": "1.0.1", 771 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 772 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 773 | "dev": true, 774 | "dependencies": { 775 | "callsites": "^3.0.0" 776 | }, 777 | "engines": { 778 | "node": ">=6" 779 | } 780 | }, 781 | "node_modules/path-is-absolute": { 782 | "version": "1.0.1", 783 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 784 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 785 | "dev": true, 786 | "engines": { 787 | "node": ">=0.10.0" 788 | } 789 | }, 790 | "node_modules/path-key": { 791 | "version": "3.1.1", 792 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 793 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 794 | "dev": true, 795 | "engines": { 796 | "node": ">=8" 797 | } 798 | }, 799 | "node_modules/prelude-ls": { 800 | "version": "1.2.1", 801 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 802 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 803 | "dev": true, 804 | "engines": { 805 | "node": ">= 0.8.0" 806 | } 807 | }, 808 | "node_modules/progress": { 809 | "version": "2.0.3", 810 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 811 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 812 | "dev": true, 813 | "engines": { 814 | "node": ">=0.4.0" 815 | } 816 | }, 817 | "node_modules/punycode": { 818 | "version": "2.1.1", 819 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 820 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 821 | "dev": true, 822 | "engines": { 823 | "node": ">=6" 824 | } 825 | }, 826 | "node_modules/regexpp": { 827 | "version": "3.2.0", 828 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 829 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 830 | "dev": true, 831 | "engines": { 832 | "node": ">=8" 833 | }, 834 | "funding": { 835 | "url": "https://github.com/sponsors/mysticatea" 836 | } 837 | }, 838 | "node_modules/resolve-from": { 839 | "version": "4.0.0", 840 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 841 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 842 | "dev": true, 843 | "engines": { 844 | "node": ">=4" 845 | } 846 | }, 847 | "node_modules/rimraf": { 848 | "version": "3.0.2", 849 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 850 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 851 | "dev": true, 852 | "dependencies": { 853 | "glob": "^7.1.3" 854 | }, 855 | "bin": { 856 | "rimraf": "bin.js" 857 | }, 858 | "funding": { 859 | "url": "https://github.com/sponsors/isaacs" 860 | } 861 | }, 862 | "node_modules/rollup": { 863 | "version": "2.61.1", 864 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz", 865 | "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==", 866 | "dev": true, 867 | "bin": { 868 | "rollup": "dist/bin/rollup" 869 | }, 870 | "engines": { 871 | "node": ">=10.0.0" 872 | }, 873 | "optionalDependencies": { 874 | "fsevents": "~2.3.2" 875 | } 876 | }, 877 | "node_modules/semver": { 878 | "version": "7.3.5", 879 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 880 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 881 | "dev": true, 882 | "dependencies": { 883 | "lru-cache": "^6.0.0" 884 | }, 885 | "bin": { 886 | "semver": "bin/semver.js" 887 | }, 888 | "engines": { 889 | "node": ">=10" 890 | } 891 | }, 892 | "node_modules/shebang-command": { 893 | "version": "2.0.0", 894 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 895 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 896 | "dev": true, 897 | "dependencies": { 898 | "shebang-regex": "^3.0.0" 899 | }, 900 | "engines": { 901 | "node": ">=8" 902 | } 903 | }, 904 | "node_modules/shebang-regex": { 905 | "version": "3.0.0", 906 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 907 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 908 | "dev": true, 909 | "engines": { 910 | "node": ">=8" 911 | } 912 | }, 913 | "node_modules/strip-ansi": { 914 | "version": "6.0.1", 915 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 916 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 917 | "dev": true, 918 | "dependencies": { 919 | "ansi-regex": "^5.0.1" 920 | }, 921 | "engines": { 922 | "node": ">=8" 923 | } 924 | }, 925 | "node_modules/strip-json-comments": { 926 | "version": "3.1.1", 927 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 928 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 929 | "dev": true, 930 | "engines": { 931 | "node": ">=8" 932 | }, 933 | "funding": { 934 | "url": "https://github.com/sponsors/sindresorhus" 935 | } 936 | }, 937 | "node_modules/text-table": { 938 | "version": "0.2.0", 939 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 940 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 941 | "dev": true 942 | }, 943 | "node_modules/type-check": { 944 | "version": "0.4.0", 945 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 946 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 947 | "dev": true, 948 | "dependencies": { 949 | "prelude-ls": "^1.2.1" 950 | }, 951 | "engines": { 952 | "node": ">= 0.8.0" 953 | } 954 | }, 955 | "node_modules/type-fest": { 956 | "version": "0.20.2", 957 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 958 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 959 | "dev": true, 960 | "engines": { 961 | "node": ">=10" 962 | }, 963 | "funding": { 964 | "url": "https://github.com/sponsors/sindresorhus" 965 | } 966 | }, 967 | "node_modules/uri-js": { 968 | "version": "4.4.1", 969 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 970 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 971 | "dev": true, 972 | "dependencies": { 973 | "punycode": "^2.1.0" 974 | } 975 | }, 976 | "node_modules/v8-compile-cache": { 977 | "version": "2.3.0", 978 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 979 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 980 | "dev": true 981 | }, 982 | "node_modules/which": { 983 | "version": "2.0.2", 984 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 985 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 986 | "dev": true, 987 | "dependencies": { 988 | "isexe": "^2.0.0" 989 | }, 990 | "bin": { 991 | "node-which": "bin/node-which" 992 | }, 993 | "engines": { 994 | "node": ">= 8" 995 | } 996 | }, 997 | "node_modules/word-wrap": { 998 | "version": "1.2.3", 999 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1000 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1001 | "dev": true, 1002 | "engines": { 1003 | "node": ">=0.10.0" 1004 | } 1005 | }, 1006 | "node_modules/wrappy": { 1007 | "version": "1.0.2", 1008 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1009 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1010 | "dev": true 1011 | }, 1012 | "node_modules/yallist": { 1013 | "version": "4.0.0", 1014 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1015 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1016 | "dev": true 1017 | } 1018 | }, 1019 | "dependencies": { 1020 | "@eslint/eslintrc": { 1021 | "version": "1.0.5", 1022 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", 1023 | "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", 1024 | "dev": true, 1025 | "requires": { 1026 | "ajv": "^6.12.4", 1027 | "debug": "^4.3.2", 1028 | "espree": "^9.2.0", 1029 | "globals": "^13.9.0", 1030 | "ignore": "^4.0.6", 1031 | "import-fresh": "^3.2.1", 1032 | "js-yaml": "^4.1.0", 1033 | "minimatch": "^3.0.4", 1034 | "strip-json-comments": "^3.1.1" 1035 | } 1036 | }, 1037 | "@humanwhocodes/config-array": { 1038 | "version": "0.9.2", 1039 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", 1040 | "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", 1041 | "dev": true, 1042 | "requires": { 1043 | "@humanwhocodes/object-schema": "^1.2.1", 1044 | "debug": "^4.1.1", 1045 | "minimatch": "^3.0.4" 1046 | } 1047 | }, 1048 | "@humanwhocodes/object-schema": { 1049 | "version": "1.2.1", 1050 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 1051 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 1052 | "dev": true 1053 | }, 1054 | "acorn": { 1055 | "version": "8.6.0", 1056 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", 1057 | "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", 1058 | "dev": true 1059 | }, 1060 | "acorn-jsx": { 1061 | "version": "5.3.2", 1062 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1063 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1064 | "dev": true, 1065 | "requires": {} 1066 | }, 1067 | "ajv": { 1068 | "version": "6.12.6", 1069 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1070 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1071 | "dev": true, 1072 | "requires": { 1073 | "fast-deep-equal": "^3.1.1", 1074 | "fast-json-stable-stringify": "^2.0.0", 1075 | "json-schema-traverse": "^0.4.1", 1076 | "uri-js": "^4.2.2" 1077 | } 1078 | }, 1079 | "ansi-colors": { 1080 | "version": "4.1.1", 1081 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 1082 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 1083 | "dev": true 1084 | }, 1085 | "ansi-regex": { 1086 | "version": "5.0.1", 1087 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1088 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1089 | "dev": true 1090 | }, 1091 | "argparse": { 1092 | "version": "2.0.1", 1093 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1094 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1095 | "dev": true 1096 | }, 1097 | "balanced-match": { 1098 | "version": "1.0.2", 1099 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1100 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1101 | "dev": true 1102 | }, 1103 | "brace-expansion": { 1104 | "version": "1.1.11", 1105 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1106 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1107 | "dev": true, 1108 | "requires": { 1109 | "balanced-match": "^1.0.0", 1110 | "concat-map": "0.0.1" 1111 | } 1112 | }, 1113 | "callsites": { 1114 | "version": "3.1.0", 1115 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1116 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1117 | "dev": true 1118 | }, 1119 | "chalk": { 1120 | "version": "4.1.0", 1121 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 1122 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 1123 | "dev": true, 1124 | "requires": { 1125 | "ansi-styles": "^4.1.0", 1126 | "supports-color": "^7.1.0" 1127 | }, 1128 | "dependencies": { 1129 | "ansi-styles": { 1130 | "version": "4.3.0", 1131 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1132 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1133 | "dev": true, 1134 | "requires": { 1135 | "color-convert": "^2.0.1" 1136 | } 1137 | }, 1138 | "color-convert": { 1139 | "version": "2.0.1", 1140 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1141 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1142 | "dev": true, 1143 | "requires": { 1144 | "color-name": "~1.1.4" 1145 | } 1146 | }, 1147 | "color-name": { 1148 | "version": "1.1.4", 1149 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1150 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1151 | "dev": true 1152 | }, 1153 | "has-flag": { 1154 | "version": "4.0.0", 1155 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1156 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1157 | "dev": true 1158 | }, 1159 | "supports-color": { 1160 | "version": "7.2.0", 1161 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1162 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1163 | "dev": true, 1164 | "requires": { 1165 | "has-flag": "^4.0.0" 1166 | } 1167 | } 1168 | } 1169 | }, 1170 | "concat-map": { 1171 | "version": "0.0.1", 1172 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1173 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1174 | "dev": true 1175 | }, 1176 | "cross-spawn": { 1177 | "version": "7.0.3", 1178 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1179 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1180 | "dev": true, 1181 | "requires": { 1182 | "path-key": "^3.1.0", 1183 | "shebang-command": "^2.0.0", 1184 | "which": "^2.0.1" 1185 | } 1186 | }, 1187 | "debug": { 1188 | "version": "4.3.3", 1189 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 1190 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 1191 | "dev": true, 1192 | "requires": { 1193 | "ms": "2.1.2" 1194 | } 1195 | }, 1196 | "deep-is": { 1197 | "version": "0.1.3", 1198 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 1199 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 1200 | "dev": true 1201 | }, 1202 | "doctrine": { 1203 | "version": "3.0.0", 1204 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1205 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1206 | "dev": true, 1207 | "requires": { 1208 | "esutils": "^2.0.2" 1209 | } 1210 | }, 1211 | "enquirer": { 1212 | "version": "2.3.6", 1213 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 1214 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 1215 | "dev": true, 1216 | "requires": { 1217 | "ansi-colors": "^4.1.1" 1218 | } 1219 | }, 1220 | "eslint": { 1221 | "version": "8.5.0", 1222 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", 1223 | "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", 1224 | "dev": true, 1225 | "requires": { 1226 | "@eslint/eslintrc": "^1.0.5", 1227 | "@humanwhocodes/config-array": "^0.9.2", 1228 | "ajv": "^6.10.0", 1229 | "chalk": "^4.0.0", 1230 | "cross-spawn": "^7.0.2", 1231 | "debug": "^4.3.2", 1232 | "doctrine": "^3.0.0", 1233 | "enquirer": "^2.3.5", 1234 | "escape-string-regexp": "^4.0.0", 1235 | "eslint-scope": "^7.1.0", 1236 | "eslint-utils": "^3.0.0", 1237 | "eslint-visitor-keys": "^3.1.0", 1238 | "espree": "^9.2.0", 1239 | "esquery": "^1.4.0", 1240 | "esutils": "^2.0.2", 1241 | "fast-deep-equal": "^3.1.3", 1242 | "file-entry-cache": "^6.0.1", 1243 | "functional-red-black-tree": "^1.0.1", 1244 | "glob-parent": "^6.0.1", 1245 | "globals": "^13.6.0", 1246 | "ignore": "^4.0.6", 1247 | "import-fresh": "^3.0.0", 1248 | "imurmurhash": "^0.1.4", 1249 | "is-glob": "^4.0.0", 1250 | "js-yaml": "^4.1.0", 1251 | "json-stable-stringify-without-jsonify": "^1.0.1", 1252 | "levn": "^0.4.1", 1253 | "lodash.merge": "^4.6.2", 1254 | "minimatch": "^3.0.4", 1255 | "natural-compare": "^1.4.0", 1256 | "optionator": "^0.9.1", 1257 | "progress": "^2.0.0", 1258 | "regexpp": "^3.2.0", 1259 | "semver": "^7.2.1", 1260 | "strip-ansi": "^6.0.1", 1261 | "strip-json-comments": "^3.1.0", 1262 | "text-table": "^0.2.0", 1263 | "v8-compile-cache": "^2.0.3" 1264 | }, 1265 | "dependencies": { 1266 | "escape-string-regexp": { 1267 | "version": "4.0.0", 1268 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1269 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1270 | "dev": true 1271 | } 1272 | } 1273 | }, 1274 | "eslint-config-red": { 1275 | "version": "1.9.0", 1276 | "resolved": "https://registry.npmjs.org/eslint-config-red/-/eslint-config-red-1.9.0.tgz", 1277 | "integrity": "sha512-bFE4eZBuO4gt/RGLjFGXmbAcFBb4vlFUQ/JWI9eMROJtcwTEJl6nJPz9DLcMrTc69AVBsjAbjFgyt5atR8gnXA==", 1278 | "dev": true 1279 | }, 1280 | "eslint-scope": { 1281 | "version": "7.1.0", 1282 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", 1283 | "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", 1284 | "dev": true, 1285 | "requires": { 1286 | "esrecurse": "^4.3.0", 1287 | "estraverse": "^5.2.0" 1288 | } 1289 | }, 1290 | "eslint-utils": { 1291 | "version": "3.0.0", 1292 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 1293 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 1294 | "dev": true, 1295 | "requires": { 1296 | "eslint-visitor-keys": "^2.0.0" 1297 | }, 1298 | "dependencies": { 1299 | "eslint-visitor-keys": { 1300 | "version": "2.1.0", 1301 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1302 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1303 | "dev": true 1304 | } 1305 | } 1306 | }, 1307 | "eslint-visitor-keys": { 1308 | "version": "3.1.0", 1309 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", 1310 | "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", 1311 | "dev": true 1312 | }, 1313 | "espree": { 1314 | "version": "9.2.0", 1315 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", 1316 | "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", 1317 | "dev": true, 1318 | "requires": { 1319 | "acorn": "^8.6.0", 1320 | "acorn-jsx": "^5.3.1", 1321 | "eslint-visitor-keys": "^3.1.0" 1322 | } 1323 | }, 1324 | "esquery": { 1325 | "version": "1.4.0", 1326 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 1327 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 1328 | "dev": true, 1329 | "requires": { 1330 | "estraverse": "^5.1.0" 1331 | } 1332 | }, 1333 | "esrecurse": { 1334 | "version": "4.3.0", 1335 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1336 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1337 | "dev": true, 1338 | "requires": { 1339 | "estraverse": "^5.2.0" 1340 | } 1341 | }, 1342 | "estraverse": { 1343 | "version": "5.3.0", 1344 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1345 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1346 | "dev": true 1347 | }, 1348 | "esutils": { 1349 | "version": "2.0.3", 1350 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1351 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1352 | "dev": true 1353 | }, 1354 | "fast-deep-equal": { 1355 | "version": "3.1.3", 1356 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1357 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1358 | "dev": true 1359 | }, 1360 | "fast-json-stable-stringify": { 1361 | "version": "2.1.0", 1362 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1363 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1364 | "dev": true 1365 | }, 1366 | "fast-levenshtein": { 1367 | "version": "2.0.6", 1368 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1369 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1370 | "dev": true 1371 | }, 1372 | "file-entry-cache": { 1373 | "version": "6.0.1", 1374 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1375 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1376 | "dev": true, 1377 | "requires": { 1378 | "flat-cache": "^3.0.4" 1379 | } 1380 | }, 1381 | "filesac": { 1382 | "version": "13.0.0", 1383 | "resolved": "https://registry.npmjs.org/filesac/-/filesac-13.0.0.tgz", 1384 | "integrity": "sha512-FobLQs+T1meN+iaG9+Gy+aeySno382ZRt9rl+9fB5qcyGPT5XcWazi0sraOiW9q9FxBi1rmi/AOeLQkNqX4xVQ==", 1385 | "dev": true 1386 | }, 1387 | "flat-cache": { 1388 | "version": "3.0.4", 1389 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1390 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1391 | "dev": true, 1392 | "requires": { 1393 | "flatted": "^3.1.0", 1394 | "rimraf": "^3.0.2" 1395 | } 1396 | }, 1397 | "flatted": { 1398 | "version": "3.1.1", 1399 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", 1400 | "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", 1401 | "dev": true 1402 | }, 1403 | "fs.realpath": { 1404 | "version": "1.0.0", 1405 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1406 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1407 | "dev": true 1408 | }, 1409 | "fsevents": { 1410 | "version": "2.3.2", 1411 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1412 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1413 | "dev": true, 1414 | "optional": true 1415 | }, 1416 | "functional-red-black-tree": { 1417 | "version": "1.0.1", 1418 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1419 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1420 | "dev": true 1421 | }, 1422 | "glob": { 1423 | "version": "7.1.6", 1424 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1425 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1426 | "dev": true, 1427 | "requires": { 1428 | "fs.realpath": "^1.0.0", 1429 | "inflight": "^1.0.4", 1430 | "inherits": "2", 1431 | "minimatch": "^3.0.4", 1432 | "once": "^1.3.0", 1433 | "path-is-absolute": "^1.0.0" 1434 | } 1435 | }, 1436 | "glob-parent": { 1437 | "version": "6.0.2", 1438 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1439 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1440 | "dev": true, 1441 | "requires": { 1442 | "is-glob": "^4.0.3" 1443 | } 1444 | }, 1445 | "globals": { 1446 | "version": "13.12.0", 1447 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", 1448 | "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", 1449 | "dev": true, 1450 | "requires": { 1451 | "type-fest": "^0.20.2" 1452 | } 1453 | }, 1454 | "ignore": { 1455 | "version": "4.0.6", 1456 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1457 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1458 | "dev": true 1459 | }, 1460 | "import-fresh": { 1461 | "version": "3.3.0", 1462 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1463 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1464 | "dev": true, 1465 | "requires": { 1466 | "parent-module": "^1.0.0", 1467 | "resolve-from": "^4.0.0" 1468 | } 1469 | }, 1470 | "imurmurhash": { 1471 | "version": "0.1.4", 1472 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1473 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1474 | "dev": true 1475 | }, 1476 | "inflight": { 1477 | "version": "1.0.6", 1478 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1479 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1480 | "dev": true, 1481 | "requires": { 1482 | "once": "^1.3.0", 1483 | "wrappy": "1" 1484 | } 1485 | }, 1486 | "inherits": { 1487 | "version": "2.0.4", 1488 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1489 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1490 | "dev": true 1491 | }, 1492 | "is-extglob": { 1493 | "version": "2.1.1", 1494 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1495 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1496 | "dev": true 1497 | }, 1498 | "is-glob": { 1499 | "version": "4.0.3", 1500 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1501 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1502 | "dev": true, 1503 | "requires": { 1504 | "is-extglob": "^2.1.1" 1505 | } 1506 | }, 1507 | "isexe": { 1508 | "version": "2.0.0", 1509 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1510 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1511 | "dev": true 1512 | }, 1513 | "js-yaml": { 1514 | "version": "4.1.0", 1515 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1516 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1517 | "dev": true, 1518 | "requires": { 1519 | "argparse": "^2.0.1" 1520 | } 1521 | }, 1522 | "json-schema-traverse": { 1523 | "version": "0.4.1", 1524 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1525 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1526 | "dev": true 1527 | }, 1528 | "json-stable-stringify-without-jsonify": { 1529 | "version": "1.0.1", 1530 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1531 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1532 | "dev": true 1533 | }, 1534 | "levn": { 1535 | "version": "0.4.1", 1536 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1537 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1538 | "dev": true, 1539 | "requires": { 1540 | "prelude-ls": "^1.2.1", 1541 | "type-check": "~0.4.0" 1542 | } 1543 | }, 1544 | "lodash.merge": { 1545 | "version": "4.6.2", 1546 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1547 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1548 | "dev": true 1549 | }, 1550 | "lru-cache": { 1551 | "version": "6.0.0", 1552 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1553 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1554 | "dev": true, 1555 | "requires": { 1556 | "yallist": "^4.0.0" 1557 | } 1558 | }, 1559 | "minimatch": { 1560 | "version": "3.0.4", 1561 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1562 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1563 | "dev": true, 1564 | "requires": { 1565 | "brace-expansion": "^1.1.7" 1566 | } 1567 | }, 1568 | "ms": { 1569 | "version": "2.1.2", 1570 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1571 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1572 | "dev": true 1573 | }, 1574 | "natural-compare": { 1575 | "version": "1.4.0", 1576 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1577 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1578 | "dev": true 1579 | }, 1580 | "once": { 1581 | "version": "1.4.0", 1582 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1583 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1584 | "dev": true, 1585 | "requires": { 1586 | "wrappy": "1" 1587 | } 1588 | }, 1589 | "optionator": { 1590 | "version": "0.9.1", 1591 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1592 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1593 | "dev": true, 1594 | "requires": { 1595 | "deep-is": "^0.1.3", 1596 | "fast-levenshtein": "^2.0.6", 1597 | "levn": "^0.4.1", 1598 | "prelude-ls": "^1.2.1", 1599 | "type-check": "^0.4.0", 1600 | "word-wrap": "^1.2.3" 1601 | } 1602 | }, 1603 | "parent-module": { 1604 | "version": "1.0.1", 1605 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1606 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1607 | "dev": true, 1608 | "requires": { 1609 | "callsites": "^3.0.0" 1610 | } 1611 | }, 1612 | "path-is-absolute": { 1613 | "version": "1.0.1", 1614 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1615 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1616 | "dev": true 1617 | }, 1618 | "path-key": { 1619 | "version": "3.1.1", 1620 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1621 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1622 | "dev": true 1623 | }, 1624 | "prelude-ls": { 1625 | "version": "1.2.1", 1626 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1627 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1628 | "dev": true 1629 | }, 1630 | "progress": { 1631 | "version": "2.0.3", 1632 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1633 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1634 | "dev": true 1635 | }, 1636 | "punycode": { 1637 | "version": "2.1.1", 1638 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1639 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1640 | "dev": true 1641 | }, 1642 | "regexpp": { 1643 | "version": "3.2.0", 1644 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1645 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1646 | "dev": true 1647 | }, 1648 | "resolve-from": { 1649 | "version": "4.0.0", 1650 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1651 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1652 | "dev": true 1653 | }, 1654 | "rimraf": { 1655 | "version": "3.0.2", 1656 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1657 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1658 | "dev": true, 1659 | "requires": { 1660 | "glob": "^7.1.3" 1661 | } 1662 | }, 1663 | "rollup": { 1664 | "version": "2.61.1", 1665 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz", 1666 | "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==", 1667 | "dev": true, 1668 | "requires": { 1669 | "fsevents": "~2.3.2" 1670 | } 1671 | }, 1672 | "semver": { 1673 | "version": "7.3.5", 1674 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 1675 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 1676 | "dev": true, 1677 | "requires": { 1678 | "lru-cache": "^6.0.0" 1679 | } 1680 | }, 1681 | "shebang-command": { 1682 | "version": "2.0.0", 1683 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1684 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1685 | "dev": true, 1686 | "requires": { 1687 | "shebang-regex": "^3.0.0" 1688 | } 1689 | }, 1690 | "shebang-regex": { 1691 | "version": "3.0.0", 1692 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1693 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1694 | "dev": true 1695 | }, 1696 | "strip-ansi": { 1697 | "version": "6.0.1", 1698 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1699 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1700 | "dev": true, 1701 | "requires": { 1702 | "ansi-regex": "^5.0.1" 1703 | } 1704 | }, 1705 | "strip-json-comments": { 1706 | "version": "3.1.1", 1707 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1708 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1709 | "dev": true 1710 | }, 1711 | "text-table": { 1712 | "version": "0.2.0", 1713 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1714 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1715 | "dev": true 1716 | }, 1717 | "type-check": { 1718 | "version": "0.4.0", 1719 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1720 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1721 | "dev": true, 1722 | "requires": { 1723 | "prelude-ls": "^1.2.1" 1724 | } 1725 | }, 1726 | "type-fest": { 1727 | "version": "0.20.2", 1728 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1729 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1730 | "dev": true 1731 | }, 1732 | "uri-js": { 1733 | "version": "4.4.1", 1734 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1735 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1736 | "dev": true, 1737 | "requires": { 1738 | "punycode": "^2.1.0" 1739 | } 1740 | }, 1741 | "v8-compile-cache": { 1742 | "version": "2.3.0", 1743 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 1744 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 1745 | "dev": true 1746 | }, 1747 | "which": { 1748 | "version": "2.0.2", 1749 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1750 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1751 | "dev": true, 1752 | "requires": { 1753 | "isexe": "^2.0.0" 1754 | } 1755 | }, 1756 | "word-wrap": { 1757 | "version": "1.2.3", 1758 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1759 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1760 | "dev": true 1761 | }, 1762 | "wrappy": { 1763 | "version": "1.0.2", 1764 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1765 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1766 | "dev": true 1767 | }, 1768 | "yallist": { 1769 | "version": "4.0.0", 1770 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1771 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1772 | "dev": true 1773 | } 1774 | } 1775 | } 1776 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "worka", 3 | "version": "12.0.0", 4 | "description": "web workers results in promises", 5 | "license": "BSL-1.0", 6 | "type": "module", 7 | "main": "source/worka.js", 8 | "scripts": { 9 | "lint-fix": "eslint --ignore-path .gitignore --fix source examples", 10 | "lint": "eslint --ignore-path .gitignore source examples", 11 | "build-glue-exports": "node tools/glueAsExportedString.js", 12 | "build-browser": "rollup source/worka.js --output.format iife --output.name \"worka\" --output.file built/worka.iife.js", 13 | "build-node": "rollup source/worka.js --output.format cjs --output.name \"worka\" --output.file built/worka.cjs", 14 | "bundle": "npm run build-glue-exports && npm run build-browser && npm run build-node", 15 | "prepublishOnly": "npm run bundle", 16 | "try": "node examples/index.js 8080", 17 | "prepare-example": "node source/decorateWorker.js examples/node/sort.js sort_worka.js", 18 | "node-example": "node examples/node/file_usage.js", 19 | "deno-example": "deno run --allow-read examples/deno/file_usage.js" 20 | }, 21 | "devDependencies": { 22 | "eslint": "^8.5.0", 23 | "eslint-config-red": "^1.9.0", 24 | "filesac": "^13.0.0", 25 | "rollup": "^2.61.1" 26 | }, 27 | "eslintConfig": { 28 | "extends": [ 29 | "red" 30 | ], 31 | "parserOptions": { 32 | "ecmaVersion": 2021, 33 | "sourceType": "module", 34 | "ecmaFeatures": {} 35 | }, 36 | "env": { 37 | "es2021": true, 38 | "browser": true, 39 | "node": true 40 | }, 41 | "rules": {} 42 | }, 43 | "files": [ 44 | "built", 45 | "source", 46 | "readme.md", 47 | "LICENSE.txt", 48 | "changelog.md" 49 | ], 50 | "repository": { 51 | "type": "git", 52 | "url": "git://github.com/GrosSacASac/worka.git" 53 | }, 54 | "keywords": [ 55 | "web", 56 | "worker", 57 | "promise", 58 | "array", 59 | "parallel" 60 | ] 61 | } 62 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # [worka](https://github.com/GrosSacASac/worka) 2 | 3 | ## Platforms 4 | 5 | Web, Deno 6 | 7 | ## Why 8 | 9 | Working with Web Workers is interesting because it makes things previously only available to native software possible on the web also. But multi threading is hard to get right, and that's why I use patterns to stay correct. These patterns were previously duplicated across different web-applications. These patterns are now encapsulated into a library (worka) to avoid duplication. Use cases of web workers: 10 | 11 | * Offload work (computations) from server to client 12 | * Avoid blocking the main-DOM thread 13 | * Audio, video, canvas background processing 14 | * Progressive Enhancement 15 | 16 | 17 | ## What 18 | 19 | worka.js is an abstraction layer on top of web worker, with a declarative life cycle. Encapsulation of useful patterns. Some features: 20 | 21 | * Promised based API 22 | * Worker auto split into more workers 23 | * Time out management 24 | * Worker Life-cycle management 25 | * Small file and zero dependencies 26 | * Array Processing helper 27 | 28 | 29 | ## How/Install 30 | 31 | With a module to be imported. [source/worka.js](./source/worka.js). Also available via [NPM](https://www.npmjs.com/package/worka). `npm install worka` 32 | 33 | 34 | ## Inspiration 35 | 36 | Inspired by the clean stateless HTTP architecture, something comes in, something comes out. 37 | 38 | 39 | ### Shortest Example 40 | 41 | 42 | ```html 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |

Open console

51 | 75 | 76 | 77 | ``` 78 | 79 | 80 | ## Limitations 81 | 82 | 83 | The state, variables and closures are not shared between DOM globals and Web Worker globals. All required inputs must be sent directly. Web Worker cannot directly touch the [DOM/HTML and some other things also](https://nolanlawson.github.io/html5workertest/). 84 | 85 | There is a hard limit (about 1300 kB per message) on the amount of data send and received from and to a worker. Worker from tabs that do not have focus, may be throttled down. There is a limit on the amount of workers allowed , and crossing that limit may silently kill worker. The hope and lazy parameters of worka do help. 86 | 87 | ## Import 88 | 89 | ```js 90 | // module 91 | import { 92 | registerWorker, 93 | work, 94 | workerSupport, 95 | decorateWorker, 96 | 97 | STRING, 98 | DECORATED, 99 | FUNCTION, 100 | MULTI_FUNCTION, 101 | FILE, 102 | DECORATED_FILE, 103 | NO_SUPPORT_ERROR, 104 | TIME_OUT_ERROR, 105 | } from "worka"; 106 | 107 | // deno 108 | import { 109 | registerWorker, 110 | work, 111 | // ... 112 | } from "https://unpkg.com/worka/source/worka.js"; 113 | 114 | // node11- 115 | const {registerWorker, work, ...} = require("worka/built/worka.cjs"); 116 | ``` 117 | 118 | ## API 119 | 120 | * [registerWorker](#registerWorker) 121 | * [work](#work) 122 | * [workerSupport](#workersupport) 123 | 124 | 125 | 126 | ### registerWorker 127 | 128 | `registerWorker(options);` 129 | 130 | 131 | returns undefined. Immediately registers a worker. Registration is required before usage. 132 | 133 | 134 | #### options (required) 135 | 136 | 137 | Describes the worker. Example: 138 | 139 | 140 | ```js 141 | { 142 | name: `workerName`, 143 | resource: myFunction, 144 | loadMode: FUNCTION, 145 | lazy: 5, 146 | hope: 6, 147 | max: navigator.hardwareConcurrency || 1, 148 | stateless: true, 149 | initialize: false, 150 | timeOut: false, 151 | type: `module` || `classic`, 152 | } 153 | ``` 154 | 155 | 156 | #### name (required) 157 | 158 | 159 | `Symbol` or `String` that uniquely identifies a worker. 160 | 161 | 162 | #### resource (required) 163 | 164 | `String` or `Function` or `Any` 165 | 166 | Any value that can help build the worker. Must be in sync with `loadMode`. For example if loadMode is set to load a function, provide a function as resource. Resource gives the core functionality of the worker. 167 | 168 | 169 | #### loadMode (required) 170 | 171 | 172 | Possible Values: `FUNCTION, STRING, MULTI_FUNCTION, FILE` 173 | 174 | 175 | Partial Default 176 | 177 | 178 | ```js 179 | { 180 | loadMode: STRING 181 | } 182 | ``` 183 | 184 | 185 | To use multiple functions inside 1 Worker use `MULTI_FUNCTION` and provide as a `resource` a function that returns an object with multiple functions. Individuals keys of the object are later used to activate the targeted function. The worker functions may return promises. 186 | 187 | 188 | ```js 189 | const returnsMultipleFunctions = function () { 190 | 191 | const sort = function (array) { 192 | array.sort(); 193 | return array; 194 | }; 195 | 196 | const addNegativeLength = function (array) { 197 | array.push(-array.length); 198 | return array; 199 | }; 200 | 201 | return { 202 | sort, 203 | addNegativeLength 204 | }; 205 | }; 206 | 207 | registerWorker({ 208 | name: `test`, 209 | resource: returnsMultipleFunctions, 210 | loadMode: MULTI_FUNCTION 211 | }); 212 | 213 | work({ 214 | name: `test`, 215 | functionName: `sort`, 216 | input: [1,2,3,-8,-5,2,3,45,5], 217 | }).then(function (result) { 218 | console.log(result); 219 | }); 220 | 221 | work({ 222 | name: `test`, 223 | functionName: `addNegativeLength`, 224 | input: [1,2,3,-845,5], 225 | }).then(function (result) { 226 | console.log(result); 227 | }); 228 | ``` 229 | 230 | The rest of the options are optional. Jump to [work](#work). 231 | 232 | 233 | #### Stateless 234 | 235 | 236 | Partial Default 237 | 238 | 239 | ```js 240 | { 241 | stateless: true 242 | } 243 | ``` 244 | 245 | 246 | Pure functions are stateless. Function that change variables other than the return value are stateful (Worker that do not use transferable, have a copy of the input, not the input itself, which means a top level function inside a worker can change the __copied__ input and still be pure). Stateful component will never auto split into multiple workers. Before using stateful workers everywhere, consider moving the state up; moving the state in the main thread, mutate it only there, and providing it to the worker each time alongside the regular input. There is no need to set `initialize`. To provide a stateful function use `stateless: false` and the following format: 247 | 248 | 249 | ```js 250 | // Also known as the generator pattern 251 | const statefullGenerator = function () { 252 | // state declaration and initialization 253 | // it is encapsulated and not accessible from the outside 254 | let x = 0; 255 | return function (input) { 256 | // function to execute each time, with input 257 | // can change outer state 258 | // this function is not pure 259 | x += input; 260 | return x; 261 | }; 262 | }; 263 | 264 | registerWorker({ 265 | name: `stateTest`, 266 | resource: statefullGenerator, 267 | loadMode: FUNCTION, 268 | stateless: false 269 | }); 270 | 271 | work({name: `stateTest`, input: 5}).then(function (result) { 272 | console.log(result); // 5 273 | return work(name: `stateTest`, input: 5}); 274 | }).then(function (result) { 275 | console.log(result); // 10 276 | }); 277 | ``` 278 | 279 | 280 | #### initialize 281 | 282 | 283 | To force an initialization phase, use `initialize: true` and use the delayed initialization pattern: Provide a function that returns a function that will run on each `work` and that closes over variables defined once. This is especially useful to create large constant values once only or use recursive functionality. 284 | 285 | 286 | Partial Default 287 | 288 | 289 | ```js 290 | { 291 | initialize: false 292 | } 293 | ``` 294 | 295 | ```js 296 | const functionReturner = function () { 297 | 298 | const largeConstantInitialization = [ 299 | `could be a long array`, 300 | `or something that would be`, 301 | `costly to create each time` 302 | ]; 303 | 304 | let recursiveFunction; 305 | 306 | recursiveFunction = function ({input = ``, tree}) { 307 | const localTextContent = tree.textContent; 308 | const allTextContent = `${input} > ${localTextContent}`; 309 | if (tree.child) { 310 | return recursiveFunction({input: allTextContent, tree: tree.child}); 311 | } 312 | return allTextContent; 313 | } 314 | return recursiveFunction; 315 | }; 316 | 317 | registerWorker({ 318 | name: `initializationTest`, 319 | resource: functionReturner, 320 | loadMode: FUNCTION, 321 | initialize: true 322 | }); 323 | 324 | const recursiveDataStruct = { 325 | textContent: `top level`, 326 | child: { 327 | textContent: `middle level`, 328 | child: { 329 | textContent: `bottom level`, 330 | child: { 331 | textContent: `underground`, 332 | child: { 333 | textContent: `-10` 334 | } 335 | } 336 | } 337 | } 338 | }; 339 | work({name: `initializationTest`, input: {tree: recursiveDataStruct}}) 340 | .then(function (result) { 341 | console.log(result); 342 | // > top level > middle level > bottom level > underground > -10 343 | }); 344 | ``` 345 | 346 | 347 | #### Hope 348 | 349 | 350 | Hope is a number that helps make assumptions about the lifecycle of the worker. A worker with 0 hope is going to be deleted after it is used. A worker with lots of hope is going to be kept after each usage. 351 | 352 | 353 | Partial Default 354 | 355 | 356 | ```js 357 | { 358 | hope: 6 359 | } 360 | ``` 361 | 362 | 363 | * 6+ no effect default value 364 | * 5 immediately terminated after each use 365 | * 1 - 4 place-holders do not use 366 | * 0 immediately unregistered and deleted after use and all the above. Use this for a 1 time computations only. 367 | 368 | 5 Use this to free up memory at the expense of slower restart. Do not use if you know the work will be done again. 369 | 370 | 0 Use this for a 1-time computation only. 371 | 372 | 373 | #### Lazy 374 | 375 | 376 | Lazy is a number that helps make assumption about the life cycle of the worker. A worker with 0 lazy is going to be absolutely ready before it is going to be used. A worker with 5 lazy is going to initialize only when needed. The lazy value has an effect on registerWorker only. 377 | 378 | 379 | Partial Default 380 | 381 | 382 | ```js 383 | { 384 | lazy: 5 385 | } 386 | ``` 387 | 388 | * 5+ no effect, slowest first start, lowest memory usage default value 389 | * 4 worker is preloaded 390 | * 3 worker is decorated and all the above 391 | * 2 worker is instantiated and all the above 392 | * 1 place holder do not use 393 | * 0 worker is started, and initialization is run and all the above 394 | 395 | 396 | 397 | #### Time out 398 | 399 | 400 | `false` or a positive integer `Number` 401 | 402 | 403 | By default there is no time out. The time out timing start just after work(...).then(...). If the operation takes longer the Promise will reject with TIME_OUT_ERROR. 404 | 405 | 406 | Partial Default 407 | 408 | 409 | ```js 410 | { 411 | timeOut: false 412 | } 413 | ``` 414 | 415 | 416 | #### max 417 | 418 | Integer `Number` equal or above `1`. 419 | 420 | 421 | By default each registered worker will spawn copies of itself when ever `work()` is called while there is already a worker computing. `max` describes the maximum amount of Web Worker for this registered worker. Do not include this option unless you know exactly why and what you are doing. Stateful worker will not spawn copies of itself by default. 422 | 423 | 424 | Partial Default 425 | 426 | 427 | ```js 428 | { 429 | max: navigator.hardwareConcurrency || 1 430 | } 431 | ``` 432 | 433 | 434 | ### work 435 | 436 | `work({name, input, functionName});` 437 | 438 | 439 | Returns a promise that eventually resolves with the result or fails. Use registerWorker first ! 440 | 441 | 442 | ```js 443 | work({name:`test/sort`, input: [1,2,3,-8,-5,2,3,45,5]}).then(function (result) { 444 | console.log(result); 445 | }).catch(function (reason) { 446 | if (reason === NO_SUPPORT_ERROR) { 447 | console.error(`Web Worker API not supported`); 448 | } else if (reason === TIME_OUT_ERROR) { 449 | // can only happen with a worker registered with a timeOut 450 | console.error(`Took longer than expected`); 451 | } else { 452 | console.error(`other error`, reason); 453 | } 454 | }); 455 | ``` 456 | 457 | #### name (required) 458 | 459 | 460 | the name of the worker or `${name}/${functionName}`. 461 | 462 | 463 | #### input 464 | 465 | 466 | The input that will be provided to the worker. To pass multiple inputs use a container, such as an Array or an Object. 467 | 468 | 469 | ### workerSupport 470 | 471 | *Read-only* Object describing the support matrix for web workers. 472 | 473 | ```js 474 | { 475 | basic: Boolean 476 | transferrables: undefined // for now 477 | } 478 | ``` 479 | ### mapParallel 480 | 481 | Helper function similar to array.map. Note the data argument comes last. 482 | 483 | ```js 484 | import { mapParallel } from "worka/source/arrayParallel.js"; 485 | 486 | 487 | const results = await Promise.all(mapParallel(function (item) { 488 | return item ** 2; 489 | }, [5, 4, 3])); 490 | ``` 491 | 492 | ## Advanced topics 493 | 494 | 495 | ### Fall back strategy 496 | 497 | When web workers are not supported the promise from `work` will reject. It is possible to do something else in the catch. Below an example where `fetch` is used as a fall-back. Other web worker libraries presented below will automatically switch to `