├── .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 |
18 | Precision Level
19 |
29 |
30 |
31 |
34 | With preloaded web worker
35 |
36 |
39 | With web worker
40 |
41 |
42 |
45 | With web worker, without cache
46 |
47 |
48 |
51 | Without web worker
52 |
53 |
54 |
57 | With remote server
58 |
59 |
60 |
61 |
62 |
Results
63 |
66 |
69 |
70 |
71 |
72 |
Statistics
73 |
76 | Run full test suite
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 | It took
90 | ms to run
91 | times.
92 |
93 |
94 | Total Computation Time
95 | ms
96 | Setup Time
97 | ms
98 | Mean Computation Time
99 | ms
100 |
101 |
102 |
103 |
104 |
105 | Precision
106 | Duration (ms)
107 | PI Estimation
108 |
109 |
110 |
111 |
112 |
113 |
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 `