diff --git a/README.md b/README.md index 28898eb..c1fbd19 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This project aims to bring the mathematical chops of [NumPy](https://numpy.org/) - Make the API familiar (e.g., `createTensor()`). - Encourage all kinds of contributions. -The library is written in [TypeScript](http://www.typescriptlang.org/) and uses [TensorFlow.js](https://js.tensorflow.org/api/latest/), [Danfo.js](https://danfo.jsdata.org/), and [Math.js](https://mathjs.org/) under the hood. It bundles [ml5.js](https://ml5js.org/) to handle machine learning. +The library is written in [TypeScript](http://www.typescriptlang.org/) and uses [TensorFlow.js](https://js.tensorflow.org/api/latest/) and [Math.js](https://mathjs.org/) under the hood. It bundles [ml5.js](https://ml5js.org/) for machine learning and [TurtleGFX](https://github.com/CodeGuppyPrograms/TurtleGFX) for drawing with turtles. ## Usage diff --git a/examples/dataframe-neuralnetwork/index.html b/examples/dataframe-neuralnetwork/index.html deleted file mode 100644 index 4dc989c..0000000 --- a/examples/dataframe-neuralnetwork/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - DataFrame + NeuralNetwork Example - - - - - - - - diff --git a/examples/dataframe-neuralnetwork/sketch.js b/examples/dataframe-neuralnetwork/sketch.js deleted file mode 100644 index fffba36..0000000 --- a/examples/dataframe-neuralnetwork/sketch.js +++ /dev/null @@ -1,78 +0,0 @@ -function preload() { - // Step 1: load data - loadDataFrame('https://assets.computiful.org/pre-alpha/who_life_expectancy.csv', 'csv', callback, errorCallback); -} - -function callback(df) { - // Step 2: transform and visualize - df = df.query({column: 'Country', is: '==', to: 'Kenya'}); - df = df.dropna({ axis: 0 }); - let plotDiv = createDiv(); - plotDiv.id('plot_div'); - df.plot("plot_div").scatter({ - x: 'Schooling', - y: 'Life expectancy', - }); - df.to_json().then((json) => { - // Step 3: set your neural network options - const options = { - task: 'regression', - debug: true, - }; - - // Step 4: initialize your neural network - const nn = ml5.neuralNetwork(options); - - // Step 5: add data to the neural network - JSON.parse(json).forEach((item) => { - const input = { - schooling: item['Schooling'], - }; - const output = { - life_expectancy: item['Life expectancy'], - }; - - nn.addData(input, output); - }); - - // Step 6: normalize your data - nn.normalizeData(); - - // Step 7: train your neural network - const trainingOptions = { - epochs: 32, - batchSize: 12, - }; - nn.train(trainingOptions, finishedTraining); - - // Step 8: use the trained model - function finishedTraining() { - predict(); - } - - // Step 9: make a prediction - function predict() { - const input = { - schooling: 5, - }; - nn.predict(input, handleResults); - } - - // Step 10: define a function to handle the results of your classification - function handleResults(error, result) { - if (error) { - console.error(error); - return; - } - console.log(result); // { label: 'life_expectancy', value: 79.7 }; - } - }); -} - -function errorCallback(error) { - console.error(error); -} - -function setup() { - noCanvas(); -} diff --git a/examples/dataframe/index.html b/examples/dataframe/index.html deleted file mode 100644 index 741eacf..0000000 --- a/examples/dataframe/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - DataFrame Example - - - - - - - diff --git a/examples/dataframe/sketch.js b/examples/dataframe/sketch.js deleted file mode 100644 index 548bffb..0000000 --- a/examples/dataframe/sketch.js +++ /dev/null @@ -1,12 +0,0 @@ -function setup() { - print('=== JSON-based DataFrame ==='); - - const json_data = [ - { A: 0.4612, B: 4.28283, C: -1.509, D: -1.1352 }, - { A: 0.5112, B: -0.22863, C: -3.39059, D: 1.1632 }, - { A: 0.6911, B: -0.82863, C: -1.5059, D: 2.1352 }, - { A: 0.4692, B: -1.28863, C: 4.5059, D: 4.1632 } - ]; - const df = createDataFrame(json_data); - df.print(); -} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..12d3c05 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,19 @@ +module.exports = function(config) { + config.set({ + frameworks: ['mocha', 'chai'], + files: [ + 'node_modules/p5/lib/p5.min.js', + 'dist/numero.js', + 'test/**/*.js' + ], + reporters: ['progress'], + port: 9876, // karma web server port + colors: true, + logLevel: config.LOG_INFO, + browsers: ['ChromeHeadless'], + autoWatch: false, + // singleRun: false, // Karma captures browsers, runs the tests and exits + concurrency: Infinity + }) + } + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e5ce489..3bafeeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,82 +4,12 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, + "@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "regenerator-runtime": "^0.13.4" } }, "@blakeembrey/deque": { @@ -87,32 +17,29 @@ "resolved": "https://registry.npmjs.org/@blakeembrey/deque/-/deque-1.0.5.tgz", "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==" }, + "@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true + }, "@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -121,6 +48,23 @@ } } }, + "@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@magenta/sketch": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@magenta/sketch/-/sketch-0.2.0.tgz", @@ -129,6 +73,38 @@ "@tensorflow/tfjs": "^1.0.2" } }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true + }, "@tensorflow-models/blazeface": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/@tensorflow-models/blazeface/-/blazeface-0.0.5.tgz", @@ -178,9 +154,9 @@ "integrity": "sha512-MrMlDEDHkZPKuZawQb1E2Hof1m2ojZrOW1EAVnvZ1Jn+cPmDJz+X3hokYLC3P+UBUq+tAYq1vU0Byt9SbyGWbg==" }, "@tensorflow-models/universal-sentence-encoder": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@tensorflow-models/universal-sentence-encoder/-/universal-sentence-encoder-1.3.2.tgz", - "integrity": "sha512-BhkKsFSwyps8JJQIlQPKyY9WdBsSW0H/DuZIecfECvOXrPOgLYECINMI46TFDs1L70+6bNS3FXzw08qAttWmAw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@tensorflow-models/universal-sentence-encoder/-/universal-sentence-encoder-1.3.3.tgz", + "integrity": "sha512-mipL7ad0CW6uQ68FUkNgkNj/zgA4qgBnNcnMMkNTdL9MUMnzCxu3AE8pWnx2ReKHwdqEG4e8IpaYKfH4B8bojg==" }, "@tensorflow/tfjs": { "version": "1.7.4", @@ -191,53 +167,17 @@ "@tensorflow/tfjs-core": "1.7.4", "@tensorflow/tfjs-data": "1.7.4", "@tensorflow/tfjs-layers": "1.7.4" - }, - "dependencies": { - "@tensorflow/tfjs-converter": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-1.7.4.tgz", - "integrity": "sha512-B/Ux9I3osI0CXoESGR0Xe5C6BsEfC04+g2xn5zVaW9KEuVEnGEgnuBQxgijRFzkqTwoyLv4ptAmjyIghVARX0Q==" - }, - "@tensorflow/tfjs-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.7.4.tgz", - "integrity": "sha512-3G4VKJ6nPs7iCt6gs3bjRj8chihKrYWenf63R0pm7D9MhlrVoX/tpN4LYVMGgBL7jHPxMLKdOkoAZJrn/J88HQ==", - "requires": { - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "2.4.27", - "@types/webgl-ext": "0.0.30", - "@types/webgl2": "0.0.4", - "node-fetch": "~2.1.2", - "seedrandom": "2.4.3" - } - }, - "@tensorflow/tfjs-data": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-1.7.4.tgz", - "integrity": "sha512-WFYG9wWjNDi62x6o3O20Q0XJxToCw2J4/fBEXiK/Gr0hIqVhl2oLQ1OjTWq7O08NUxM6BRzuG+ra3gWYdQUzOw==", - "requires": { - "@types/node-fetch": "^2.1.2", - "node-fetch": "~2.1.2" - } - }, - "@tensorflow/tfjs-layers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-1.7.4.tgz", - "integrity": "sha512-5/K8Z8RBfXsucL6EaSeb3/8jB/I8oPaaXkxwKVsBPQ+u6lB6LEtSKzeiFc57nDr5OMtVaUZV+pKDNEzP0RUQlg==" - } } }, "@tensorflow/tfjs-converter": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-1.7.4.tgz", - "integrity": "sha512-B/Ux9I3osI0CXoESGR0Xe5C6BsEfC04+g2xn5zVaW9KEuVEnGEgnuBQxgijRFzkqTwoyLv4ptAmjyIghVARX0Q==", - "dev": true + "integrity": "sha512-B/Ux9I3osI0CXoESGR0Xe5C6BsEfC04+g2xn5zVaW9KEuVEnGEgnuBQxgijRFzkqTwoyLv4ptAmjyIghVARX0Q==" }, "@tensorflow/tfjs-core": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.7.4.tgz", "integrity": "sha512-3G4VKJ6nPs7iCt6gs3bjRj8chihKrYWenf63R0pm7D9MhlrVoX/tpN4LYVMGgBL7jHPxMLKdOkoAZJrn/J88HQ==", - "dev": true, "requires": { "@types/offscreencanvas": "~2019.3.0", "@types/seedrandom": "2.4.27", @@ -247,6 +187,20 @@ "seedrandom": "2.4.3" } }, + "@tensorflow/tfjs-data": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-1.7.4.tgz", + "integrity": "sha512-WFYG9wWjNDi62x6o3O20Q0XJxToCw2J4/fBEXiK/Gr0hIqVhl2oLQ1OjTWq7O08NUxM6BRzuG+ra3gWYdQUzOw==", + "requires": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.1.2" + } + }, + "@tensorflow/tfjs-layers": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-1.7.4.tgz", + "integrity": "sha512-5/K8Z8RBfXsucL6EaSeb3/8jB/I8oPaaXkxwKVsBPQ+u6lB6LEtSKzeiFc57nDr5OMtVaUZV+pKDNEzP0RUQlg==" + }, "@tensorflow/tfjs-vis": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-vis/-/tfjs-vis-1.5.1.tgz", @@ -262,9 +216,9 @@ } }, "@types/chai": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.16.tgz", - "integrity": "sha512-vI5iOAsez9+roLS3M3+Xx7w+WRuDtSmF8bQkrbcIJ2sC1PcDgVoA0WGpa+bIrJ+y8zqY2oi//fUctkxtIcXJCw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", "dev": true }, "@types/clone": { @@ -272,16 +226,56 @@ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz", "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=" }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, + "@types/eslint": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.0.tgz", + "integrity": "sha512-JUYa/5JwoqikCy7O7jKtuNe9Z4ZZt615G+1EKfaDGSNEpzaA2OwbV/G1v08Oa7fd1XzlFoSCvt9ePl9/6FyAug==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + }, "@types/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha512-mky/O83TXmGY39P1H9YbUpjV6l6voRYlufqfFCvel8l1phuy8HRjdWc1rrPuN53ITBJlbyMSV6z3niOySO5pgQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-IyNhGHu71jH1jCXTHmafuoAAdsbBON3kDh7u/UUhLmjYgN5TYB54e1R8ckTCiIevl2UuZaCsi9XRxineY5yUjw==", + "requires": { + "fast-json-stable-stringify": "*" + } }, "@types/json-schema": { "version": "7.0.7", @@ -296,18 +290,18 @@ "dev": true }, "@types/mathjs": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/@types/mathjs/-/mathjs-6.0.11.tgz", - "integrity": "sha512-q9B8ZreO41L38iTY76bCZEtAqzeRs4mNIOZpZ1sLSlcYgvgfFrnf8y8qfmas0tVWrsODjmQbQJFD6RJJJCqJbQ==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@types/mathjs/-/mathjs-9.4.2.tgz", + "integrity": "sha512-GF5g1vJmvKdWIWsE53XX7EDAyCaZ9p6gaYm1xhlXn5JjrY/NJrOfJN3fBxS3wyZpVh3QqKoMkS2WjFwxWMHOTw==", "dev": true, "requires": { - "decimal.js": "^10.0.0" + "mathjs": "*" } }, "@types/mocha": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", - "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", "dev": true }, "@types/node": { @@ -316,9 +310,9 @@ "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==" }, "@types/node-fetch": { - "version": "2.5.10", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz", - "integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==", + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", + "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", "requires": { "@types/node": "*", "form-data": "^3.0.0" @@ -330,9 +324,9 @@ "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" }, "@types/p5": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@types/p5/-/p5-0.9.1.tgz", - "integrity": "sha512-4glOKdqdBiRWDFZwi/MjHudPV2U4t2L4fTTSacGapfFxyNXzZcAshAjqmrJkCIZcFlhRBEAL7AM95xRDMfrIwg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/p5/-/p5-1.3.3.tgz", + "integrity": "sha512-PBSFnX6IgV6Pqlx9wocUjSkGlm1I1ymz9tEiTbdNCqig6FOGiWcVUHx13TXRTBfRIhZC9+MqqgztMsgzpueaUg==", "dev": true }, "@types/seedrandom": { @@ -351,74 +345,269 @@ "integrity": "sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw==" }, "@typescript-eslint/eslint-plugin": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz", - "integrity": "sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "3.10.1", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/type-utils": "5.10.0", + "@typescript-eslint/utils": "5.10.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", + "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "debug": "^4.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, - "@typescript-eslint/experimental-utils": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "@typescript-eslint/scope-manager": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", + "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.10.0", + "eslint-visitor-keys": "^3.0.0" + } + }, + "eslint-visitor-keys": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "dev": true + } } }, - "@typescript-eslint/parser": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", - "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "@typescript-eslint/type-utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", + "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", "dev": true, "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.10.1", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/utils": "5.10.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, "@typescript-eslint/types": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", "dev": true, "requires": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", + "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@typescript-eslint/types": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.10.0", + "eslint-visitor-keys": "^3.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } } }, "@typescript-eslint/visitor-keys": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/types": "5.10.0", + "eslint-visitor-keys": "^3.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "dev": true + } } }, "@ungap/promise-all-settled": { @@ -428,180 +617,172 @@ "dev": true }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "@webpack-cli/configtest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", + "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", + "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" + "envinfo": "^7.7.3" } }, + "@webpack-cli/serve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", + "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "dev": true + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -625,36 +806,28 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true }, - "adler-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", - "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -662,12 +835,6 @@ "uri-js": "^4.2.2" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -681,9 +848,9 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -702,86 +869,58 @@ "picomatch": "^2.0.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flat-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz", - "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==" - }, - "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "array-flat-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz", + "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==" + }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", + "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" + "is-string": "^1.0.7" + }, + "dependencies": { + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + } } }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "es-abstract": "^1.19.0" } }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", @@ -792,241 +931,86 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "body-parser": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "dev": true, + "requires": { + "bytes": "3.1.1", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "ms": "2.0.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "safer-buffer": ">= 2.1.2 < 3" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "binpack": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/binpack/-/binpack-0.1.0.tgz", - "integrity": "sha1-vT0JdMPyoERuF99PYLVacqIFqX4=", - "dev": true - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, "bowser": { "version": "1.9.4", "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", @@ -1050,199 +1034,37 @@ "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1253,12 +1075,6 @@ "get-intrinsic": "^1.0.2" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1270,34 +1086,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "cfb": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz", - "integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==", - "requires": { - "adler-32": "~1.2.0", - "crc-32": "~1.2.0", - "printj": "~1.1.2" - } + "caniuse-lite": { + "version": "1.0.30001301", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", + "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==", + "dev": true }, "chai": { "version": "4.3.4", @@ -1344,138 +1137,36 @@ "readdirp": "~3.5.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, - "chrome-launcher": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.11.2.tgz", - "integrity": "sha512-jx0kJDCXdB2ARcDMwNCtrf04oY1Up4rOmVu+fqJ5MTPOOIG8EhRcEU9NZfXZc6dMw9FU8o1r21PNp8V2M0zQ+g==", - "dev": true, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { - "@types/node": "*", - "is-wsl": "^2.1.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "0.5.1", - "rimraf": "^2.6.1" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "chrome-remote-interface": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.28.2.tgz", - "integrity": "sha512-F7mjof7rWvRNsJqhVXuiFU/HWySCxTA9tzpLxUJxVfdLkljwFJ1aMp08AnwXRmmP7r12/doTDOMwaNhFCJsacw==", + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { - "commander": "2.11.x", - "ws": "^7.2.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - } - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "chrome-unmirror": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chrome-unmirror/-/chrome-unmirror-0.1.0.tgz", - "integrity": "sha1-6a94ukf3/7kAYCk6cgoBzSbVC6s=", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "codepage": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", - "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", - "requires": { - "commander": "~2.14.1", - "exit-on-epipe": "~1.0.1" - }, - "dependencies": { - "commander": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, "color-convert": { @@ -1491,6 +1182,18 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1504,22 +1207,10 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, "complex.js": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.12.tgz", - "integrity": "sha512-oQX99fwL6LrTVg82gDY1dIWXy6qZRnRL35N+YhIX0N7tSwsa0KFy6IEMHTNuCW4mP7FS7MEqZ/2I/afzYwPldw==" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.15.tgz", + "integrity": "sha512-gDBvQU8IG139ZBQTSo2qvDFP+lANMGluM779csXOr6ny1NUtA3wkUnCFjlDNH/moAVfXtvClYt6G0zarFbtz5w==" }, "component-emitter": { "version": "1.3.0", @@ -1527,89 +1218,57 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "glob": "^7.1.3" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "dev": true }, "core-js": { @@ -1617,64 +1276,14 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "object-assign": "^4", + "vary": "^1" } }, "cross-spawn": { @@ -1687,25 +1296,6 @@ "which": "^2.0.1" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "css-in-js-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", @@ -1715,19 +1305,10 @@ "isobject": "^3.0.1" } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { + "custom-event": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, "d3-array": { @@ -1792,11 +1373,11 @@ "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" }, "d3-geo": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.1.tgz", - "integrity": "sha512-M6yzGbFRfxzNrVhxDJXzJqSLQ90q1cCyb3EWFZ1LF4eWOBYxFypw7I/NFVBNXKNqxv1bqLathhYvdJ6DC+th3A==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz", + "integrity": "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==", "requires": { - "d3-array": ">=2.5" + "d3-array": "^2.5.0" } }, "d3-geo-projection": { @@ -1879,10 +1460,16 @@ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" }, + "date-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", + "dev": true + }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -1893,43 +1480,10 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-3.0.0.tgz", - "integrity": "sha512-YX2i9XjJ7h5q/aQ/IM9PEwEnDqETAIYbggmdDB3HLTlSgo1CxPsj6pvhPG68rq6SVE0+p+6Ywsm5fTYNrYtBWw==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, "deep-eql": { "version": "3.0.1", @@ -1941,9 +1495,9 @@ } }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "define-properties": { @@ -1955,47 +1509,6 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "delaunator": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", @@ -2006,20 +1519,16 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, "diff": { @@ -2028,21 +1537,19 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "path-type": "^4.0.0" }, "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true } } @@ -2056,56 +1563,39 @@ "esutils": "^2.0.2" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.49", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", + "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==", + "dev": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, "encoding": { @@ -2116,180 +1606,111 @@ "iconv-lite": "^0.6.2" } }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "engine.io": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz", + "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==", "dev": true, "requires": { - "once": "^1.4.0" + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" } }, - "engine.io": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.3.2.tgz", - "integrity": "sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w==", + "engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", "dev": true, "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~6.1.0" + "@socket.io/base64-arraybuffer": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "requires": { - "async-limiter": "~1.0.0" + "has-tostringtag": "^1.0.0" } + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true } } }, - "engine.io-client": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz", - "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - } + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true }, "es-to-primitive": { "version": "1.2.1", @@ -2308,212 +1729,243 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, "escape-latex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "eslint": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.25.0.tgz", - "integrity": "sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", + "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", "dev": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, - "table": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.5.1.tgz", - "integrity": "sha512-xGDXWTBJxahkzPQCsn1S9ESHEenU7TbMD5Iv4FeopXv/XwJyWatFjfbor+6ipI10/MNPXBYUamYukOrbPZ9L/w==", + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" + "is-glob": "^4.0.3" }, "dependencies": { - "ajv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", - "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "is-extglob": "^2.1.1" } } } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } } } }, "eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, "requires": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", - "object.entries": "^1.1.2" + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", "dev": true, "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" + "debug": "^3.2.7", + "find-up": "^2.1.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "ms": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" }, "dependencies": { "debug": { @@ -2526,13 +1978,30 @@ } }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "is-extglob": "^2.1.1" } }, "ms": { @@ -2554,37 +2023,39 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "requires": { - "acorn": "^7.4.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "eslint-visitor-keys": "^3.1.0" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", @@ -2595,9 +2066,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -2631,184 +2102,61 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { + "is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend-shallow": { + "extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "face-api.js": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/face-api.js/-/face-api.js-0.22.2.tgz", + "integrity": "sha512-9Bbv/yaBRTKCXjiDqzryeKhYxmgSjJ7ukvOvEBy6krA0Ah/vNBlsf7iBNfJljWiPA8Tys1/MnB3lyP2Hfmsuyw==", "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "@tensorflow/tfjs-core": "1.7.0", + "tslib": "^1.11.1" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "face-api.js": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/face-api.js/-/face-api.js-0.22.2.tgz", - "integrity": "sha512-9Bbv/yaBRTKCXjiDqzryeKhYxmgSjJ7ukvOvEBy6krA0Ah/vNBlsf7iBNfJljWiPA8Tys1/MnB3lyP2Hfmsuyw==", - "requires": { - "@tensorflow/tfjs-core": "1.7.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "@tensorflow/tfjs-core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.7.0.tgz", - "integrity": "sha512-uwQdiklNjqBnHPeseOdG0sGxrI3+d6lybaKu2+ou3ajVeKdPEwpWbgqA6iHjq1iylnOGkgkbbnQ6r2lwkiIIHw==", + "@tensorflow/tfjs-core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.7.0.tgz", + "integrity": "sha512-uwQdiklNjqBnHPeseOdG0sGxrI3+d6lybaKu2+ou3ajVeKdPEwpWbgqA6iHjq1iylnOGkgkbbnQ6r2lwkiIIHw==", "requires": { "@types/offscreencanvas": "~2019.3.0", "@types/seedrandom": "2.4.27", @@ -2830,10 +2178,23 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "fast-json-patch": { - "version": "3.0.0-1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.0.0-1.tgz", - "integrity": "sha512-6pdFb07cknxvPzCeLsFHStEy+MysPJPgZQ9LbQ/2O67unQF93SNqfdSqnPPl71YMHX+AD8gbl7iuoGFzHEdDuw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.0.tgz", + "integrity": "sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA==" }, "fast-json-stable-stringify": { "version": "2.1.0", @@ -2846,10 +2207,25 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", + "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", "requires": { "core-js": "^1.0.0", "isomorphic-fetch": "^2.1.1", @@ -2857,20 +2233,9 @@ "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" + "ua-parser-js": "^0.7.30" } }, - "fflate": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz", - "integrity": "sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A==" - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2880,13 +2245,6 @@ "flat-cache": "^3.0.4" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2895,59 +2253,35 @@ "to-regex-range": "^5.0.1" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "ms": "2.0.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } } } }, @@ -2960,123 +2294,6 @@ "path-exists": "^4.0.0" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -3094,31 +2311,15 @@ } }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "form-data": { "version": "3.0.1", @@ -3130,45 +2331,20 @@ "mime-types": "^2.1.12" } }, - "frac": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", - "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" - }, "fraction.js": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz", - "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==" }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, "fs.realpath": { @@ -3216,12 +2392,22 @@ "has-symbols": "^1.0.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "glamor": { "version": "2.20.40", "resolved": "https://registry.npmjs.org/glamor/-/glamor-2.20.40.tgz", @@ -3235,9 +2421,9 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3256,76 +2442,33 @@ "is-glob": "^4.0.1" } }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "type-fest": "^0.20.2" } }, - "globals": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", - "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" } }, "graceful-fs": { @@ -3354,29 +2497,6 @@ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3388,128 +2508,49 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, - "has-value": { + "has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "has-symbols": "^1.0.2" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "hyphenate-style-name": { @@ -3518,29 +2559,17 @@ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "import-fresh": { "version": "3.3.0", @@ -3552,85 +2581,12 @@ "resolve-from": "^4.0.0" } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3647,12 +2603,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "inline-style-prefixer": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz", @@ -3662,41 +2612,26 @@ "css-in-js-utils": "^2.0.0" } }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "internmap": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" }, "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, "is-bigint": { @@ -3722,12 +2657,6 @@ "call-bind": "^1.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-callable": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", @@ -3742,63 +2671,12 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3834,12 +2712,6 @@ "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", "dev": true }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -3856,15 +2728,21 @@ } }, "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" } }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3885,25 +2763,25 @@ "has-symbols": "^1.0.1" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { - "is-docker": "^2.0.0" + "call-bind": "^1.0.2" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", "dev": true }, "isexe": { @@ -3941,19 +2819,40 @@ "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" }, + "jest-worker": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "json-parse-better-errors": { @@ -3965,7 +2864,8 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -3987,25 +2887,146 @@ "minimist": "^1.2.0" } }, - "jspack": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/jspack/-/jspack-0.0.4.tgz", - "integrity": "sha1-Mt01x/3LPjRWwY+7fvntC8YjgXc=", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "karma": { + "version": "6.3.11", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.11.tgz", + "integrity": "sha512-QGUh4yXgizzDNPLB5nWTvP+wysKexngbyLVWFOyikB661hpa2RZLf5anZQzqliWtAQuYVep0ot0D1U7UQKpsxQ==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.3.0", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "karma-chai": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz", + "integrity": "sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=", "dev": true }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "requires": { + "minimist": "^1.2.3" + } + }, "katex": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.13.3.tgz", - "integrity": "sha512-/w0eycuK1xh201T0uFXYOZWPDoeqDHqR+6SLLKsYvNtUCYtmRjq8F+M74sdpzs+dJZYWv2eUsSW0r1AJfhZOCw==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.2.tgz", + "integrity": "sha512-FfZ/f6f8bQdLmJ3McXDNTkKenQkoXkItpW0I9bsG2wgb+8JAY5bwpXFtI8ZVrg5hc1wo1X/UIhdkVMpok46tEQ==", "dev": true, "requires": { - "commander": "^6.0.0" + "commander": "^8.0.0" }, "dependencies": { "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true } } @@ -4026,73 +3047,12 @@ "type-check": "~0.4.0" } }, - "lighthouse-logger": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz", - "integrity": "sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==", - "dev": true, - "requires": { - "debug": "^2.6.8", - "marky": "^1.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "dependencies": { - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -4104,40 +3064,37 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" } }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "dev": true + "log4js": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.0.tgz", + "integrity": "sha512-ysc/XUecZJuN8NoKOssk3V0cQ29xY4fra6fnigZa5VwxFsCsvdqsdnEuAxNN89LlHpbE4KUD3zGcn+kFqonSVQ==", + "dev": true, + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } }, "loose-envify": { "version": "1.4.0", @@ -4147,16 +3104,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4165,234 +3112,47 @@ "yallist": "^4.0.0" } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, + "mathjs": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-10.1.0.tgz", + "integrity": "sha512-TrpZAR3H9jR0Cv6cnzT+TZhE40Xs2SCaLf/qm2WcWm2tui69Gas/bC/ct5ZLZNWnWvNvJ7H2uHvuRDDl151PHA==", "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "@babel/runtime": "^7.16.5", + "complex.js": "^2.0.15", + "decimal.js": "^10.3.1", + "escape-latex": "^1.2.0", + "fraction.js": "^4.1.2", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^2.0.0" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "map-obj": { + "merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "marky": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.1.tgz", - "integrity": "sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ==", + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, - "mathjs": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-7.6.0.tgz", - "integrity": "sha512-abywR28hUpKF4at5jE8Ys+Kigk40eKMT5mcBLD0/dtsqjfOLbtzd3WjlRqIopNo7oQ6FME51qph6lb8h/bhpUg==", - "requires": { - "complex.js": "^2.0.11", - "decimal.js": "^10.2.1", - "escape-latex": "^1.2.0", - "fraction.js": "^4.0.12", - "javascript-natural-sort": "^0.7.1", - "seed-random": "^2.2.0", - "tiny-emitter": "^2.1.0", - "typed-function": "^2.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, "micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", @@ -4403,23 +3163,11 @@ "picomatch": "^2.2.3" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true }, "mime-db": { "version": "1.47.0", @@ -4434,16 +3182,10 @@ "mime-db": "1.47.0" } }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { @@ -4460,114 +3202,33 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - } - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, "mocha": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", - "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.4.tgz", + "integrity": "sha512-+q2aV5VlJZuLgCWoBvGI5zEwPF9eEI0kr/sAA9Jm4xMND7RfIEyF8JE7C0JIg8WXRG+P1sdIAb5ccoHPlXLzcw==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", + "glob": "7.1.7", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", "minimatch": "3.0.4", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.1.5", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -4579,6 +3240,22 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -4590,6 +3267,23 @@ "wrap-ansi": "^7.0.0" } }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4606,10 +3300,24 @@ "path-exists": "^4.0.0" } }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { "argparse": "^2.0.1" @@ -4648,6 +3356,15 @@ "p-limit": "^3.0.2" } }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -4697,175 +3414,18 @@ } } }, - "mocha-chrome": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mocha-chrome/-/mocha-chrome-2.2.0.tgz", - "integrity": "sha512-RXP6Q2mlM2X+eO2Z8gribmiH4J9x5zu/JcTZ3deQSwiC5260BzizOc0eD1NWP3JuypGCKRwReicv4KCNIFtTZQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "chrome-launcher": "^0.11.2", - "chrome-remote-interface": "^0.28.0", - "chrome-unmirror": "^0.1.0", - "debug": "^4.1.1", - "deep-assign": "^3.0.0", - "import-local": "^2.0.0", - "loglevel": "^1.4.1", - "meow": "^5.0.0", - "nanobus": "^4.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true - }, - "nanoassert": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", - "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=", - "dev": true - }, - "nanobus": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/nanobus/-/nanobus-4.5.0.tgz", - "integrity": "sha512-7sBZo9wthqNJ7QXnfVXZL7fkKJLN55GLOdX+RyZT34UOvxxnFtJe/c7K0ZRLAKOvaY1xJThFFn0Usw2H9R6Frg==", - "dev": true, - "requires": { - "nanoassert": "^1.1.0", - "nanotiming": "^7.2.0", - "remove-array-items": "^1.0.0" - } - }, "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "nanoscheduler": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/nanoscheduler/-/nanoscheduler-1.0.3.tgz", - "integrity": "sha512-jBbrF3qdU9321r8n9X7yu18DjP31Do2ItJm3mWrt90wJTrnDO+HXpoV7ftaUglAtjgj9s+OaCxGufbvx6pvbEQ==", - "dev": true, - "requires": { - "nanoassert": "^1.1.0" - } - }, - "nanotiming": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/nanotiming/-/nanotiming-7.3.1.tgz", - "integrity": "sha512-l3lC7v/PfOuRWQa8vV29Jo6TG10wHtnthLElFXs4Te4Aas57Fo4n1Q8LH9n+NDh9riOzTVvb2QNBhTS4JUKNjw==", - "dev": true, - "requires": { - "nanoassert": "^1.1.0", - "nanoscheduler": "^1.0.2" - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -4884,133 +3444,36 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-osc": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/node-osc/-/node-osc-4.1.0.tgz", - "integrity": "sha512-VXMbmLMFxLt2rbUWxCLcq5nEcSXf6Zxyepzh6Vh6zDeIO/xBNqH5X1R6DuoITi4WOs1ae6VKu3ZwQJDN5D+Cdg==", - "dev": true, - "requires": { - "jspack": "0.0.4", - "osc-min": "^1.1.1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", @@ -5023,15 +3486,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -5045,36 +3499,95 @@ } }, "object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "es-abstract": "^1.19.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true + } } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "requires": { - "isobject": "^3.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" } }, - "object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "ee-first": "1.1.1" } }, "once": { @@ -5101,6 +3614,15 @@ "tree-kill": "^1.2.2" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -5115,21 +3637,6 @@ "word-wrap": "^1.2.3" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "osc-min": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/osc-min/-/osc-min-1.1.2.tgz", - "integrity": "sha512-8DbiO8ME85R75stgNVCZtHxB9MNBBNcyy+isNBXrsFeinXGjwNAauvKVmGlfRas5VJWC/mhzIx7spR2gFvWxvg==", - "dev": true, - "requires": { - "binpack": "~0" - } - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -5152,38 +3659,11 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "p5": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/p5/-/p5-1.3.1.tgz", - "integrity": "sha512-g7W2htgEwiAEGcl0WHccAJKbunUJwrUojUSR9+KihphJ33p5VpDdh1K8pDx4ppYjOr/lVEXaZ1XXDj27nwlNOg==", - "dev": true - }, - "p5.touchgui": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/p5.touchgui/-/p5.touchgui-0.5.2.tgz", - "integrity": "sha512-qi+puv0odBvKOFVlDV6veKw1okiAGkpa1J6ZqKDJ8Pr6iKHYAh+xPXC/uZo+tmYLABBDLa3Ro6KwaZbgHZMNCw==", - "dev": true, - "requires": { - "node-osc": "4.1.0", - "socket.io": "2.2.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/p5/-/p5-1.4.0.tgz", + "integrity": "sha512-U888W2ChcIzPhRhnv4FkNhaa4f5BDIWZfLhzvx9ZrQ5KtkZr/+o1UPIicV3yWTRy0HEG23NviHyDR3kgjaJ9wA==", "dev": true }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5193,71 +3673,12 @@ "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true, - "optional": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5275,18 +3696,9 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "pathval": { "version": "1.1.1", @@ -5294,236 +3706,68 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "picomatch": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "preact": { + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/preact/-/preact-8.2.9.tgz", + "integrity": "sha512-ThuGXBmJS3VsT+jIP+eQufD3L8pRw/PY3FoCys6O9Pu6aF12Pn9zAJDX99TfwRAFOCEKm/P0lwiPTbqKMJp0fA==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "preact": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/preact/-/preact-8.2.9.tgz", - "integrity": "sha512-ThuGXBmJS3VsT+jIP+eQufD3L8pRw/PY3FoCys6O9Pu6aF12Pn9zAJDX99TfwRAFOCEKm/P0lwiPTbqKMJp0fA==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" } }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } + "react-is": "^16.13.1" } }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", "dev": true }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, "randombytes": { @@ -5535,115 +3779,39 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "raw-body": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "bytes": "3.1.1", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "safer-buffer": ">= 2.1.2 < 3" } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true } } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "readdirp": { "version": "3.5.0", @@ -5653,55 +3821,24 @@ "picomatch": "^2.2.1" } }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "resolve": "^1.9.0" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "remove-array-items": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/remove-array-items/-/remove-array-items-1.1.1.tgz", - "integrity": "sha512-MXW/jtHyl5F1PZI7NbpS8SOtympdLuF20aoWJT5lELR1p/HJDd5nqW8Eu9uLh/hCRY3FgvrIT5AwDCgBODklcA==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true, - "optional": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "require-directory": { @@ -5709,17 +3846,17 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -5729,660 +3866,224 @@ "path-parse": "^1.0.6" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "seed-random": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", - "integrity": "sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ=" - }, - "seedrandom": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", - "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=" - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "glob": "^7.1.3" } }, - "socket.io": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.2.0.tgz", - "integrity": "sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w==", + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { - "debug": "~4.1.0", - "engine.io": "~3.3.1", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.2.0", - "socket.io-parser": "~3.3.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "queue-microtask": "^1.2.2" } }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "socket.io-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", - "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.3.1", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true } } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "seedrandom": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", + "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=" }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "lru-cache": "^6.0.0" } }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "randombytes": "^2.1.0" } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "spdx-expression-parse": { + "shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "kind-of": "^6.0.2" } }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, - "ssf": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", - "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", - "requires": { - "frac": "~1.1.2" - } + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } + "socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" } }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "streamroller": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", "dev": true, "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "date-format": "^4.0.3", + "debug": "^4.1.1", + "fs-extra": "^10.0.0" } }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -6413,23 +4114,6 @@ "define-properties": "^1.1.3" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -6444,10 +4128,10 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-indent": { + "strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-json-comments": { @@ -6464,194 +4148,78 @@ "has-flag": "^4.0.0" } }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dev": true, "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } }, "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", + "jest-worker": "^27.4.1", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "terser": "^5.7.2" }, "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "randombytes": "^2.1.0" } } } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "rimraf": "^3.0.0" } }, "to-regex-range": { @@ -6662,6 +4230,12 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, "topojson-client": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", @@ -6670,34 +4244,32 @@ "commander": "2" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, "ts-loader": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.2.0.tgz", - "integrity": "sha512-ebXBFrNyMSmbWgjnb3WBloUBK+VSx1xckaXsMXxlZRDqce/OPdYBVN5efB0W3V0defq0Gcy4YuzvPGqRgjj85A==", + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", + "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", "dev": true, "requires": { "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", + "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" } }, "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", "dev": true, "requires": { "@types/json5": "^0.0.29", @@ -6728,12 +4300,6 @@ } } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6750,32 +4316,36 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typed-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.0.0.tgz", "integrity": "sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA==" }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "dev": true }, "ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" }, "unbox-primitive": { "version": "1.0.1", @@ -6789,142 +4359,31 @@ "which-boxed-primitive": "^1.0.2" } }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true }, - "unset-value": { + "unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } + "punycode": "^2.1.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, "v8-compile-cache": { @@ -6933,15 +4392,11 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true }, "vega": { "version": "5.20.0", @@ -7070,21 +4525,32 @@ } }, "vega-functions": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.12.0.tgz", - "integrity": "sha512-3hljmGs+gR7TbO/yYuvAP9P5laKISf1GKk4yRHLNdM61fWgKm8pI3f6LY2Hvq9cHQFTiJ3/5/Bx2p1SX5R4quQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.12.1.tgz", + "integrity": "sha512-7cHfcjXOj27qEbh2FTzWDl7FJK4xGcMFF7+oiyqa0fp7BU/wNT5YdNV0t5kCX9WjV7mfJWACKV74usLJbyM6GA==", "requires": { "d3-array": "^2.7.1", "d3-color": "^2.0.0", "d3-geo": "^2.0.1", "vega-dataflow": "^5.7.3", - "vega-expression": "^4.0.1", + "vega-expression": "^5.0.0", "vega-scale": "^7.1.1", "vega-scenegraph": "^4.9.3", - "vega-selections": "^5.3.0", + "vega-selections": "^5.3.1", "vega-statistics": "^1.7.9", "vega-time": "^2.0.4", "vega-util": "^1.16.0" + }, + "dependencies": { + "vega-expression": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.0.0.tgz", + "integrity": "sha512-y5+c2frq0tGwJ7vYXzZcfVcIRF/QGfhf2e+bV1Z0iQs+M2lI1II1GPDdmOcMKimpoCVp/D61KUJDIGE1DSmk2w==", + "requires": { + "@types/estree": "^0.0.50", + "vega-util": "^1.16.0" + } + } } }, "vega-geo": { @@ -7156,9 +4622,9 @@ }, "dependencies": { "vega-util": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.16.1.tgz", - "integrity": "sha512-FdgD72fmZMPJE99FxvFXth0IL4BbLA93WmBg/lvcJmfkK4Uf90WIlvGwaIUdSePIsdpkZjBPyQcHMQ8OcS8Smg==" + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.17.0.tgz", + "integrity": "sha512-HTaydZd9De3yf+8jH66zL4dXJ1d1p5OIFyoBzFiOli4IJbwkL1jrefCKz6AHDm1kYBzDJ0X4bN+CzZSCTvNk1w==" } } }, @@ -7170,9 +4636,9 @@ } }, "vega-loader": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.4.0.tgz", - "integrity": "sha512-e5enQECdau7rJob0NFB5pGumh3RaaSWWm90+boxMy3ay2b4Ki/3XIvo+C4F1Lx04qSxvQF7tO2LJcklRm6nqRA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.4.1.tgz", + "integrity": "sha512-dj65i4qlNhK0mOmjuchHgUrF5YUaWrYpx0A8kXA68lBk5Hkx8FNRztkcl07CZJ1+8V81ymEyJii9jzGbhEX0ag==", "requires": { "d3-dsv": "^2.0.0", "node-fetch": "^2.6.1", @@ -7182,22 +4648,32 @@ }, "dependencies": { "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } } } }, "vega-parser": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-6.1.3.tgz", - "integrity": "sha512-8oiVhhW26GQ4GZBvolId8FVFvhn3s1KGgPlD7Z+4P2wkV+xe5Nqu0TEJ20F/cn3b88fd0Vj48X3BH3dlSeKNFg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-6.1.4.tgz", + "integrity": "sha512-tORdpWXiH/kkXcpNdbSVEvtaxBuuDtgYp9rBunVW9oLsjFvFXbSWlM1wvJ9ZFSaTfx6CqyTyGMiJemmr1QnTjQ==", "requires": { "vega-dataflow": "^5.7.3", - "vega-event-selector": "^2.0.6", - "vega-functions": "^5.12.0", + "vega-event-selector": "^3.0.0", + "vega-functions": "^5.12.1", "vega-scale": "^7.1.1", "vega-util": "^1.16.0" + }, + "dependencies": { + "vega-event-selector": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.0.tgz", + "integrity": "sha512-Gls93/+7tEJGE3kUuUnxrBIxtvaNeF01VIFB2Q2Of2hBIBvtHX74jcAdDtkh5UhhoYGD8Q1J30P5cqEBEwtPoQ==" + } } }, "vega-projection": { @@ -7255,23 +4731,34 @@ } }, "vega-schema-url-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-2.1.0.tgz", - "integrity": "sha512-JHT1PfOyVzOohj89uNunLPirs05Nf59isPT5gnwIkJph96rRgTIBJE7l7yLqndd7fLjr3P8JXHGAryRp74sCaQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-2.2.0.tgz", + "integrity": "sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw==" }, "vega-selections": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.3.0.tgz", - "integrity": "sha512-vC4NPsuN+IffruFXfH0L3i2A51RgG4PqpLv85TvrEAIYnSkyKDE4bf+wVraR3aPdnLLkc3+tYuMi6le5FmThIA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.3.1.tgz", + "integrity": "sha512-cm4Srw1WHjcLGXX7GpxiUlfESv8XPu5b6Vh3mqMDPU94P2FO91SR9gei+EtRdt+KCFgIjr//MnRUjg/hAWwjkQ==", "requires": { - "vega-expression": "^4.0.1", + "vega-expression": "^5.0.0", "vega-util": "^1.16.0" + }, + "dependencies": { + "vega-expression": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.0.0.tgz", + "integrity": "sha512-y5+c2frq0tGwJ7vYXzZcfVcIRF/QGfhf2e+bV1Z0iQs+M2lI1II1GPDdmOcMKimpoCVp/D61KUJDIGE1DSmk2w==", + "requires": { + "@types/estree": "^0.0.50", + "vega-util": "^1.16.0" + } + } } }, "vega-statistics": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.7.9.tgz", - "integrity": "sha512-T0sd2Z08k/mHxr1Vb4ajLWytPluLFYnsYqyk4SIS5czzUs4errpP2gUu63QJ0B7CKNu33vnS9WdOMOo/Eprr/Q==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.7.10.tgz", + "integrity": "sha512-QLb12gcfpDZ9K5h3TLGrlz4UXDH9wSPyg9LLfOJZacxvvJEPohacUQNrGEAVtFO9ccUCerRfH9cs25ZtHsOZrw==", "requires": { "d3-array": "^2.7.1" } @@ -7346,748 +4833,206 @@ "requires": { "vega-dataflow": "^5.7.3", "vega-scenegraph": "^4.9.2", - "vega-util": "^1.15.2" - } - }, - "vega-voronoi": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.1.5.tgz", - "integrity": "sha512-950IkgCFLj0zG33EWLAm1hZcp+FMqWcNQliMYt+MJzOD5S4MSpZpZ7K4wp2M1Jktjw/CLKFL9n38JCI0i3UonA==", - "requires": { - "d3-delaunay": "^5.3.0", - "vega-dataflow": "^5.7.3", - "vega-util": "^1.15.2" - } - }, - "vega-wordcloud": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.1.3.tgz", - "integrity": "sha512-is4zYn9FMAyp9T4SAcz2P/U/wqc0Lx3P5YtpWKCbOH02a05vHjUQrQ2TTPOuvmMfAEDCSKvbMSQIJMOE018lJA==", - "requires": { - "vega-canvas": "^1.2.5", - "vega-dataflow": "^5.7.3", - "vega-scale": "^7.1.1", - "vega-statistics": "^1.7.9", - "vega-util": "^1.15.2" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "vega-util": "^1.15.2" + } + }, + "vega-voronoi": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.1.5.tgz", + "integrity": "sha512-950IkgCFLj0zG33EWLAm1hZcp+FMqWcNQliMYt+MJzOD5S4MSpZpZ7K4wp2M1Jktjw/CLKFL9n38JCI0i3UonA==", + "requires": { + "d3-delaunay": "^5.3.0", + "vega-dataflow": "^5.7.3", + "vega-util": "^1.15.2" + } + }, + "vega-wordcloud": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.1.3.tgz", + "integrity": "sha512-is4zYn9FMAyp9T4SAcz2P/U/wqc0Lx3P5YtpWKCbOH02a05vHjUQrQ2TTPOuvmMfAEDCSKvbMSQIJMOE018lJA==", + "requires": { + "vega-canvas": "^1.2.5", + "vega-dataflow": "^5.7.3", + "vega-scale": "^7.1.1", + "vega-statistics": "^1.7.9", + "vega-util": "^1.15.2" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "version": "5.66.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.66.0.tgz", + "integrity": "sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.2" }, "dependencies": { "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true } } }, "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", + "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "find-up": "^4.0.0" } }, - "path-exists": { + "resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "resolve-from": "^5.0.0" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, "whatwg-fetch": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8114,57 +5059,11 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "wmf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", - "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==" - }, - "word": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", - "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==" + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true }, "word-wrap": { "version": "1.2.3", @@ -8172,19 +5071,10 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", "dev": true }, "wrap-ansi": { @@ -8204,45 +5094,9 @@ "dev": true }, "ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", - "dev": true - }, - "xlsx": { - "version": "0.16.9", - "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.9.tgz", - "integrity": "sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw==", - "requires": { - "adler-32": "~1.2.0", - "cfb": "^1.1.4", - "codepage": "~1.14.0", - "commander": "~2.17.1", - "crc-32": "~1.2.0", - "exit-on-epipe": "~1.0.1", - "fflate": "^0.3.8", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.3.0" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - } - } - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true }, "y18n": { @@ -8295,9 +5149,9 @@ }, "dependencies": { "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, "decamelize": { @@ -8308,12 +5162,6 @@ } } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 428d4dd..b16a7b2 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "build": "webpack --config webpack.config.js", - "test": "mocha-chrome test/test.html", + "test": "karma start --single-run --browsers ChromeHeadless karma.conf.js", "dev": "webpack --watch --config webpack.config.js", "all": "npm run build && npm run test", "postinstall": "./scripts/post-install.sh" @@ -16,25 +16,27 @@ "devDependencies": { "@tensorflow/tfjs-converter": "^1.2.9", "@tensorflow/tfjs-core": "^1.2.9", - "@types/chai": "^4.2.12", - "@types/mathjs": "^6.0.11", - "@types/mocha": "^8.0.3", - "@types/p5": "^0.9.1", - "@typescript-eslint/eslint-plugin": "^3.10.1", - "@typescript-eslint/parser": "^3.10.1", - "chai": "^4.2.0", - "eslint": "^7.9.0", - "eslint-config-airbnb-base": "^14.2.0", - "eslint-plugin-import": "^2.22.0", - "katex": "^0.13.3", - "mocha": "^8.1.3", - "mocha-chrome": "^2.2.0", - "p5": "^1.1.9", - "p5.touchgui": "^0.5.2", - "ts-loader": "^8.0.4", - "typescript": "^3.9.7", - "webpack": "^4.44.2", - "webpack-cli": "^3.3.12" + "@types/chai": "^4.3.0", + "@types/mathjs": "^9.4.2", + "@types/mocha": "^9.1.0", + "@types/p5": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", + "chai": "^4.3.4", + "eslint": "^8.7.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.25.4", + "karma": "^6.3.11", + "karma-chai": "^0.1.0", + "karma-chrome-launcher": "^3.1.0", + "karma-mocha": "^2.0.1", + "katex": "^0.15.2", + "mocha": "^9.1.4", + "p5": "^1.4.0", + "ts-loader": "^9.2.6", + "typescript": "^4.5.5", + "webpack": "^5.66.0", + "webpack-cli": "^4.9.1" }, "dependencies": { "@magenta/sketch": "0.2.0", @@ -52,9 +54,7 @@ "axios": "^0.21.1", "events": "^3.0.0", "face-api.js": "~0.22.2", - "onchange": "^6.1.0", - "mathjs": "^7.5.1", - "table": "^5.4.6", - "xlsx": "^0.16.9" + "mathjs": "^10.1.0", + "onchange": "^6.1.0" } } diff --git a/src/data/index.ts b/src/data/index.ts deleted file mode 100644 index e0e9522..0000000 --- a/src/data/index.ts +++ /dev/null @@ -1,50 +0,0 @@ -import * as tf from '@tensorflow/tfjs'; - -import * as dfd from '../lib/danfo'; -// @ts-ignore -import { neuralNetwork } from '../lib/ml5'; -import { Tensor } from '../tensor'; - -export const { DataFrame } = dfd; - -/** - * Creates a new DataFrame (2D tabular data structure). - * - * @param data JSON, Array, or 2D Tensor - * @returns the tensor - */ -export const createDataFrame = function createDataFrameObject( - data: Array | tf.Tensor | Tensor, - kwargs: object, -): dfd.DataFrame { - if (data instanceof Tensor ) { - return new DataFrame(data.tensor, kwargs); - } else { - return new DataFrame(data, kwargs); - } -}; - -/** - * Loads csv or json data from a file or a URL. - * - * @param filename String: name of the file or url to load - * @param extension String: parse the dataframe by comma-separated values "csv" or JSON "json" - * @param callback Function: function to be executed after loadDataFrame() completes. On success, the DataFrame object is passed in as the first argument. - * @param errorCallback Function: function to be executed if there is an error, response is passed in as first argument (Optional) - */ - export const loadDataFrame = function _loadDataFrame( - filename: string, - extension: string, - callback: any, - errorCallback: any, -) { - if (extension === 'csv') { - dfd.read_csv(filename) - .then(callback) - .catch(errorCallback); - } else if (extension === 'json') { - dfd.read_json(filename) - .then(callback) - .catch(errorCallback); - } - }; diff --git a/src/index.ts b/src/index.ts index 2bd05f1..e3c25d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,5 @@ import * as tf from '@tensorflow/tfjs'; import * as math from 'mathjs'; -import * as dfd from './lib/danfo'; import * as ml5 from './lib/ml5'; import { Turtle } from './lib/turtle'; import { @@ -10,11 +9,6 @@ import { parse, simplify, } from './algebra'; -import { - DataFrame, - createDataFrame, - loadDataFrame, -} from './data'; import { Tensor, createTensor } from './tensor'; import { add, @@ -86,8 +80,6 @@ import { declare const p5: any; declare const window: any; -p5.prototype.createDataFrame = createDataFrame; -p5.prototype.loadDataFrame = loadDataFrame; p5.prototype.createTensor = createTensor; p5.prototype.registerMethod('init', startScope); p5.prototype.registerMethod('pre', startScope); @@ -106,9 +98,6 @@ export { evaluate, parse, simplify, - // Data - dfd, - DataFrame, // Tensor tf, Tensor, diff --git a/src/lib/danfo/config/config.js b/src/lib/danfo/config/config.js deleted file mode 100644 index 268663d..0000000 --- a/src/lib/danfo/config/config.js +++ /dev/null @@ -1,54 +0,0 @@ - -/** - * Package wide configuration class - */ -export class Configs { - constructor() { - this.table_width = 17; //set the width of each column printed in console - this.table_truncate = 16; //set the max number of string before text is truncated in printing - this.dtype_test_lim = 10; - this.table_max_row = 21; - this.table_max_col_in_console = 7; - } - - set_width(val) { - this.table_width = val; - } - - get get_width() { - return this.table_width; - } - - set_max_col_in_console(val) { - this.table_max_col_in_console = val; - } - - get get_max_col_in_console() { - return this.table_max_col_in_console; - } - - set_row_num(val) { - this.table_max_row = val; - } - - get get_max_row() { - return this.table_max_row; - } - - - get get_truncate() { - return this.table_truncate; - } - - set_truncate(val) { - this.table_truncate = val; - } - - get get_dtype_test_lim() { - return this.dtype_test_lim; - } - - set_dtype_test_lim(val) { - this.dtype_test_lim = val; - } -} diff --git a/src/lib/danfo/core/concat.js b/src/lib/danfo/core/concat.js deleted file mode 100644 index aa9bf9a..0000000 --- a/src/lib/danfo/core/concat.js +++ /dev/null @@ -1,221 +0,0 @@ -import { DataFrame } from './frame'; -import { Utils } from "./utils"; -import { Series } from './series'; - -const utils = new Utils(); - - -export class Concat { - constructor(kwargs) { - - - // check if keys exist in kwargs - utils.__in_object(kwargs, "df_list", "df_list not found: specify the list of dataframe"); - utils.__in_object(kwargs, "axis", "axis not found: specify the axis"); - - let df_list = null; //set the df_list to null - let axis = null; // set axis to null - let indexes = null; - - //check if df_list is an array - if (Array.isArray(kwargs["df_list"])) { - - df_list = kwargs["df_list"]; - } else { - throw new Error("df_list must be an Array of dataFrames/Series"); - } - - //check if axis is int and is either 0 or 1 - if (typeof kwargs["axis"] === "number") { - - if (kwargs["axis"] == 0 || kwargs["axis"] == 1) { - - axis = kwargs["axis"]; - } else { - axis = 1; - // throw new Error("Invalid axis: axis must be 0 or 1") - } - - } else { - throw new Error("axis must be a number"); - } - - - let df_object = Object.assign({}, df_list); // convert the array to object - - if (axis == 1) { - - let columns = []; - let duplicate_col_count = {}; - let max_length = 0; - let a_key = Object.keys(df_object)[0]; - indexes = df_object[a_key].index; - for (let key in df_object) { - - let column = df_object[key].columns; - let length = df_object[key].values.length; - - if (length > max_length) { - max_length = length; - } - - for (let index in column) { - - let col_name = column[index]; - if (col_name in duplicate_col_count) { - - let count = duplicate_col_count[col_name]; - let name = `${col_name}_${count + 1}`; - - columns.push(name); - - duplicate_col_count[col_name] = count + 1; - } else { - - columns.push(col_name); - duplicate_col_count[col_name] = 1; - } - } - - - } - - let data = new Array(max_length); - - for (let key in df_list) { - - let values = df_list[key].values; - - for (let index = 0; index < values.length; index++) { - - let val = values[index]; - if (typeof data[index] === "undefined") { - - if (Array.isArray(val)){ - data[index] = val; - } else { - data[index] = [ val ]; - } - - } else { - if (Array.isArray(val)){ - data[index].push(...val); - } else { - data[index].push(val); - } - - } - } - - if (values.length < max_length) { - let column_length = df_list[key].columns.length; - let null_array = Array(column_length); - - for (let col = 0; col < column_length; col++) { - null_array[col] = NaN; - } - - if (typeof data[max_length - 1] === "undefined") { - data[max_length - 1] = null_array; - } else { - data[max_length - 1].push(...null_array); - } - } - } - - let df = new DataFrame(data, { columns: columns, index: indexes }); //convert to dataframe - return df; - } else { - //concatenate base on axis 0 - let columns = []; - let row_indexes = []; - let col_i = 0; - for (let key in df_list) { - let column = df_list[key].columns; - columns.push(...column); - indexes = df_list[key].index; - let r_index = indexes.map((val) => { - return `${val}_row${col_i}`; - }); - row_indexes.push(...r_index); - col_i += 1; - } - - let column_set = new Set(columns); - - columns = Array.from(column_set); - - let data = []; - - for (let key in df_list) { - - let value = df_list[key].values; - - // let col_length = value[0].length - - let df_columns = df_list[key].columns; - - let not_exist = []; - for (let col_index in columns) { - let col_name = columns[col_index]; - - let is_index = df_columns.indexOf(col_name); - - if (is_index == -1) { - not_exist.push(col_name); - } - } - if (not_exist.length > 0) { - for (let i = 0; i < value.length; i++) { - let row_value = value[i]; - - let new_arr = Array(columns.length); - for (let j = 0; j < columns.length; j++) { - - let col_name = columns[j]; - if (not_exist.includes(col_name)) { - - new_arr[j] = NaN; - } else { - let index = df_columns.indexOf(col_name); - if (Array.isArray(row_value)){ - new_arr[j] = row_value[index]; - } else { - new_arr[j] = row_value; - } - - } - - } - data.push(new_arr); - } - } else { - data.push(...value); - } - - } - - if (Array.isArray(data[0])){ - let df = new DataFrame(data, { columns: columns, index: row_indexes }); - return df; - } else { - let sf = new Series(data, { index: row_indexes }); - return sf; - } - - - } - - } -} - - -/** -* Concatenate pandas objects along a particular axis with optional set logic along the other axes. -* @param {kwargs} {df_list: List of DataFrame to concatenate together axis: 0 for row axis and 1 for index axis -* @returns {DataFrame} -*/ -export const concat = (kwargs) => { - let concat_sf = new Concat(kwargs); - return concat_sf; -}; diff --git a/src/lib/danfo/core/date_range.js b/src/lib/danfo/core/date_range.js deleted file mode 100644 index 8e1ed43..0000000 --- a/src/lib/danfo/core/date_range.js +++ /dev/null @@ -1,289 +0,0 @@ -import { Utils } from "./utils"; - -const utils = new Utils; - -/** - * Generate date range between a specified set of date - * @param {kwargs} kwargs { - * start : string - * end : string - * period: int - * freq : string - * } - * @returns Array - */ -export class date_range { - constructor(kwargs){ - - this.offset = null; - - if (utils.__key_in_object(kwargs, "start")){ - this.start = kwargs["start"]; - } else { - this.start = null; - } - - if (utils.__key_in_object(kwargs, "end")){ - this.end = kwargs["end"]; - } else { - this.end = null; - } - - if (utils.__key_in_object(kwargs, "period")){ - this.period = kwargs["period"]; - } else { - this.period = null; - } - - if (utils.__key_in_object(kwargs, "freq")){ - this.freq = kwargs["freq"]; - } else { - this.freq = "D"; - } - - this.freq_list = [ "M", "D", "s", "H", "m", "Y" ]; - - if (this.freq.length == 1){ - if (!this.freq_list.includes(this.freq)){ - throw new Error(`invalid freq ${this.freq}`); - } - } else { - let freq_split = this.freq.split(""); - this.offset = parseInt(freq_split[0]); - this.freq = freq_split[1]; - if (!this.freq_list.includes(this.freq)){ - throw new Error(`invalid freq ${this.freq}`); - } - } - - let rslt = this.range(this.start, this.end, this.period, this.offset); - return rslt; - - } - - range(start, end, period, offset = null){ - - let start_date = null; - let end_date = null; - let start_range = null; - let end_range = null; - if (start && end){ - start_date = new Date(start); - start_range = this.freq_type(start_date, this.freq); - end_date = new Date(end); - end_range = this.freq_type(end_date, this.freq); - - //check if the end year is greater than start year - let start_year = start_date.getFullYear(); - let end_year = end_date.getFullYear(); - if ((start_year < end_year)){ - // end_range = start_range + end_range - if (this.freq == "M"){ - end_range = this.month_end(start_date, end_date); - } else if (this.freq == "D"){ - end_range = this.day_end(start_date, end_date) - start_range; - - } - } - - let range_array = utils.__range(start_range, end_range); - - if (offset){ - range_array = this.offset_count(range_array, offset); - } - - if (this.freq == "M"){ - range_array = this.month_range(range_array); - } - - let date_range = range_array.map((x) => { - return this.set_dateProps(start_date, this.freq, x); - }); - date_range[date_range.length - 1] = end_date; - - let date_string = this.toLocalString(date_range); - - return date_string; - } else if (start && !(end)){ - start_date = new Date(start); - start_range = this.freq_type(start_date, this.freq); - end_range = offset ? ((period * offset) - 1) : period - 1; - - if (start_range > end_range){ - end_range = end_range + start_range; - } - let range_array = utils.__range(start_range, end_range); - - - if (offset){ - range_array = this.offset_count(range_array, offset); - } - - let date_range = range_array.map((x) => { - return this.set_dateProps(start_date, this.freq, x); - }); - - let date_string = this.toLocalString(date_range); - return date_string; - - } else if (end && !(start)){ - end_date = new Date(end); - end_range = this.freq_type(end_date, this.freq); - start_range = (end_range - period) + 1; - - let range_array = utils.__range(start_range, end_range); - - if (offset){ - range_array = this.offset_count(range_array, offset); - } - - let date_range = range_array.map((x) => { - return this.set_dateProps(end_date, this.freq, x); - }); - - let date_string = this.toLocalString(date_range); - return date_string; - } - } - - freq_type(date, ftype){ - - let rslt = null; - switch (ftype){ - - case "M": - rslt = date.getMonth(); - break; - case "Y": - rslt = date.getFullYear(); - break; - case "s": - rslt = date.getSeconds(); - break; - case "D": - rslt = date.getDate(); - break; - case "H": - rslt = date.getHours(); - break; - case "m": - rslt = date.getMinutes(); - break; - } - return rslt; - } - - offset_count(d_array, offset){ - - let r_array = []; - - for (let i = 0; i < d_array.length; i += offset){ - r_array.push(d_array[i]); - } - return r_array; - } - - set_dateProps(date, ftype, val){ - - let new_date = new Date(date.valueOf()); - switch (ftype){ - - case "M": - if (val.length == 2){ - - new_date.setYear(new_date.getFullYear() + val[0]); - new_date.setMonth(parseInt(val[1])); - } else { - new_date.setMonth(val); - } - - break; - case "Y": - new_date.setYear(val); - break; - case "s": - new_date.setSeconds(val); - break; - case "D": - new_date.setDate(val); - break; - case "H": - new_date.setHours(val); - break; - case "m": - new_date.setMinutes(val); - break; - } - return new_date; - } - - toLocalString(d_array){ - - let r_array = d_array.map((x) => { - - return x.toLocaleString(); - }); - - return r_array; - } - - month_end(start_date, end_date){ - - let end_month = end_date.getMonth(); - - let diff_year = end_date.getFullYear() - start_date.getFullYear(); - - let end_range = (12 * diff_year) + end_month; - - return end_range; - } - - month_range(range){ - - let minus = null; - let y_val = 0; - let d_range = range.map((x) => { - - if (x > 11){ - if (x % 12 == 0){ - minus = x; - y_val = x / 12; - return [ y_val, (x - minus) ]; - } else { - return [ y_val, (x - minus) ]; - } - - } - return [ y_val, x ]; - }); - - return d_range; - } - - day_end(start_date, end_date){ - - let month_end = this.month_end(start_date, end_date); - let range = utils.__range(start_date.getMonth(), month_end); - let m_range = this.month_range(range); - - // let s_date = new Date(start_date.getFullYear(),start_date.getMonth(),0) - let sum = 0; - for (let i = 0; i < m_range.length; i++){ - - let val = m_range[i]; - - let d_date = null; - if (i === m_range.length - 1) { - d_date = new Date(start_date.getFullYear() + val[0], val[1], end_date.getDate()).getDate(); - } else { - d_date = new Date(start_date.getFullYear() + val[0], val[1], 0).getDate(); - - } - - sum += d_date; - - } - return sum; - - } -} diff --git a/src/lib/danfo/core/frame.js b/src/lib/danfo/core/frame.js deleted file mode 100644 index 927fc9f..0000000 --- a/src/lib/danfo/core/frame.js +++ /dev/null @@ -1,2172 +0,0 @@ -/** -* Copyright 2021, JsData. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. - -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import * as tf from "@tensorflow/tfjs"; -import Ndframe from "./generic"; -import { Series } from "./series"; -import { Utils } from "./utils"; -import { GroupBy } from "./groupby"; -import { Plot } from "../plotting/plot"; -import { indexLoc } from "./indexing"; -import { concat } from "./concat.js"; - -const utils = new Utils(); -import { std, variance } from "mathjs"; - -/** - * A 2D frame object that stores data in structured tabular format - * @param {data} data, JSON, Array, 2D Tensor - * @param {kwargs} Object {columns: Array of column names, defaults to ordered numbers when not specified - * dtypes: strings of data types, automatically inferred when not specified - * index: row index for subseting array, defaults to ordered numbers when not specified} - * - * @returns DataFrame - */ -export class DataFrame extends Ndframe { - constructor(data, kwargs) { - super(data, kwargs); - this._set_column_property(); //set column property on DataFrame Class for easy accessing using the format df['colname'] - } - - _set_column_property() { - let col_vals = this.col_data; - let col_names = this.column_names; - - col_vals.forEach((col, i) => { - this[col_names[i]] = null; - Object.defineProperty(this, col_names[i], { - get() { - return new Series(this.col_data[i], { - columns: col_names[i], - index: this.index - }); - }, - set(value) { - this.addColumn({ column: col_names[i], value: value }); - } - }); - }); - } - /** - * Write a CSV file of the DataFrame contents - * @param {string} csvFilePath Path to save CSV when in Node.js form - * @returns {Promise} CSV representation of Object data - * - */ - async to_csv(csvFilePath = "") { - const csvContent = await super.to_csv(); - // Download CSV on Web - const webCSV = "data:text/csv;charset=utf-8," + csvContent; - window.open(encodeURI(webCSV)); - return csvContent; - } - - /** - * Drop a list of rows or columns base on the specified axis - * @param {Object} kwargs Configuration object - * {columns: [Array(Columns| Index)] array of column names to drop - * axis: row=0, columns=1 - * inplace: specify whether to drop the row/column with/without creating a new DataFrame} - * @returns null | DataFrame - * - */ - drop(kwargs = {}) { - let params_needed = [ "columns", "index", "inplace", "axis" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - kwargs["inplace"] = kwargs["inplace"] || false; - - if (!("axis" in kwargs)) { - kwargs["axis"] = 1; - } - - let to_drop = null; - if ("index" in kwargs && kwargs["axis"] == 0) { - to_drop = kwargs["index"]; - } else { - to_drop = kwargs["columns"]; - } - - if (kwargs["axis"] == 1) { - if (!("columns" in kwargs)) { - throw Error( - "No column found. Axis of 1 must be accompanied by an array of column(s) names" - ); - } - let self = this; - let new_col_data = {}; - let new_dtype = []; - - const index = to_drop.map((x) => { - let col_idx = self.columns.indexOf(x); - if (col_idx == -1) { - throw new Error(`column "${x}" does not exist`); - } - return col_idx; - }); - - this.col_data.forEach((col, idx) => { - if (!index.includes(idx)) { - new_col_data[self.column_names[idx]] = col; - new_dtype.push(self.dtypes[idx]); - } - }); - - if (!kwargs["inplace"]) { - let old_cols = self.columns; - let new_columns = Object.keys(new_col_data); - let df = new DataFrame(new_col_data, { - index: self.index, - dtypes: new_dtype - }); - df.__set_col_property(df, df.col_data, new_columns, old_cols); - return df; - } else { - let old_cols = self.columns; - let new_columns = Object.keys(new_col_data); - this.__update_frame_in_place(null, null, new_col_data, null, new_dtype); - this.__set_col_property(self, self.col_data, new_columns, old_cols); - } - } else { - if (!utils.__key_in_object(kwargs, "index")) { - throw Error( - "No index label found. Axis of 0 must be accompanied by an array of index labels" - ); - } - to_drop.forEach((x) => { - if (!this.index.includes(x)) - throw new Error(`${x} does not exist in index`); - }); - const values = this.values; - let data_idx = []; - let new_data, new_index; - if (typeof to_drop[0] == "string") { - //get index of strings labels in rows - this.index.forEach((idx, i) => { - if (to_drop.includes(idx)) { - data_idx.push(i); - } - }); - new_data = utils.__remove_arr(values, data_idx); - new_index = utils.__remove_arr(this.index, data_idx); - } else { - new_data = utils.__remove_arr(values, to_drop); - new_index = utils.__remove_arr(this.index, to_drop); - } - - if (!kwargs["inplace"]) { - return new DataFrame(new_data, { - columns: this.columns, - index: new_index - }); - } else { - this.row_data_tensor = tf.tensor(new_data); - this.data = new_data; - this.__set_index(new_index); - } - } - } - - /** - * Purely label based indexing. Can accept string label names for both rows and columns - * @param {kwargs} kwargs object {rows: Array of index, columns: Array of column name(s)} - * @return DataFrame data stucture - */ - loc(kwargs = {}) { - let params_needed = [ "columns", "rows" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - kwargs["type"] = "loc"; - let [ new_data, columns, rows ] = indexLoc(this, kwargs); - let df_columns = { columns: columns }; - let df = new DataFrame(new_data, df_columns); - df.__set_index(rows); - return df; - } - - /** - * Access a dataframe element using row and column index - * @param {*} kwargs object {rows: Array of index, columns: Array of column index} - * @return DataFrame data stucture - */ - iloc(kwargs = {}) { - let params_needed = [ "columns", "rows" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - kwargs["type"] = "iloc"; - - let [ new_data, columns, rows ] = indexLoc(this, kwargs); - let df_columns = { columns: columns }; - let df = new DataFrame(new_data, df_columns); - df.__set_index(rows); - return df; - } - - /** - * Prints the first n values in a dataframe - * @param {rows} rows --> int - * @returns DataFrame - */ - head(rows = 5) { - if (rows > this.values.length || rows < 1) { - //return all values - return this; - } else { - //Creates a new dataframe with first [rows] - let data = this.values.slice(0, rows); - let idx = this.index.slice(0, rows); - let config = { columns: this.column_names, index: idx }; - let df = new DataFrame(data, config); - return df; - } - } - - /** - * Prints the last n values in a dataframe - * @param {rows} rows --> int - * @returns DataFrame - */ - tail(rows = 5) { - let row_len = this.values.length; - if (rows > row_len || rows < 1) { - //return all values - return this; - } else { - //Creates a new dataframe with last [rows] - let data = this.values.slice(row_len - rows); - let indx = this.index.slice(row_len - rows); - let config = { columns: this.column_names, index: indx }; - let df = new DataFrame(data, config); - return df; - } - } - - /** - * Gets [num] number of random rows in a dataframe - * @param {num} rows --> The number of rows to return - * @param {seed} seed --> (Optional) An integer specifying the random seed that will be used to create the distribution. - * @returns {Promise} resolves to a DataFrame object - */ - async sample(num = -1, seed = 1) { - if (num > this.shape[0]) { - throw new Error("Sample size n cannot be bigger than size of dataset"); - } - if (num < -1 || num == 0) { - throw new Error("Sample size cannot be less than -1 or 0"); - } - num = num === -1 ? this.shape[0] : num; - const shuffled_index = await tf.data.array(this.index).shuffle(num, seed).take(num).toArray(); - const df = this.iloc({ rows: shuffled_index }); - return df; - } - - - /** - * Return Addition of DataFrame and other, element-wise (binary operator add). - * @param {other} DataFrame, Series, Array or Number to add - * @returns {DataFrame} - */ - add(other, axis) { - if (this.__frame_is_compactible_for_operation) { - //check if all types a numeric - let tensors = this.__get_ops_tensors([ this, other ], axis); - let sum_vals = tensors[0].add(tensors[1]); - let col_names = this.columns; - return this.__get_df_from_tensor(sum_vals, col_names); - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return subtraction of DataFrame and other, element-wise (binary operator add). - * @param {other} DataFrame, Series, Array or Number to add - * @returns {DataFrame} - */ - sub(other, axis) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let tensors = this.__get_ops_tensors([ this, other ], axis); - let result = tensors[0].sub(tensors[1]); - let col_names = this.columns; - return this.__get_df_from_tensor(result, col_names); - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return subtraction of DataFrame and other, element-wise (binary operator add). - * @param {other} DataFrame, Series, Array or Number to add - * @returns {DataFrame} - */ - mul(other, axis) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let tensors = this.__get_ops_tensors([ this, other ], axis); - let result = tensors[0].mul(tensors[1]); - let col_names = this.columns; - return this.__get_df_from_tensor(result, col_names); - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return division of DataFrame and other, element-wise (binary operator add). - * @param {other} DataFrame, Series, Array or Number to add - * @returns {DataFrame} - */ - div(other, axis) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let tensors = this.__get_ops_tensors([ this, other ], axis); - let result = tensors[0].div(tensors[1]); - let col_names = this.columns; - return this.__get_df_from_tensor(result, col_names); - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return division of DataFrame and other, element-wise (binary operator add). - * @param {other} DataFrame, Series, Array or Number to add - * @returns {DataFrame} - */ - pow(other, axis) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let tensors = this.__get_ops_tensors([ this, other ], axis); - let result = tensors[0].pow(tensors[1]); - let col_names = this.columns; - return this.__get_df_from_tensor(result, col_names); - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return division of DataFrame and other, element-wise (binary operator add). - * @param {other} DataFrame, Series, Array or Number to add - * @returns {DataFrame} - */ - mod(other, axis) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let tensors = this.__get_ops_tensors([ this, other ], axis); - let result = tensors[0].mod(tensors[1]); - let col_names = this.columns; - return this.__get_df_from_tensor(result, col_names); - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return mean of DataFrame across specified axis. - * @param {axis} Number {0: row, 1 : column} Axis for the function to be applied on - * @returns {Series} - */ - mean(axis = 1) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let operands = this.__get_tensor_and_idx(this, axis); - let tensor_vals = operands[0]; - let idx = operands[1]; - let result = tensor_vals.mean(operands[2]); - let sf = new Series(result.arraySync(), { index: idx }); - return sf; - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return median of DataFrame across specified axis. - * @param {axis} Number {0: row, 1 : column} Axis for the function to be applied on - * @returns {Series} - */ - median(axis = 1) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let tensor_vals, idx; - if (axis == 1) { - tensor_vals = this.col_data_tensor.arraySync(); - idx = this.column_names; - } else { - tensor_vals = this.row_data_tensor.arraySync(); - idx = this.index; - } - let median = utils.__median(tensor_vals, false); - let sf = new Series(median, { index: idx }); - return sf; - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return minimum element in a DataFrame across specified axis. - * @param {axis} Number {0: row, 1 : column} Axis for the function to be applied on - * @returns {Series} - */ - min(axis = 1) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let operands = this.__get_tensor_and_idx(this, axis); - let tensor_vals = operands[0]; - let idx = operands[1]; - let result = tensor_vals.min(operands[2]); - let sf = new Series(result.arraySync(), { index: idx }); - return sf; - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return maximum element of DataFrame across specified axis. - * @param {axis} Number {0: row, 1 : column} Axis for the function to be applied on - * @returns {Series} - */ - max(axis = 1) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let operands = this.__get_tensor_and_idx(this, axis); - let tensor_vals = operands[0]; - let idx = operands[1]; - let result = tensor_vals.max(operands[2]); - let sf = new Series(result.arraySync(), { index: idx }); - return sf; - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return standard deviation of DataFrame across specified axis. - * @param {axis} Number {0: row, 1 : column} Axis for the function to be applied on - * @returns {Series} - */ - std(axis = 1) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let tensor_vals = this.col_data_tensor.arraySync(); - let idx; - if (axis == 1) { - idx = this.column_names; - } else { - idx = this.index; - } - let median = std(tensor_vals, axis); - let sf = new Series(median, { index: idx }); - return sf; - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return variance of DataFrame across specified axis. - * @param {axis} Number {0: row, 1 : column} Axis for the function to be applied on - * @returns {Series} - */ - var(axis = 1) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let tensor_vals = this.col_data_tensor.arraySync(); - let idx; - if (axis == 1) { - idx = this.column_names; - } else { - idx = this.index; - } - let median = variance(tensor_vals, axis); - let sf = new Series(median, { index: idx }); - return sf; - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Return number of non-null elements in a Series - * @returns {Series}, Count of non-null values - */ - count(axis = 1) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let tensor_vals, idx; - if (axis == 1) { - tensor_vals = this.col_data_tensor.arraySync(); - idx = this.column_names; - } else { - tensor_vals = this.row_data_tensor.arraySync(); - idx = this.index; - } - let counts = utils.__count_nan(tensor_vals, true, false); - let sf = new Series(counts, { index: idx }); - return sf; - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Rounds values in DataFrame to specified number of dp - * @returns {DataFrame}, New DataFrame with rounded values - */ - round(dp = 1) { - if (this.__frame_is_compactible_for_operation) { - //check if all types are numeric - let values = this.values; - let idx = this.index; - - let new_vals = utils.__round(values, dp, false); - let options = { columns: this.column_names, index: idx }; - let df = new DataFrame(new_vals, options); - return df; - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - - /** - * Perform Cummulative operations - * @param {axis} axis [int] {0 or 1} - * @param {ops} ops {String} name of operation - * @return {DataFrame} - */ - __cum_ops(axis = 0, ops) { - if (!(axis == 0) && !(axis == 1)) { - throw new Error("axis must be between 0 or 1"); - } - - if (this.__frame_is_compactible_for_operation) { - let data = []; - let df_data = null; - - if (axis == 0) { - df_data = this.col_data; - } else { - df_data = this.values; - } - - for (let i = 0; i < df_data.length; i++) { - let value = df_data[i]; - let temp_val = value[0]; - let temp_data = [ temp_val ]; - for (let j = 1; j < value.length; j++) { - let curr_val = value[j]; - switch (ops) { - case "max": - if (curr_val > temp_val) { - temp_val = curr_val; - temp_data.push(curr_val); - } else { - temp_data.push(temp_val); - } - break; - case "min": - if (curr_val < temp_val) { - temp_val = curr_val; - temp_data.push(curr_val); - } else { - temp_data.push(temp_val); - } - break; - case "sum": - temp_val = temp_val + curr_val; - temp_data.push(temp_val); - - break; - case "prod": - temp_val = temp_val * curr_val; - temp_data.push(temp_val); - - break; - } - } - data.push(temp_data); - } - - if (axis == 0) { - data = utils.__get_col_values(data); - } - - return new DataFrame(data, { columns: this.columns }); - } else { - throw Error("TypeError: Dtypes of columns must be Float of Int"); - } - } - /** - * calculate the cummulative sum along axis - * @param {kwargs} {axis: [int]} - * @returns {DataFrame} - */ - cumsum(kwargs = {}) { - let axis; - if (!utils.__key_in_object(kwargs, "axis")) { - axis = 0; - } else { - axis = kwargs["axis"]; - } - // let axis = kwargs["axis"] || 0 - let data = this.__cum_ops(axis, "sum"); - return data; - } - - /** - * calculate the cummulative min - * @param {kwargs} {axis: [int]} - * @returns {DataFrame} - */ - cummin(kwargs = {}) { - let axis; - if (!utils.__key_in_object(kwargs, "axis")) { - axis = 0; - } else { - axis = kwargs["axis"]; - } - let data = this.__cum_ops(axis, "min"); - return data; - } - - /** - * calculate the cummulative max - * @param {kwargs} {axis: [int]} - * @returns {DataFrame} - */ - cummax(kwargs = {}) { - let axis; - if (!utils.__key_in_object(kwargs, "axis")) { - axis = 0; - } else { - axis = kwargs["axis"]; - } - let data = this.__cum_ops(axis, "max"); - return data; - } - - /** - * calculate the cummulative prod - * @param {kwargs} {axis: [int]} - * @returns {DataFrame} - */ - cumprod(kwargs = {}) { - let axis; - if (!utils.__key_in_object(kwargs, "axis")) { - axis = 0; - } else { - axis = kwargs["axis"]; - } - let data = this.__cum_ops(axis, "prod"); - return data; - } - - /** - * Makes a new copy of a DataFrame - * @returns {DataFrame} - */ - copy() { - let df = new DataFrame([ ...this.values ], { - columns: [ ...this.column_names ], - index: this.index, - dtypes: this.dtypes - }); - return df; - } - - /** - * Generate a new index for the DataFrame. - * This is useful when the index is meaningless and needs to be reset to the default before another operation. - * @param {inplace} boolean: Modify the original object or return a new one. Default to false - */ - reset_index(inplace = false) { - if (inplace) { - this.__reset_index(); - } else { - let df = this.copy(); - df.__reset_index(); - return df; - } - } - - /** - * Set the DataFrame index (row labels) using an array of the same length. - * @param {kwargs} {index: Array of new index values} - */ - set_index(kwargs = {}) { - let params_needed = [ "key", "drop", "inplace" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - if (!utils.__key_in_object(kwargs, "key")) { - throw Error("Index ValueError: You must specify an array of index"); - } - - if (!utils.__key_in_object(kwargs, "inplace")) { - kwargs["inplace"] = false; - } - - if (!utils.__key_in_object(kwargs, "drop")) { - kwargs["drop"] = true; - } - - if ( - Array.isArray(kwargs["key"]) && - kwargs["key"].length != this.index.length - ) { - throw Error( - `Index LengthError: Lenght of new Index array ${kwargs["key"].length} must match lenght of existing index ${this.index.length}` - ); - } - - if ( - typeof kwargs["key"] == "string" && - this.column_names.includes(kwargs["key"]) - ) { - kwargs["key_name"] = kwargs["key"]; - kwargs["key"] = this[kwargs["key"]].values; - } - if (kwargs["inplace"]) { - // this.index_arr = kwargs['key'] - this.__set_index(kwargs["key"]); - if (kwargs["drop"] && typeof kwargs["key_name"] == "string") { - this.drop({ columns: [ kwargs["key_name"] ], inplace: true, axis: 1 }); - } - } else { - let df = this.copy(); - df.__set_index(kwargs["key"]); - if (kwargs["drop"] && typeof kwargs["key_name"] == "string") { - df.drop({ columns: [ kwargs["key_name"] ], axis: 1, inplace: true }); - } - return df; - } - } - - /** - * Generate descriptive statistics for all numeric columns - * Descriptive statistics include those that summarize the central tendency, - * dispersion and shape of a dataset’s distribution, excluding NaN values. - * @returns {Series} - */ - describe() { - let numeric_df = this.select_dtypes([ "float32", "int32" ]); - let col_names = numeric_df.column_names; - let index = [ "count", "mean", "std", "min", "median", "max", "variance" ]; - - let stats_arr = {}; - col_names.forEach((name) => { - let col_series = numeric_df[name]; - let count = col_series.count(); - let mean = col_series.mean(); - let std = col_series.std(); - let min = col_series.min(); - let median = col_series.median(); - let max = col_series.max(); - let variance = col_series.var(); - - let _stats = [ count, mean, std, min, median, max, variance ]; - stats_arr[name] = _stats; - }); - let df = new DataFrame(stats_arr, { index: index }); - return df.round(6); - } - - /** - * Return a subset of the DataFrame’s columns based on the column dtypes. - * @param {include} scalar or array-like. A selection of dtypes or strings to be included. At least one of these parameters must be supplied. - * @returns {DataFrame, Series} The subset of the frame including the dtypes. - */ - select_dtypes(include) { - let dtypes = this.dtypes; - let col_names = this.column_names; - let col_vals = {}; - let original_col_vals = this.col_data; - const __supported_dtypes = [ "float32", "int32", "string", "boolean" ]; - - if (include == undefined) { - //return all - let df = this.copy(); - return df; - } else { - //check if the right types are included - include.forEach((type) => { - if (!__supported_dtypes.includes(type)) { - throw Error(`Dtype Error: dtype ${type} not supported.`); - } - }); - - dtypes.forEach((dtype, i) => { - if (include.includes(dtype)) { - col_vals[col_names[i]] = original_col_vals[i]; - } - }); - let df = new DataFrame(col_vals); - return df; - } - } - - /** - * Sort a Dataframe in ascending or descending order by a specified column name. - * @param {kwargs} Object, {by: Column name to sort by - * ascending (Bool): Whether to return sorted values in ascending order or not, - * inplace (Bool): Whether to perform sorting on the original Series or not} - * @returns {Series} - */ - // sort_values(kwargs = {}) { - // if (utils.__key_in_object(kwargs, "by")) { - // let sort_col = this.column(kwargs["by"]) - // let sorted_col, sorted_index; - // let new_row_data = [] - - // if (utils.__key_in_object(kwargs, "inplace") && kwargs['inplace'] == true) { - // sort_col.sort_values(kwargs) - // sorted_index = sort_col.index - - // } else { - // sorted_col = sort_col.sort_values(kwargs) - // sorted_index = sorted_col.index - // } - - // sorted_index.map(idx => { - // new_row_data.push(this.values[idx]) - // }) - - // if (utils.__key_in_object(kwargs, "inplace") && kwargs['inplace'] == true) { - // this.data = new_row_data - // this.index_arr = sorted_index - // return null - // } else { - // let df = new DataFrame(new_row_data, { columns: this.column_names, index: sorted_index, dtype: this.dtypes }) - // return df - // } - - // } else { - // throw Error("Value Error: must specify the column to sort by") - // } - - // sorted_index.map(idx => { - // new_row_data.push(this.values[idx]) - // }) - - // if (utils.__key_in_object(kwargs, "inplace") && kwargs['inplace'] == true) { - // this.__update_frame_in_place(new_row_data, null, null, sorted_index, null) - - // } else { - // let df = new DataFrame(new_row_data, { columns: this.column_names, index: sorted_index, dtype: this.dtypes }) - // return df - // } - - // } else { - // throw Error("Value Error: must specify the column to sort by") - // } - - // } - - /** - * Return the sum of the values in a DataFrame across a specified axis. - * @params {kwargs} {axis: 0 for row and 1 for column} - * @returns {Series}, Sum of values accross axis - */ - sum(kwargs = { axis: 1 }) { - if (this.__frame_is_compactible_for_operation()) { - let values; - let val_sums = []; - if (kwargs["axis"] == 1) { - values = this.col_data; - } else { - values = this.values; - } - - values.map((arr) => { - let temp_sum = tf.tensor(arr).sum().arraySync(); - val_sums.push(Number(temp_sum.toFixed(5))); - }); - - let new_index; - if (kwargs["axis"] == 1) { - new_index = this.column_names; - } else { - new_index = this.index; - } - let sf = new Series(val_sums, { columns: "sum", index: new_index }); - return sf; - } else { - throw Error("Dtype Error: Operation can not be performed on string type"); - } - } - - /** - * Returns the absolute values in DataFrame - * @return {DataFrame} - */ - abs() { - let data = this.values; - - let tensor_data = tf.tensor(data); - let abs_data = tensor_data.abs().arraySync(); - let df = new DataFrame(utils.__round(abs_data, 2, false), { - columns: this.column_names, - index: this.index - }); - return df; - } - - __get_tensor_and_idx(df, axis) { - let tensor_vals, idx, t_axis; - if (axis == 1) { - //Tensorflow uses 0 for column and 1 for rows, - // we use the opposite for consistency with Pandas (0 : row, 1: columns) - tensor_vals = df.row_data_tensor; - idx = df.column_names; - t_axis = 0; //switch the axis - } else { - tensor_vals = df.row_data_tensor; - idx = df.index; - t_axis = 1; - } - - return [ tensor_vals, idx, t_axis ]; - } - - /** - * Filter DataFrame element base on the element in a column - * @param {kwargs} kwargs {column : coumn name[string], is: String, to: string| int} - * @returns {DataFrame} - */ - query(kwargs) { - //define the set of operators to be used - let operators = [ ">", "<", "<=", ">=", "==", "!=" ]; - - if (!utils.__key_in_object(kwargs, "inplace")) { - kwargs["inplace"] = false; - } - - let column_index, operator, value; - - if (utils.__key_in_object(kwargs, "column")) { - if (this.columns.includes(kwargs["column"])) { - column_index = this.columns.indexOf(kwargs["column"]); - } else { - throw new Error(`column ${kwargs["column"]} does not exist`); - } - } else { - throw new Error("specify the column"); - } - - if (utils.__key_in_object(kwargs, "is")) { - if (operators.includes(kwargs["is"])) { - operator = kwargs["is"]; - } else { - throw new Error(` ${kwargs["is"]} is not a supported logical operator`); - } - } else { - throw new Error("specify an operator in param [is]"); - } - - if (utils.__key_in_object(kwargs, "to")) { - value = kwargs["to"]; - } else { - throw new Error("specify a value in param [to]"); - } - - let data = this.values; - let index = this.index; - let new_data = []; - let new_index = []; - - for (var i = 0; i < data.length; i++) { - let data_value = data[i]; - let elem = data_value[column_index]; - //use eval function for easy operation - //eval() takes in a string expression e.g eval('2>5') - if (eval(`elem${operator}value`)) { - new_data.push(data_value); - new_index.push(index[i]); - } - } - - if (new_data.length == 0) { - throw new Error( - `query returned empty data; is either ${value} does not exist in column ${kwargs["column"]}` - ); - } - if (kwargs["inplace"]) { - this.__update_frame_in_place( - new_data, - this.columns, - null, - new_index, - null - ); - } else { - let new_df = new DataFrame(new_data, { - columns: this.columns, - index: new_index - }); - return new_df; - } - } - - /** - * Add a column with values to the dataframe - * @param {kwargs} Object {column :[string] , value:[Array]} - * - */ - addColumn(kwargs) { - utils.__in_object(kwargs, "column", "column name not specified"); - utils.__in_object(kwargs, "value", "column value not specified"); - - let column_name = kwargs["column"]; - let data_length = this.shape[0]; - let value; - - if (kwargs["value"] instanceof Series) { - value = kwargs["value"].values; - } else { - value = kwargs["value"]; - } - - if (value.length != data_length) { - throw new Error( - `Array length ${value.length} not equal to ${data_length}` - ); - } - - if (this.columns.includes(column_name)) { - let col_idx = this.columns.indexOf(column_name); - let new_data = []; - - this.values.map((val, index) => { - let new_val = val.slice(); - new_val[col_idx] = value[index]; - new_data.push(new_val); - }); - this.__update_frame_in_place(new_data, null, null, null, null); - } else { - let data = this.values; - let new_data = []; - - data.map(function (val, index) { - let new_val = val.slice(); - new_val.push(value[index]); - new_data.push(new_val); - }); - - //add new dtype - let new_dtypes = [ ...this.dtypes ]; - new_dtypes.push(utils.__get_t(value)[0]); - - let new_col_names = [ ...this.columns ]; - new_col_names.push(column_name); - - this.__update_frame_in_place( - new_data, - new_col_names, - null, - null, - new_dtypes - ); - Object.defineProperty(this, column_name, { - get() { - return new Series(value, { columns: column_name, index: this.index }); - }, - set(value) { - this.addColumn({ column: column_name, value: value }); - } - }); - } - } - - /** - * - * @param {col} col is a list of column with maximum length of two - */ - groupby(col) { - let len = this.shape[0]; - let column_names = this.column_names; - let col_dict = {}; - let key_column = null; - - if (col.length == 2) { - if (column_names.includes(col[0])) { - // eslint-disable-next-line no-unused-vars - var [ data1, col_name1 ] = indexLoc(this, { - rows: [ `0:${len}` ], - columns: [ `${col[0]}` ], - type: "loc" - }); - } else { - throw new Error(`column ${col[0]} does not exist`); - } - if (column_names.includes(col[1])) { - // eslint-disable-next-line no-unused-vars - var [ data2, col_name2 ] = indexLoc(this, { - rows: [ `0:${len}` ], - columns: [ `${col[1]}` ], - type: "loc" - }); - } else { - throw new Error(`column ${col[1]} does not exist`); - } - - key_column = [ col[0], col[1] ]; - var column_1_Unique = utils.__unique(data1); - var column_2_unique = utils.__unique(data2); - - for (var i = 0; i < column_1_Unique.length; i++) { - let col_value = column_1_Unique[i]; - col_dict[col_value] = {}; - - for (var j = 0; j < column_2_unique.length; j++) { - let col2_value = column_2_unique[j]; - col_dict[col_value][col2_value] = []; - } - } - } else { - if (column_names.includes(col[0])) { - // eslint-disable-next-line no-redeclare - var [ data1, col_name1 ] = indexLoc(this, { - rows: [ `0:${len}` ], - columns: [ `${col[0]}` ], - type: "loc" - }); - // console.log(data1) - } else { - throw new Error(`column ${col[0]} does not exist`); - } - key_column = [ col[0] ]; - - var column_Unique = utils.__unique(data1); - - for (let i = 0; i < column_Unique.length; i++) { - let col_value = column_Unique[i]; - col_dict[col_value] = []; - } - } - - let groups = new GroupBy( - col_dict, - key_column, - this.values, - column_names - ).group(); - - return groups; - } - - /** - * Return a sequence of axis dimension along row and columns - * @params col_name: the name of a column in the database. - * @returns tensor of shape 1 - */ - column(col_name) { - if (!this.columns.includes(col_name)) { - throw new Error(`column ${col_name} does not exist`); - } - let col_indx_objs = utils.__arr_to_obj(this.columns); - let indx = col_indx_objs[col_name]; - let data = this.col_data[indx]; - return new Series(data, { columns: [ col_name ] }); - } - - /** - * Replace NaN or undefined with a specified value" - * @param {kwargs}, {column(s): Array of column name(s) to fill. If undefined fill all columns; - * value(s): Array | Scalar of value(s) to fill with. If single value is specified, we use it to fill all - * @return {DataFrame} - */ - fillna(kwargs = {}) { - let params_needed = [ "columns", "values", "inplace" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - if (!utils.__key_in_object(kwargs, "inplace")) { - kwargs["inplace"] = false; - } - - if (utils.__key_in_object(kwargs, "columns")) { - //check if the column(s) exists - kwargs["columns"].map((col) => { - if (!this.column_names.includes(col)) { - throw Error( - `Value Error: Specified columns must be one of ${this.column_names}, got ${col}` - ); - } - }); - - if (kwargs["columns"].length != kwargs["values"].length) { - throw Error(`Lenght Error: The lenght of the columns names must be equal to the lenght of the values, - got column of length ${kwargs["columns"].length} but values of length ${kwargs["values"].length}`); - } - let new_col_data = this.col_data; - kwargs["columns"].map((col, i) => { - let col_idx = this.column_names.indexOf(col); - let col_data = this.col_data[col_idx]; - - let __temp = []; - col_data.map((val) => { - //fill the column - if (isNaN(val) && typeof val != "string") { - __temp.push(kwargs["values"][i]); - } else { - __temp.push(val); - } - }); - new_col_data[col_idx] = __temp; - }); - - let final_data = {}; - new_col_data.map((col, i) => { - final_data[this.column_names[i]] = col; - }); - - if (kwargs["inplace"]) { - this.__update_frame_in_place(null, null, final_data, null, null); - } else { - return new DataFrame(final_data, { index: this.index }); - } - } else { - //fill all columns using same value - if (!utils.__key_in_object(kwargs, "values")) { - throw Error("Value Error: Please specify a fill value"); - } - - let nan_val; - if (Array.isArray(kwargs["values"])) { - nan_val = kwargs["values"][0]; - } else { - nan_val = kwargs["values"]; - } - let data = []; - let values = this.values; - let columns = this.columns; - - for (let i = 0; i < values.length; i++) { - let temp_data = []; - let row_value = values[i]; - for (let j = 0; j < row_value.length; j++) { - if (isNaN(row_value[j]) && typeof row_value[j] != "string") { - temp_data.push(nan_val); - } else { - temp_data.push(row_value[j]); - } - } - data.push(temp_data); - } - if (kwargs["inplace"]) { - this.__update_frame_in_place(data, null, null, null, null); - } else { - return new DataFrame(data, { columns: columns, index: this.index }); - } - } - } - - /** - * Return a boolean same-sized object indicating if the values are NaN. NaN and undefined values, - * gets mapped to True values. Everything else gets mapped to False values. - * @return {DataFrame} - */ - isna() { - let new_row_data = this.__isna(); - let columns = this.column_names; - return new DataFrame(new_row_data, { columns: columns, index: this.index }); - } - - /** - * Obtain index containing nan values - * @return Array list (int) - */ - nanIndex() { - let df_values = this.values; - let index_data = []; - - for (let i = 0; i < df_values.length; i++) { - let row_values = df_values[i]; - - if (row_values.includes(NaN)) { - index_data.push(i); - } - } - return index_data; - } - - /** - * Drop all rows containing NaN - * @param {kwargs} kwargs [Object] {axis: [int]{o or 1}, inplace:[boolean]} - */ - dropna(kwargs = {}) { - let axis = kwargs["axis"] || 0; - let inplace = kwargs["inplace"] || false; - - if (axis != 0 && axis != 1) { - throw new Error("axis must either be 1 or 0"); - } - - let df_values = null; - let columns = null; - if (axis == 0) { - df_values = this.values; - columns = this.columns; - } else { - df_values = this.col_data; - columns = []; - } - let data = []; - - for (let i = 0; i < df_values.length; i++) { - let values = df_values[i]; - - if (!values.includes(NaN)) { - if (axis == 0) { - data.push(values); - } else { - columns.push(this.columns[i]); - if (data.length == 0) { - for (let j = 0; j < values.length; j++) { - data.push([ values[j] ]); - } - } else { - for (let j = 0; j < data.length; j++) { - data[j].push(values[j]); - } - } - } - } - } - - if (inplace == true) { - this.data = data; - this.__reset_index(); - this.columns = columns; - } else { - return new DataFrame(data, { columns: columns }); - } - } - - /** - * Apply a function to each element or along a specified axis of the DataFrame. Supports JavaScipt functions - * when axis is not specified, and accepts Tensorflow functions when axis is specified. - * @param {kwargs} kargs is defined as {axis: undefined, 0 or 1, callable: [FUNCTION]} - * @return Array - */ - apply(kwargs) { - let is_callable = utils.__is_function(kwargs["callable"]); - if (!is_callable) { - throw new Error("the argument must be a function"); - } - - let callable = kwargs["callable"]; - let data = []; - - if (utils.__key_in_object(kwargs, "axis")) { - //This accepts all tensorflow operations - let axis = kwargs["axis"]; - let df_data; - if (axis == 0) { - df_data = this.values; - } else { - df_data = this.col_data; - } - - for (let i = 0; i < df_data.length; i++) { - let value = tf.tensor(df_data[i]); - let callable_data; - try { - callable_data = callable(value).arraySync(); - } catch (error) { - throw Error( - `Callable Error: You can only apply JavaScript functions on DataFrames when axis is not specified. This operation is applied on all element, and returns a DataFrame of the same shape.` - ); - } - - data.push(callable_data); - } - } else { - //perform element wise operation. This accepts any JavaScript function - let df_data = this.values; - let new_data = []; - df_data.forEach((row) => { - let new_row = []; - row.forEach((val) => { - new_row.push(callable(val)); - }); - new_data.push(new_row); - }); - data = new_data; - } - - if (utils.__is_1D_array(data)) { - if (kwargs["axis"] == 0) { - let sf = new Series(data, { index: this.index }); - return sf; - } else { - let sf = new Series(data, { index: this.column_names }); - return sf; - } - } else { - let df = new DataFrame(data, { - columns: this.column_names, - index: this.index - }); - return df; - } - } - - /** - * Returns Less than of DataFrame and other. Supports element wise operations - * @param {other} DataFrame, Series, Scalar - * @param {axis} Number {0 for row, 1 for index} Whether to compare by the index or columns - * @return {DataFrame} - */ - lt(other, axis) { - if (this.__frame_is_compactible_for_operation()) { - if (axis == undefined) { - axis = 0; - } - let df = this.__logical_ops(other, "lt", axis); - return df; - } else { - throw Error("Dtype Error: Operation can not be performed on string type"); - } - } - - /** - * Returns Greater than of DataFrame and other. Supports element wise operations - * @param {other} DataFrame, Series, Scalar - * @param {axis} Number {0 for row, 1 for index} Whether to compare by the index or columns - * @return {DataFrame} - */ - gt(other, axis) { - if (this.__frame_is_compactible_for_operation()) { - if (axis == undefined) { - axis = 0; - } - - let df = this.__logical_ops(other, "gt", axis); - return df; - } else { - throw Error("Dtype Error: Operation can not be performed on string type"); - } - } - - /** - * Returns Less than or Equal to of DataFrame and other. Supports element wise operations - * @param {other} DataFrame, Series, Scalar - * @param {axis} Number {0 for row, 1 for index} Whether to compare by the index or columns - * @return {DataFrame} - */ - le(other, axis) { - if (this.__frame_is_compactible_for_operation()) { - if (axis == undefined) { - axis = 0; - } - let df = this.__logical_ops(other, "le", axis); - return df; - } else { - throw Error("Dtype Error: Operation can not be performed on string type"); - } - } - - /** - * Returns Greater than or Equal to of DataFrame and other. Supports element wise operations - * @param {other} DataFrame, Series, Scalar - * @param {axis} Number {0 for row, 1 for index} Whether to compare by the index or columns - * @return {DataFrame} - */ - ge(other, axis) { - if (this.__frame_is_compactible_for_operation()) { - if (axis == undefined) { - axis = 0; - } - let df = this.__logical_ops(other, "ge", axis); - return df; - } else { - throw Error("Dtype Error: Operation can not be performed on string type"); - } - } - - /** - * Returns Not Equal to of DataFrame and other. Supports element wise operations - * @param {other} DataFrame, Series, Scalar - * @param {axis} Number {0 for row, 1 for index} Whether to compare by the index or columns - * @return {DataFrame} - */ - ne(other, axis) { - if (this.__frame_is_compactible_for_operation()) { - if (axis == undefined) { - axis = 0; - } - let df = this.__logical_ops(other, "ne", axis); - return df; - } else { - throw Error("Dtype Error: Operation can not be performed on string type"); - } - } - - /** - * Returns Greater than or Equal to of DataFrame and other. Supports element wise operations - * @param {other} DataFrame, Series, Scalar - * @param {axis} Number {0 for row, 1 for index} Whether to compare by the index or columns - * @return {DataFrame} - */ - eq(other, axis) { - if (this.__frame_is_compactible_for_operation()) { - if (axis == undefined) { - axis = 0; - } - let df = this.__logical_ops(other, "eq", axis); - return df; - } else { - throw Error("Dtype Error: Operation can not be performed on string type"); - } - } - - /** - * Replace all occurence of a value with a new specified value" - * @param {kwargs}, {"replace": the value you want to replace, - * "with": the new value you want to replace the olde value with - * "in": Array of column names to replace value in, If not specified, replace all columns} - * @return {Series} - */ - replace(kwargs = {}) { - let params_needed = [ "replace", "with", "in" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - if (utils.__key_in_object(kwargs, "in")) { - //fill specified columns only - //check if the column(s) exists - kwargs["in"].map((col) => { - if (!this.column_names.includes(col)) { - throw Error( - `Value Error: Specified columns must be one of ${this.column_names}, got ${col}` - ); - } - }); - - if ( - utils.__key_in_object(kwargs, "replace") && - utils.__key_in_object(kwargs, "with") - ) { - let new_col_data_obj = {}; - this.column_names.map((col, idx) => { - if (kwargs["in"].includes(col)) { - let temp_col_data = this.col_data[idx]; //retreive the column data - let __temp = []; - temp_col_data.map((val) => { - //replace the values - if (val == kwargs["replace"]) { - __temp.push(kwargs["with"]); - } else { - __temp.push(val); - } - }); - new_col_data_obj[col] = __temp; - } else { - new_col_data_obj[col] = this.col_data[idx]; - } - }); - return new DataFrame(new_col_data_obj, { - columns: this.column_names, - index: this.index - }); - } else { - throw Error( - "Params Error: Must specify both 'replace' and 'with' parameters." - ); - } - } else { - //fill every occurence in all columns and rows - if ( - utils.__key_in_object(kwargs, "replace") && - utils.__key_in_object(kwargs, "with") - ) { - let replaced_arr = []; - let old_arr = this.values; - - old_arr.map((inner_arr) => { - let temp = []; - inner_arr.map((val) => { - if (val == kwargs["replace"]) { - temp.push(kwargs["with"]); - } else { - temp.push(val); - } - }); - replaced_arr.push(temp); - }); - - let df = new DataFrame(replaced_arr, { - index: this.index, - columns: this.column_names - }); - return df; - } else { - throw Error( - "Params Error: Must specify both 'replace' and 'with' parameters." - ); - } - } - } - - //performs logical comparisons on DataFrame using Tensorflow.js - __logical_ops(val, logical_type, axis) { - let int_vals, other; - if (utils.__is_number(val)) { - other = val; - } else { - if (val.series) { - //series - if (axis == 0) { - if (val.values.length != this.shape[0]) { - throw Error( - `Shape Error: Operands could not be broadcast together with shapes ${this.shape} and ${val.values.length}.` - ); - } - other = tf.tensor(val.values); - } else { - if (val.values.length != this.shape[1]) { - throw Error( - `Shape Error: Operands could not be broadcast together with shapes ${this.shape} and ${val.values.length}.` - ); - } - other = tf.tensor(val.values); - } - } else if (Array.isArray(val)) { - //Array of Array - other = tf.tensor(val); - } else { - //DataFrame - other = val.row_data_tensor; - } - } - - switch (logical_type) { - case "lt": - int_vals = tf.tensor(this.values).less(other).arraySync(); - break; - case "gt": - int_vals = tf.tensor(this.values).greater(other).arraySync(); - break; - case "le": - int_vals = tf.tensor(this.values).lessEqual(other).arraySync(); - break; - case "ge": - int_vals = tf.tensor(this.values).greaterEqual(other).arraySync(); - break; - case "ne": - int_vals = tf.tensor(this.values).notEqual(other).arraySync(); - break; - case "eq": - int_vals = tf.tensor(this.values).equal(other).arraySync(); - break; - } - let bool_vals = utils.__map_int_to_bool(int_vals, 2); - let df = new DataFrame(bool_vals, { - columns: this.column_names, - index: this.index - }); - return df; - } - - //slice the corresponding arrays from tensor objects - __get_df_from_tensor(val, col_names) { - let len = val.shape[0]; - let new_array = []; - for (let i = 0; i < len; i++) { - let arr = val.slice([ i ], [ 1 ]).arraySync()[0]; - new_array.push(arr); - } - return new DataFrame(new_array, { columns: col_names }); - } - - //checks if DataFrame is compaticble for arithmetic operation - //compatible Dataframe must have only numerical dtypes - __frame_is_compactible_for_operation() { - let dtypes = this.dtypes; - const str = (element) => element == "string"; - - if (dtypes.some(str)) { - return false; - } else { - return true; - } - } - - //retreives the corresponding tensors based on specified axis - __get_ops_tensors(tensors, axis) { - if (utils.__is_undefined(tensors[1].series)) { - //check if add operation is on a series or DataFrame - let tensors_arr = []; - if (utils.__is_undefined(axis) || axis == 1) { - //axis = 1 (column) - tensors_arr.push(tensors[0].row_data_tensor); - tensors_arr.push(tensors[1]); - return tensors_arr; - } else { - //axis = 0 (rows) - tensors_arr.push(tensors[0].col_data_tensor); - tensors_arr.push(tensors[1]); - return tensors_arr; - } - } else { - //operation is being performed on a Dataframe or Series - let tensors_arr = []; - if (utils.__is_undefined(axis) || axis == 1) { - //axis = 1 (column) - let this_tensor, other_tensor; - - this_tensor = tensors[0].row_data_tensor; //tensorflow uses 1 for rows axis and 0 for column axis - if (tensors[1].series) { - other_tensor = tf.tensor(tensors[1].values, [ - 1, - tensors[1].values.length - ]); - } else { - other_tensor = tensors[1].row_data_tensor; - } - - tensors_arr.push(this_tensor); - tensors_arr.push(other_tensor); - return tensors_arr; - } else { - //axis = 0 (rows) - let this_tensor, other_tensor; - - this_tensor = tensors[0].row_data_tensor; - if (tensors[1].series) { - other_tensor = tf.tensor(tensors[1].values, [ - tensors[1].values.length, - 1 - ]); - } else { - other_tensor = tensors[1].row_data_tensor; - } - - tensors_arr.push(this_tensor); - tensors_arr.push(other_tensor); - return tensors_arr; - } - } - } - - /** - * Transpose index and columns. - * Reflect the DataFrame over its main diagonal by writing rows as columns and vice-versa. - * The property T is an accessor to the method transpose(). - */ - transpose() { - let new_values = this.col_data; - let new_index = this.column_names; - let new_col_names = this.index; - - let df = new DataFrame(new_values, { - columns: new_col_names, - index: new_index - }); - return df; - } - - /** - * The property T is an accessor to the method transpose(). - */ - get T() { - return this.transpose(); - } - - /** - * Returns the data types in the DataFrame - * @return {Array} list of data types for each column - */ - get ctypes() { - let cols = this.column_names; - let d_types = this.col_types; - let sf = new Series(d_types, { index: cols }); - return sf; - } - - /** - * Make plots of Series or DataFrame. - * Uses the Plotly as backend, so supports Plotly's configuration parameters - * @param {string} div Name of the div to show the plot - * @returns {Class} Plot class that expoese different plot type - */ - plot(div) { - const plt = new Plot(this, div); - return plt; - } - - /** - * Returns the Tensorflow tensor backing the DataFrame Object - * @returns {2D tensor} - */ - get tensor() { - return this.row_data_tensor; - } - - /** - * Sets the data types of an DataFrame - * @param {Object} kwargs {column: Name of the column to cast, dtype: [float32, int32, string] data type to cast to} - * @returns {DataFrame} - */ - astype(kwargs = {}) { - if (!utils.__key_in_object(kwargs, "column")) { - throw Error("Value Error: Please specify a column to cast"); - } - - if (!utils.__key_in_object(kwargs, "dtype")) { - throw Error("Value Error: Please specify dtype to cast to"); - } - - if (!this.column_names.includes(kwargs["column"])) { - throw Error(`'${kwargs["column"]}' not found in columns`); - } - - let col_idx = this.column_names.indexOf(kwargs["column"]); - let new_types = this.col_types; - let col_values = this.col_data; - - new_types[col_idx] = kwargs["dtype"]; - let new_col_values = []; - let temp_col = col_values[col_idx]; - - switch (kwargs["dtype"]) { - case "float32": - temp_col.map((val) => { - new_col_values.push(Number(val)); - }); - col_values[col_idx] = new_col_values; - break; - case "int32": - temp_col.map((val) => { - new_col_values.push(Number(Number(val).toFixed())); - }); - col_values[col_idx] = new_col_values; - - break; - case "string": - temp_col.map((val) => { - new_col_values.push(String(val)); - }); - col_values[col_idx] = new_col_values; - break; - default: - break; - } - - let new_col_obj = {}; - this.column_names.forEach((cname, i) => { - new_col_obj[cname] = col_values[i]; - }); - - let df = new DataFrame(new_col_obj, { - dtypes: new_types, - index: this.index - }); - return df; - } - - /** - * Return the unique values along an axis - * @param {axis} Int, 0 for row, and 1 for column. Default to 1 - * @return {Object} - */ - unique(axis = 1) { - if (axis == undefined || axis > 1 || axis < 0) { - throw Error( - `Axis Error: Please specify a correct axis. Axis must either be '0' or '1', got ${axis}` - ); - } - let _unique = {}; - if (axis == 1) { - //column - let col_names = this.column_names; - col_names.forEach((cname) => { - _unique[cname] = this[cname].unique().values; - }); - } else { - let rows = this.values; - let _index = this.index; - rows.forEach((row, i) => { - let data_set = new Set(row); - _unique[_index[i]] = Array.from(data_set); - }); - } - - return _unique; - } - - /** - * Return the number of unique value along an axis - * @param {axis} Int, 0 for row, and 1 for column. Default to 1 - * @return {Series} - */ - nunique(axis = 1) { - if (axis == undefined || axis > 1 || axis < 0) { - throw Error( - `Axis Error: Please specify a correct axis. Axis must either be '0' or '1', got ${axis}` - ); - } - - let _nunique = []; - if (axis == 1) { - //column - let col_names = this.column_names; - col_names.forEach((cname) => { - _nunique.push(this[cname].unique().values.length); - }); - let sf = new Series(_nunique, { index: this.column_names }); - return sf; - } else { - let rows = this.values; - rows.forEach((row) => { - let data_set = new Set(row); - _nunique.push(Array.from(data_set).length); - }); - } - let sf = new Series(_nunique, { index: this.index }); - return sf; - } - - /** - * Change axes labels. Object values must be unique (1-to-1). - * Labels not contained in a dict / Series will be left as-is. Extra labels listed don’t throw an error. - * @param {Object} kwargs {mapper: Dict-like or functions transformations to apply to that axis’ values, - * axis: Int, 0 for row, and 1 for column. Default to 1, - * inplace: Whether to return a new DataFrame. If True then value of copy is ignored. - * @returns {DataFrame} - */ - rename(kwargs = {}) { - let params_needed = [ "mapper", "inplace", "axis" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - // utils.__in_object(kwargs, "columns", "value not defined") - if (!utils.__key_in_object(kwargs, "inplace")) { - kwargs["inplace"] = false; - } - if (!utils.__key_in_object(kwargs, "axis")) { - kwargs["axis"] = 1; - } - if (!utils.__key_in_object(kwargs, "mapper")) { - throw Error("Please specify a mapper object"); - } - if (kwargs["axis"] == 1) { - //columns - let old_col_names = Object.keys(kwargs["mapper"]); - let new_col_names = Object.values(kwargs["mapper"]); - let col_names = [ ...this.column_names ]; - - old_col_names.forEach((cname, i) => { - if (!col_names.includes(cname)) { - throw Error( - `Label Error: Specified column '${cname}' not found in column axis` - ); - } - let idx = col_names.indexOf(cname); - col_names[idx] = new_col_names[i]; - }); - if (kwargs["inplace"]) { - this.columns = col_names; - this.__set_col_property(this, this.col_data, col_names, old_col_names); - } else { - let df = this.copy(); - df.columns = col_names; - df.__set_col_property(df, df.col_data, col_names, old_col_names); - return df; - } - } else { - //row - let old_index = Object.keys(kwargs["mapper"]); - let row_index = this.index; - let new_index = []; - - row_index.forEach((idx) => { - if (old_index.includes(idx)) { - new_index.push(kwargs["mapper"][idx]); - } else { - new_index.push(idx); - } - }); - - if (kwargs["inplace"]) { - this.__set_index(new_index); - } else { - let df = this.copy(); - df.__set_index(new_index); - return df; - } - } - } - /** - * Sort DataFrame by index - * @param {*} kwargs {inplace: Boolean, ascending: Bool} - * @returns DataFrame - */ - sort_index(kwargs = {}) { - let inplace = - typeof kwargs["inplace"] == "undefined" ? false : kwargs["inplace"]; - let asc = - typeof kwargs["ascending"] == "undefined" ? true : kwargs["ascending"]; - - let index_val = this.index; - let [ data, index ] = this.__sort_by(index_val, index_val, asc); - - if (inplace) { - this.__update_frame_in_place(data, null, null, index, null); - } else { - let df = this.copy(); - df.__update_frame_in_place(data, null, null, index, null); - return df; - } - } - - /** - * Sort a Dataframe in ascending or descending order by a specified column name. - * @param {kwargs} Object, {by: Column name to sort by - * ascending (Bool): Whether to return sorted values in ascending order or not, - * inplace (Bool): Whether to perform sorting on the original Series or not} - * @returns {Series} - */ - sort_values(kwargs = {}) { - if (!utils.__key_in_object(kwargs, "by")) { - throw Error(`use col_name to specify column name`); - } - - let inplace = - typeof kwargs["inplace"] == "undefined" ? false : kwargs["inplace"]; - let asc = - typeof kwargs["ascending"] == "undefined" ? true : kwargs["ascending"]; - let index_val = this.index; - let column_val = this.column(kwargs["by"]).values; - let [ data, index ] = this.__sort_by(column_val, index_val, asc); - - if (inplace) { - this.__update_frame_in_place(data, null, null, index, null); - } else { - let df = this.copy(); - df.__update_frame_in_place(data, null, null, index, null); - return df; - } - } - - //set all columns to DataFrame Property. This ensures easy access to columns as Series - __set_col_property(self, col_vals, col_names, old_col_names) { - //delete old name - old_col_names.forEach((name) => { - delete self[name]; - }); - - col_vals.forEach((col, i) => { - // self[col_names[i]] = new Series(col, { columns: col_names[i], index: self.index }) - Object.defineProperty(self, col_names[i], { - get() { - return new Series(col, { columns: col_names[i], index: self.index }); - }, - set(value) { - this.addColumn({ column: col_names[i], value: value }); - } - }); - }); - } - - //update a DataFrame in place - __update_frame_in_place(row_data, column_names, col_obj, index, dtypes) { - if (row_data != undefined) { - this.data = row_data; - } else { - //check column is available and create row from column - if (col_obj != undefined) { - let _res = utils._get_row_and_col_values(col_obj); - this.data = _res[0]; - this.columns = _res[1]; - column_names = _res[1]; - } - } - - if (col_obj != undefined) { - this.col_data = Object.values(col_obj); - this.columns = Object.keys(col_obj); - column_names = Object.keys(col_obj); - } else { - //check if row data is available and create column data from rows - if (row_data != undefined) { - this.col_data = utils.__get_col_values(row_data); //get column data from row - } - } - - if (column_names != undefined) { - this.columns = column_names; - } - if (index != undefined) { - this.index_arr = index; - } - if (dtypes != undefined) { - this.col_types = dtypes; - } - } - - __sort_by(col_value, df_index, asc) { - let values = this.values; - - let sorted_val = utils.__sort(col_value, asc); - let duplicate_obj = utils.__get_duplicate(col_value); - - let data = []; - let indexs = []; - for (let row_i = 0; row_i < sorted_val.length; row_i++) { - let val = sorted_val[row_i]; - let index = null; - - if (val in duplicate_obj) { - index = duplicate_obj[val]["index"][0]; - duplicate_obj[val]["index"].splice(0, 1); - } else { - index = col_value.indexOf(val); - } - - data.push(values[index]); - indexs.push(df_index[index]); - } - - return [ data, indexs ]; - } - - /** - * Append rows to a DataFrame - * @param {val} val Array | Series to append to the object - * @return DataFrame - */ - append(val) { - let df2 = null; - if (Array.isArray(val)) { - if (Array.isArray(val[0])) { - if (val[0].length != this.shape[1]) { - throw Error( - `length Mixmatch: The lenght of provided value (${val.length}) does not match the original DataFrame (${this.shape[1]})` - ); - } - df2 = new DataFrame(val); - } - } else if (utils.__is_object(val)) { - df2 = new DataFrame(val); - } else if (val instanceof DataFrame) { - df2 = val.copy(); - } - - let concat_df = concat({ df_list: [ this, df2 ], axis: 0 }); - - return concat_df; - } -} diff --git a/src/lib/danfo/core/generic.js b/src/lib/danfo/core/generic.js deleted file mode 100644 index 90bb2ec..0000000 --- a/src/lib/danfo/core/generic.js +++ /dev/null @@ -1,500 +0,0 @@ -/** -* Copyright 2020, JsData. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. - -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. - * -*/ - -import { tensor, Tensor } from "@tensorflow/tfjs"; -import { table } from "table"; -import { Utils } from "./utils"; -import { Configs } from "../config/config"; - - -const utils = new Utils(); -const config = new Configs(); //package wide configuration object -export default class NDframe { - /** - * N-Dimensiona data structure. Stores multi-dimensional - * data in a size-mutable, labeled data structure. Analogous to the Python Pandas DataFrame. - * - * @param {data} Array JSON, Tensor. Block of data. - * @param {kwargs} Object Optional Configuration Object - * {columns: Array of column names. If not specified and data is an array of array, use range index. - * dtypes: Data types of the columns, - * index: row index for subseting array } - * - * @returns NDframe - */ - - constructor(data, kwargs = {}) { - this.kwargs = kwargs; - - if (data instanceof Tensor) { - data = data.arraySync(); - } - - if (utils.__is_1D_array(data)) { - this.series = true; - this._read_array(data); - } else { - this.series = false; - if (utils.__is_object(data[0])) { - //check the type of the first object in the data - this._read_object(data, 1); //type 1 object are of JSON form [{a: 1, b: 2}, {a: 30, b: 20}] - } else if (utils.__is_object(data)) { - this._read_object(data, 2); //type 2 object are of the form {a: [1,2,3,4], b: [30,20, 30, 20}] - } else if ( - Array.isArray(data[0]) || - utils.__is_number(data[0]) || - utils.__is_string(data[0]) - ) { - this._read_array(data); - } else { - throw new Error("File format not supported"); - } - } - } - - /** - * - * @param {Array} data - * Read array of data into NDFrame - */ - _read_array(data) { - this.data = utils.__replace_undefined_with_NaN(data, this.series); - this.row_data_tensor = tensor(this.data); - - if (this.series) { - this.col_data = [ this.values ]; - } else { - this.col_data = utils.__get_col_values(this.data); - } - - this.col_data_tensor = tensor(this.col_data); //data saved as 2D column tensors - - if ("index" in this.kwargs) { - this.__set_index(this.kwargs["index"]); - } else { - this.index_arr = [ ...Array(this.row_data_tensor.shape[0]).keys() ]; - } - - if (this.ndim == 1) { - //series array - if ("columns" in this.kwargs) { - this.columns = this.kwargs["columns"]; - } else { - this.columns = [ "0" ]; - } - } else { - //2D Array - if ("columns" in this.kwargs) { - if ( - this.kwargs["columns"].length == Number(this.row_data_tensor.shape[1]) - ) { - this.columns = this.kwargs["columns"]; - } else { - throw `Column length mismatch. You provided a column of length ${this.kwargs["columns"].length} but data has length of ${this.row_data_tensor.shape[1]}`; - } - } else { - this.columns = [ ...Array(this.row_data_tensor.shape[1]).keys() ]; - } - } - - if ("dtypes" in this.kwargs) { - this._set_col_types(this.kwargs["dtypes"], false); - } else { - this._set_col_types(null, true); //infer dtypes - } - } - - /** - * Convert Javascript Object of arrays into NDFrame - * @param {*} data Object of Arrays - * @param {*} type type 1 object are of JSON form [{a: 1, b: 2}, {a: 30, b: 20}], - * type 2 object are of the form {a: [1,2,3,4], b: [30,20, 30, 20}] - */ - _read_object(data, type) { - if (type == 2) { - let [ row_arr, col_names ] = utils._get_row_and_col_values(data); - this.kwargs["columns"] = col_names; - this._read_array(row_arr); - } else { - let data_arr = data.map((item) => { - return Object.values(item); - }); - - this.data = utils.__replace_undefined_with_NaN(data_arr, this.series); //Defualt array data in row format - this.row_data_tensor = tensor(this.data); //data saved as row tensors - this.kwargs["columns"] = Object.keys(Object.values(data)[0]); //get names of the column from the first entry - - if (this.series) { - this.col_data = [ this.values ]; //data saved as 1D column tensors - } else { - this.col_data = utils.__get_col_values(this.data); - } - - this.col_data_tensor = tensor(this.col_data); //data saved as 2D column tensors - - if ("index" in this.kwargs) { - this.__set_index(this.kwargs["index"]); - } else { - this.index_arr = [ ...Array(this.row_data_tensor.shape[0]).keys() ]; - } - - if (this.ndim == 1) { - //series array - if (!this.kwargs["columns"]) { - this.columns = [ "0" ]; - } else { - this.columns = this.kwargs["columns"]; - } - } else { - //2D Array - if ("columns" in this.kwargs) { - if ( - this.kwargs["columns"].length == - Number(this.row_data_tensor.shape[1]) - ) { - this.columns = this.kwargs["columns"]; - } else { - throw `Column length mismatch. You provided a column of length ${this.kwargs["columns"].length} but data has column length of ${this.row_data_tensor.shape[1]}`; - } - } else { - this.columns = [ ...Array(this.row_data_tensor.shape[1]).keys() ]; - } - } - - if ("dtypes" in this.kwargs) { - this._set_col_types(this.kwargs["dtypes"], false); - } else { - this._set_col_types(null, true); //infer dtypes - } - } - } - - /** - * Sets the data type of the NDFrame. Supported types are ['float32', "int32", 'string', 'boolean'] - * @param {Array} dtypes Array of data types. - * @param {Boolean} infer Whether to automatically infer the dtypes from the Object - */ - _set_col_types(dtypes, infer) { - const __supported_dtypes = [ "float32", "int32", "string", "boolean" ]; - - if (infer) { - if (this.series) { - this.col_types = utils.__get_t(this.values); - } else { - this.col_types = utils.__get_t(this.col_data); - } - } else { - if (this.series) { - this.col_types = dtypes; - } else { - if (dtypes.length != this.columns.length) { - throw new Error( - `length Mixmatch: Length of specified dtypes is ${dtypes.length}, but length of columns is ${this.columns.length}` - ); - } - if (Array.isArray(dtypes)) { - dtypes.forEach((type, indx) => { - if (!__supported_dtypes.includes(type)) { - throw new Error( - `dtype error: dtype specified at index ${indx} is not supported` - ); - } - }); - this.col_types = dtypes; - } else { - throw new Error(`dtypes must be an Array of types`); - } - } - } - } - - /** - * Returns the data types in the DataFrame - * @return {Array} list of data types for each column - */ - get dtypes() { - // let col_data = utils.get_col_values(this.data) - // this.col_types = utils.__get_t(col_data) - // let sf = new Series({dtypes: this.col_types, index: this.column_names}) - return this.col_types; - } - - /** - * Gets dimension of the NDFrame - * @returns {Integer} dimension of NDFrame - */ - get ndim() { - if (this.series) { - return 1; - } else { - return this.row_data_tensor.shape.length; - } - } - - /** - * Gets values for index and columns - * @return {Object} axes configuration for index and columns of NDFrame - */ - get axes() { - let axes = { - index: this.index, - columns: this.columns - }; - return axes; - } - - /** - * Gets index of the NDframe - * @return {Array} array of index from series - */ - get index() { - return this.index_arr; - } - - /** - * Sets index of the NDFrame - */ - __set_index(labels) { - if (!Array.isArray(labels)) { - throw Error("Value Error: index must be an array"); - } - if (labels.length > this.shape[0] || labels.length < this.shape[0]) { - throw Error("Value Error: length of labels must match row shape of data"); - } - this.index_arr = labels; - } - - /** - * Generate a new index for NDFrame. - */ - __reset_index() { - let new_idx = [ ...Array(this.values.length).keys() ]; - this.index_arr = new_idx; - } - - /** - * Gets a sequence of axis dimension along row and columns - * @returns {Array} the shape of the NDFrame - */ - get shape() { - if (this.series) { - return [ this.values.length, 1 ]; - } else { - return this.row_data_tensor.shape; - } - } - - /** - * Gets the values in the NDFrame in JS array - * @returns {Array} Arrays of arrays of data instances - */ - get values() { - return this.data; - } - - /** - * Gets the column names of the data - * @returns {Array} strings of column names - */ - get column_names() { - return this.columns; - } - - /** - * Return a boolean same-sized object indicating if the values are NaN. NaN and undefined values - * gets mapped to True values. Everything else gets mapped to False values. - * @return {Array} - */ - __isna() { - let new_arr = []; - if (this.series) { - this.values.map((val) => { - // eslint-disable-next-line use-isnan - if (val == NaN) { - new_arr.push(true); - } else if (isNaN(val) && typeof val != "string") { - new_arr.push(true); - } else { - new_arr.push(false); - } - }); - } else { - let row_data = this.values; - row_data.map((arr) => { - let temp_arr = []; - arr.map((val) => { - // eslint-disable-next-line use-isnan - if (val == NaN) { - temp_arr.push(true); - } else if (isNaN(val) && typeof val != "string") { - temp_arr.push(true); - } else { - temp_arr.push(false); - } - }); - new_arr.push(temp_arr); - }); - } - return new_arr; - } - - /* - * Gets binary size of the NDFrame - * @returns {String} size of the NDFrame - */ - get size() { - return this.row_data_tensor.size; - } - - /** - * Return object data as comma-separated values (csv). - * @returns {Promise} CSV representation of Object data - */ - async to_csv() { - if (this.series) { - let csv = this.values.join(","); - return csv; - } else { - let records = this.values; - let header = this.column_names.join(","); - - let csv_str = `${header}\n`; - records.forEach((val) => { - let row = `${val.join(",")}\n`; - csv_str += row; - }); - return csv_str; - } - } - - /** - * Return object as JSON string. - * @returns {Promise } JSON representation of Object data - */ - async to_json() { - if (this.series) { - let obj = {}; - obj[this.column_names[0]] = this.values; - let json = JSON.stringify(obj); - return json; - } else { - let values = this.values; - let header = this.column_names; - let json_arr = []; - values.forEach((val) => { - let obj = {}; - header.forEach((h, i) => { - obj[h] = val[i]; - }); - json_arr.push(obj); - }); - return JSON.stringify(json_arr); - } - } - - /** - * Prints the data in a Series as a grid of row and columns - */ - toString() { - let table_width = config.get_width; - let table_truncate = config.get_truncate; - let max_row = config.get_max_row; - let max_col_in_console = config.get_max_col_in_console; - - // let data; - let data_arr = []; - let table_config = {}; - // let idx = this.index - let col_len = this.columns.length; - // let row_len = this.values.length - 1 - let header = []; - - if (col_len > max_col_in_console) { - //truncate displayed columns to fit in the console - let first_4_cols = this.columns.slice(0, 4); - let last_3_cols = this.columns.slice(col_len - 4); - //join columns with truncate ellipse in the middle - header = [ "" ].concat(first_4_cols).concat([ "..." ]).concat(last_3_cols); - - let sub_idx, values_1, value_2; - - if (this.values.length > max_row) { - //slice Object to show [max_rows] - let df_subset_1 = this.iloc({ - rows: [ `0:${max_row}` ], - columns: [ "0:4" ] - }); - let df_subset_2 = this.iloc({ - rows: [ `0:${max_row}` ], - columns: [ `${col_len - 4}:` ] - }); - sub_idx = this.index.slice(0, max_row); - values_1 = df_subset_1.values; - value_2 = df_subset_2.values; - } else { - let df_subset_1 = this.iloc({ rows: [ "0:" ], columns: [ "0:4" ] }); - let df_subset_2 = this.iloc({ - rows: [ "0:" ], - columns: [ `${col_len - 4}:` ] - }); - sub_idx = this.index.slice(0, max_row); - values_1 = df_subset_1.values; - value_2 = df_subset_2.values; - } - - // merge dfs - sub_idx.map((val, i) => { - let row = [ val ].concat(values_1[i]).concat([ "..." ]).concat(value_2[i]); - data_arr.push(row); - }); - } else { - //display all columns - header = [ "" ].concat(this.columns); - let idx, values; - if (this.values.length > max_row) { - //slice Object to show a max of [max_rows] - let data = this.loc({ rows: [ `0:${max_row}` ], columns: this.columns }); - idx = data.index; - values = data.values; - } else { - values = this.values; - idx = this.index; - } - - // merge cols - idx.forEach((val, i) => { - let row = [ val ].concat(values[i]); - data_arr.push(row); - }); - } - - //set column width of all columns - table_config[0] = 10; - for (let index = 1; index < header.length; index++) { - table_config[index] = { width: table_width, truncate: table_truncate }; - } - - let table_data = [ header ].concat(data_arr); //Adds the column names to values before printing - return table(table_data, { columns: table_config }); - } - - /** - * Pretty prints n number of rows in a DataFrame or Series in the console - * @param {rows} Number of rows to print - */ - print() { - console.log(this + ""); - } -} diff --git a/src/lib/danfo/core/get_dummies.js b/src/lib/danfo/core/get_dummies.js deleted file mode 100644 index 32a5391..0000000 --- a/src/lib/danfo/core/get_dummies.js +++ /dev/null @@ -1,139 +0,0 @@ -import { DataFrame } from "./frame"; -import { Utils } from "./utils"; - -const utils = new Utils; - -function oneHot(in_data, prefix, prefix_sep) { - let data_set = new Set(in_data); - let labels = Array.from(data_set); - let prefix_labels = null; - if (prefix) { - prefix_labels = labels.map((x) => { - return prefix + prefix_sep + x; - }); - } else { - prefix_labels = labels.map((x) => { - return x; - }); - } - - let onehot_data = utils.__zeros(in_data.length, labels.length); - - for (let i = 0; i < in_data.length; i++) { - - let elem = in_data[i]; - let elem_index = labels.indexOf(elem); - onehot_data[i][elem_index] = 1; - } - - return [ onehot_data, prefix_labels ]; - -} - -/** - * Generate one hot encoding for categorical variable in arrays |Serie | and Dataframe - * @param {kwargs} kwargs { data : Array | Series | DataFrame, - * prefix_sep: String e.g "_", - * prefix: String | Array of String, - * columns: [Array] columns to be encoded in DataFrame. - * } - */ -function get_dummy(kwargs = {}) { - utils.__in_object(kwargs, "data", "data not provided"); - - let prefix = kwargs["prefix"] || null; - let prefix_sep = kwargs["prefix_sep"] || [ "_" ]; - let columns = kwargs["columns"] || null; - - let is_dataframe = false; - let in_data = null; - - if (Array.isArray(kwargs["data"])) { - in_data = kwargs["data"]; - } else if (kwargs["data"] instanceof DataFrame) { - in_data = kwargs["data"]; - is_dataframe = true; - } else { - in_data = kwargs["data"].values; - } - - if (!is_dataframe) { - let [ onehot_data, prefix_labels ] = oneHot(in_data, prefix, prefix_sep); - - return new DataFrame(onehot_data, { columns: prefix_labels }); - } else { - - let column_index = []; - if (!columns) { - columns = []; - in_data.col_types.map((x, i) => { - - if (x == "string") { - let name_column = in_data.columns[i]; - columns.push(name_column); - column_index.push(i); - } - }); - } else { - - columns.forEach((x) => { - let col_idx = columns.indexOf(x); - column_index.push(col_idx); - }); - } - - if (prefix) { - if (Array.isArray(prefix)) { - if (prefix.length != columns.length) { - throw new Error("prefix must be the same length with the number of onehot encoding column"); - } - } else { - throw new Error("prefix for dataframe must be an array"); - } - } else { - prefix = columns; - } - - let df_data = in_data.values; - let df_columns = in_data.columns; - let col_data = in_data.col_data; - - let column_data = []; - column_index.forEach((x) => { - column_data.push(col_data[x]); - }); - - let one_hotColumns = []; - let one_hotData = []; - column_data.forEach((data, i) => { - - let [ onehot_data, prefix_labels ] = oneHot(data, prefix[i], prefix_sep); - one_hotColumns.push(...prefix_labels); - - if (one_hotData.length == 0) { - one_hotData.push(...onehot_data); - } else { - onehot_data.forEach((x, i) => { - one_hotData[i].push(...x); - }); - } - - }); - - let final_data = df_data.map((elem, i) => { - - let ele = elem.slice(); - let dt = utils.__remove_arr(ele, column_index); - dt.push(...one_hotData[i]); - return dt; - }); - - let final_columns = utils.__remove_arr(df_columns, column_index); - final_columns.push(...one_hotColumns); - - return new DataFrame(final_data, { columns: final_columns }); - } - -} - -export const get_dummies = get_dummy; diff --git a/src/lib/danfo/core/groupby.js b/src/lib/danfo/core/groupby.js deleted file mode 100644 index 91f34d3..0000000 --- a/src/lib/danfo/core/groupby.js +++ /dev/null @@ -1,511 +0,0 @@ -import { DataFrame } from "./frame"; -import { Utils } from "./utils"; -import { Series } from "./series"; -const utils = new Utils; - -/** - * The class performs all groupby operation on a dataframe - * involveing all aggregate funciton - * @param {col_dict} col_dict Object of unique keys in the group by column - * @param {key_col} key_col Array contains the column names - * @param {data} Array the dataframe data - * @param {column_name} Array of all column name in the dataframe. - */ -export class GroupBy { - constructor(col_dict, key_col, data, column_name) { - - this.key_col = key_col; - this.col_dict = col_dict; - this.data = data; - this.column_name = column_name; - this.data_tensors = {}; //store the tensor version of the groupby data - - } - - /** - * Group the dataframe by the column by - * creating an object to store the grouping - * @returns Groupby data structure - */ - group(){ - - if (this.key_col.length == 2){ //check if the dataframe is group by two columns - - - for (var i = 0; i < this.data.length; i++){ - - let col1_index = this.column_name.indexOf(this.key_col[0]); - let col2_index = this.column_name.indexOf(this.key_col[1]); - - let value = this.data[i]; - - let col1_value = value[col1_index]; - let col2_value = value[col2_index]; - - - if (Object.prototype.hasOwnProperty.call(this.col_dict, col1_value)){ - if (Object.prototype.hasOwnProperty.call(this.col_dict[col1_value], col2_value)){ - - this.col_dict[col1_value][col2_value].push(value); - } - - } - - } - - for (var key in this.col_dict){ - this.data_tensors[key] = {}; - - for (var key2 in this.col_dict[key]){ - - let data = this.col_dict[key][key2]; - - if (data.length == 0){ - delete this.col_dict[key][key2]; //delete the empty key. - } else { - this.data_tensors[key][key2] = new DataFrame(data, { columns:this.column_name }); - } - - } - } - } else { - for (let i = 0; i < this.data.length; i++){ - - let col1_index = this.column_name.indexOf(this.key_col[0]); - - let value = this.data[i]; - - let col1_value = value[col1_index]; - - if (Object.prototype.hasOwnProperty.call(this.col_dict, col1_value)){ - - this.col_dict[col1_value].push(value); - - } - } - for (let key in this.col_dict){ - let data = this.col_dict[key]; - - this.data_tensors[key] = new DataFrame(data, { columns:this.column_name }); - - } - - } - - return this; - - } - - /** - * obtain the column for each group - * @param {col_name} col_name [Array]--> array of column names - * @return Groupby data structure - */ - col(col_names){ - this.selected_column = col_names; // store col_names for use later in .apply - if (Array.isArray(col_names)){ - - for (let i = 0; i < col_names.length; i++){ - - let col_name = col_names[i]; - if (!this.column_name.includes(col_name)){ - throw new Error(`Column ${col_name} does not exist in groups`); - } - } - } else { - throw new Error(`Col_name must be an array of column`); - } - - // let group_col_name = col_names; // store the column name - let group_col = {}; - if (this.key_col.length == 2){ - - for (var key1 in this.data_tensors){ - - group_col[key1] = {}; - for (var key2 in this.data_tensors[key1]){ - - group_col[key1][key2] = []; - for (let i = 0; i < col_names.length; i++){ - let col_name = col_names[i]; - let data = this.data_tensors[key1][key2].column(col_name); - group_col[key1][key2].push(data); - } - - } - } - } else { - for (let key1 in this.data_tensors){ - - group_col[key1] = []; - for (let i = 0; i < col_names.length; i++){ - let col_name = col_names[i]; - let data = this.data_tensors[key1].column(col_name); - group_col[key1].push(data); - } - - } - } - const gp = new GroupBy( - null, - this.key_col, - null, - col_names - ); - - gp.group_col = group_col; - gp.group_col_name = col_names; - // return gp; - return gp; - } - - - /** - * Basic root of all column arithemetic in groups - * @param {operation} operatioin String - */ - arithemetic(operation){ - - let ops_name = [ "mean", "sum", "count", "mode", "std", "var", "cumsum", "cumprod", - "cummax", "cummin" ]; - - let ops_map = { - "mean": "mean()", - "sum": "sum()", - "mode": "mode()", - "count": "count()", - "std" : "std()", - "var" : "var()", - "cumsum" : "cumsum().values", - "cumprod": "cumprod().values", - "cummax" : "cummax().values", - "cummin" : "cummin().values" - }; - let is_array = false; - //the local variable to store variables to be used in eval - // this seems not to be needed in Node version, since local - //variable are easily accessed in the eval function - let local = null; - - if (Array.isArray(operation)){ - is_array = true; - } - - if (this.key_col.length == 2){ - - let count_group = {}; - - for (var key1 in this.group_col){ - - count_group[key1] = {}; - for (var key2 in this.group_col[key1]){ - - count_group[key1][key2] = []; - for (let i = 0; i < this.group_col[key1][key2].length; i++ ){ - let data = null; - if (is_array){ - let op = operation[i]; - if (!ops_name.includes(op)){ - throw new Error("operation does not exist"); - } - local = this.group_col[key1][key2][i]; - data = eval(`local.${ops_map[op]}`); - - } else { - local = this.group_col[key1][key2][i]; - data = eval(`local.${operation}`); - } - count_group[key1][key2].push(data); - - } - - } - } - return count_group; - - } else { - let count_group = {}; - - for (let key1 in this.group_col){ - - count_group[key1] = []; - for (let i = 0; i < this.group_col[key1].length; i++ ){ - let data = null; - if (is_array){ - let op = operation[i]; - if (!ops_name.includes(op)){ - throw new Error("operation does not exist"); - } - local = this.group_col[key1][i]; - data = eval(`local.${ops_map[op]}`); - - } else { - local = this.group_col[key1][i]; - data = eval(`local.${operation}`); - } - - count_group[key1].push(data); - - } - } - - return count_group; - } - - - } - - operations(ops, name) { - if (!this.group_col) { - let column = this.column_name.filter((val) => !this.key_col.includes(val)); - let col_gp = this.col(column); - let value = col_gp.arithemetic(ops); - let df = col_gp.to_DataFrame(col_gp.key_col, col_gp.group_col_name, value, name); - return df; - } else { - let value = this.arithemetic(ops); - let df = this.to_DataFrame(this.key_col, this.group_col_name, value, name); - return df; - } - } - count(){ - return this.operations("count()", "count"); - } - - sum(){ - return this.operations("sum()", "sum"); - } - - std(){ - return this.operations("std()", "std"); - } - - var(){ - return this.operations("var()", "var"); - } - - mean(){ - return this.operations("mean()", "mean"); - } - - cumsum(){ - return this.operations("cumsum().values", "cumsum"); - } - cummax(){ - return this.operations("cummax().values", "cummax"); - } - - cumprod(){ - return this.operations("cumprod().values", "cumprod"); - } - - cummin(){ - return this.operations("cummin().values", "cummin"); - } - - max(){ - return this.operations("max()", "max"); - } - - min(){ - return this.operations("min()", "min"); - } - - /** - * returns dataframe of a group - * @param {*} key [Array] - */ - get_groups(key){ - - if (this.key_col.length == 2){ - - if (key.length == 2){ - let key1 = key[0]; - let key2 = key[1]; - - utils.__is_object(this.data_tensors, key1, `Key Error: ${key1} not in object`); - return this.data_tensors[key1][key2]; - } else { throw new Error("specify the two group by column"); } - } else if (this.key_col.length == 1){ - - if (key.length == 1){ - - utils.__is_object(this.data_tensors, key[0], `Key Error: ${key[0]} not in object`); - return this.data_tensors[key[0]]; - } else { throw new Error("specify the one group by column"); } - } - return this.data_tensors[key]; - } - - /** - * Map every column to an operaton - * @param {kwargs} kwargs {column name: math operation} - * @example .agg({"A": "mean","B": "sum","C":"count"}) - */ - agg(kwargs = {}){ - - let columns = Object.keys(kwargs); - let operations = columns.map((x) => { return kwargs[x].toLocaleLowerCase(); }); - - let col_gp = this.col(columns); - - let data = col_gp.arithemetic(operations); - let df = this.to_DataFrame(col_gp.key_col, col_gp.group_col_name, data, operations); - - return df; - } - - to_DataFrame(key_col, col, data, ops){ - - if (key_col.length == 2){ - let df_data = []; - for (let key_1 in data){ - - let key_val = data[key_1]; - - for (let key_2 in key_val){ - let k_data = key_val[key_2]; - let key_data = []; - - - if (Array.isArray(k_data[0])){ - for (let i = 0; i < k_data.length; i++){ - let col_data = k_data[i]; - - for (let j = 0; j < col_data.length; j++ ){ - - if (typeof key_data[j] === "undefined" ){ - key_data[j] = []; - key_data[j][0] = isNaN(parseInt(key_1)) ? key_1 : parseInt(key_1); - key_data[j][1] = isNaN(parseInt(key_2)) ? key_2 : parseInt(key_2); - key_data[j].push(col_data[j]); - } else { - key_data[j].push(col_data[j]); - } - } - } - df_data.push(...key_data); - - } else { - key_data[0] = isNaN(parseInt(key_1)) ? key_1 : parseInt(key_1); - key_data[1] = isNaN(parseInt(key_2)) ? key_2 : parseInt(key_2); - key_data.push(...k_data); - df_data.push(key_data); - } - - - } - - } - let column = [ ...key_col ]; - - let group_col = col.slice().map((x, i) => { - if (Array.isArray(ops)){ - return `${x}_${ops[i]}`; - } - return `${x}_${ops}`; - }); - column.push(...group_col); - return new DataFrame(df_data, { columns: column }); - } else { - let df_data = []; - for (let key_1 in data){ - - let key_val = data[key_1]; - - let key_data = []; - if (Array.isArray(key_val[0])){ - for (let i = 0; i < key_val.length; i++){ - let col_data = key_val[i]; - - for (let j = 0; j < col_data.length; j++ ){ - - if (typeof key_data[j] === "undefined" ){ - key_data[j] = []; - key_data[j][0] = isNaN(parseInt(key_1)) ? key_1 : parseInt(key_1); - key_data[j].push(col_data[j]); - } else { - key_data[j].push(col_data[j]); - } - } - df_data.push(...key_data); - } - - } else { - key_data[0] = isNaN(parseInt(key_1)) ? key_1 : parseInt(key_1); - key_data.push(...key_val); - df_data.push(key_data); - } - - } - let column = [ ...key_col ]; - let group_col = col.slice().map((x, i) => { - if (Array.isArray(ops)){ - return `${x}_${ops[i]}`; - } - return `${x}_${ops}`; - }); - column.push(...group_col); - - return new DataFrame(df_data, { columns: column }); - } - } - - apply(callable){ - let df_data; - let column; - if (!this.group_col) { - column = this.column_name.filter((val) => !this.key_col.includes(val)); - let col_gp = this.col(column); - df_data = col_gp.group_col; - } else { - column = this.group_col_name; - df_data = this.group_col; - } - let data = []; - let count_group = {}; - if (this.key_col.length == 2) { - - for (let key in this.data_tensors) { - count_group[key] = {}; - for (let key2 in this.data_tensors[key]) { - count_group[key][key2] = []; - for (let i = 0; i < df_data[key][key2].length; i++ ) { - let callable_rslt = callable(df_data[key][key2][i]); - if (callable_rslt instanceof DataFrame) { - count_group[key][key2].push(callable_rslt.values); - } else { - if (callable_rslt instanceof Series) { - count_group[key][key2].push(callable_rslt.values); - } else { - count_group[key][key2].push(callable_rslt); - } - } - } - - - } - } - } else { - for (let key in df_data) { - count_group[key] = []; - for (let i = 0; i < df_data[key].length; i++ ){ - let callable_rslt = callable(df_data[key][i]); - if (callable_rslt instanceof DataFrame) { - count_group[key].push(callable_rslt.values); - } else { - if (callable_rslt instanceof Series) { - count_group[key].push(callable_rslt.values); - } else { - count_group[key].push(callable_rslt); - } - - } - } - - } - } - return this.to_DataFrame(this.key_col, column, count_group, "apply"); - } - -} diff --git a/src/lib/danfo/core/indexing.js b/src/lib/danfo/core/indexing.js deleted file mode 100644 index 8383ff1..0000000 --- a/src/lib/danfo/core/indexing.js +++ /dev/null @@ -1,191 +0,0 @@ -import { Utils } from "./utils"; -const utils = new Utils(); - - -/** - * Obtain the defined the set of row and column index - * @param {*} kwargs object {rows:Array, columns:Array of column name, type: ["iloc","loc"]} - * @return Array - */ -export const indexLoc = (ndframe, kwargs) => { - - let rows = null; - let columns = null; - let isColumnSplit = false; - - if (Object.prototype.hasOwnProperty.call(kwargs, "rows")) { //check if the object has the key - if (Array.isArray(kwargs["rows"])) { - - if (kwargs["rows"].length == 1 && typeof kwargs["rows"][0] == "string") { - //console.log("here", kwargs["rows"].length) - if (kwargs["rows"][0].includes(":")) { - - let row_split = kwargs["rows"][0].split(":"); - - if (kwargs['type'] == 'loc') { - //get index of first and last occurence of label - let start, end; - if (isNaN(Number(row_split[0]))) { - start = ndframe.index.indexOf(row_split[0]); - } else { - start = Number(row_split[0]); - } - - if (isNaN(Number(row_split[1]))) { - end = ndframe.index.lastIndexOf(row_split[1]) - 1 || (ndframe.values.length - 1); - } else { - end = Number(row_split[1]) - 1 || (ndframe.values.length - 1); - } - rows = utils.__range(start, end); - } else { - let start = parseInt(row_split[0]) || 0; - let end = parseInt(row_split[1]) - 1 || (ndframe.values.length - 1); - - if (typeof start == "number" && typeof end == "number") { - rows = utils.__range(start, end); - } - } - - } else { - if (kwargs["type"] == "loc") { - let row_idx = []; - ndframe.index.map((idx, i) => { - if (kwargs['rows'][0] == idx) { - row_idx.push(i); - } - }); - rows = row_idx; - } else { - throw new Error("Slice index must be separated by ':'"); - } - } - } else { - if (kwargs["type"] == "loc") { - //get all the index of specified labels - let row_idx = []; - ndframe.index.map((idx, i) => { - if (kwargs['rows'].includes(idx)) { - row_idx.push(i); - } - }); - rows = row_idx; - } else { - //return int index - rows = kwargs["rows"]; - } - } - } else { - throw new Error("rows parameter must be a Array"); - } - } else { - if (kwargs["type"] == "loc") { - rows = utils.__range(0, Number(ndframe.shape[0]) - 1); - // throw new Error("Invalid syntax, please specify a slice label") - } else { - rows = utils.__range(0, Number(ndframe.shape[0]) - 1); - } - } - - if (Object.prototype.hasOwnProperty.call(kwargs, "columns")) { - if (Array.isArray(kwargs["columns"])) { - if (kwargs["columns"].length == 1 && kwargs["columns"][0].includes(":")) { - - let row_split = kwargs["columns"][0].split(":"); - let start, end; - - if (kwargs["type"] == "iloc" || (row_split[0] == "")) { - start = parseInt(row_split[0]) || 0; - end = parseInt(row_split[1]) - 1 || (ndframe.values[0].length - 1); - } else { - - start = parseInt(ndframe.columns.indexOf(row_split[0])); - end = parseInt(ndframe.columns.indexOf(row_split[1])) - 1; - } - - - if (typeof start == "number" && typeof end == "number") { - - columns = utils.__range(start, end); - isColumnSplit = true; - } - - } else { - columns = kwargs["columns"]; - } - - } else { - throw new Error("columns must be a list"); - } - } else { - //Return all column - if (kwargs["type"] == "loc") { - columns = ndframe.column_names; - } else { - columns = utils.__range(0, Number(ndframe.shape[1]) - 1); - } - } - - let data_values = ndframe.values; - let new_data = []; // store the data from the for loop - - for (var index = 0; index < rows.length; index++) { - let row_val = rows[index]; - let max_rowIndex = data_values.length - 1; //obtain the maximum row index - - if (row_val > max_rowIndex) { //check if the input row index is greater than the maximum row index - throw new Error(`Specified row index ${row_val} is bigger than maximum row index of ${max_rowIndex}`); - } - - if (Array.isArray(data_values[0])){ - - let value = data_values[row_val]; - let row_data = []; - - - for (var i in columns) { - var col_index; - if (kwargs["type"] == "loc" && !isColumnSplit) { - col_index = ndframe.columns.indexOf(columns[i]); //obtain the column index - - if (col_index == -1) { - throw new Error(`Column ${columns[i]} does not exist`); - } - } else { - col_index = columns[i]; - let max_colIndex = ndframe.columns.length - 1; //assign the maximum column index to a value - - if (col_index > max_colIndex) { - throw new Error(`column index ${col_index} is bigger than ${max_colIndex}`); - } - } - - let elem = value[col_index]; //obtain the element at the column index - row_data.push(elem); - } - - new_data.push(row_data); //store the data for each row in the new_data - - } else { - - new_data.push(data_values[row_val]); - } - - } - - let column_names = []; - if (kwargs["type"] == "iloc" || isColumnSplit) { - // let axes = ndframe.axes - columns.map((col) => { - column_names.push(ndframe.columns[col]); - }); - } else { - column_names = columns; - } - - //get index of columns - let final_row = []; - rows.forEach((i) => { - final_row.push(ndframe.index[i]); - }); - return [ new_data, column_names, final_row ]; -}; diff --git a/src/lib/danfo/core/merge.js b/src/lib/danfo/core/merge.js deleted file mode 100644 index 718c0b4..0000000 --- a/src/lib/danfo/core/merge.js +++ /dev/null @@ -1,321 +0,0 @@ -import { DataFrame } from './frame'; -import { Utils } from "./utils"; - -const utils = new Utils; -export class Merge { - - constructor(kwargs) { - - //check if keys exist in kwargs - utils.__in_object(kwargs, "left"); - utils.__in_object(kwargs, "right"); - utils.__in_object(kwargs, "on"); - // utils.__in_object(kwargs, "how") - if (!utils.__key_in_object(kwargs, "how")){ - this.how = 'inner'; - kwargs['how'] = 'inner'; - } else { - this.how = kwargs['how']; - } - - this.left = null; - this.right = null; - this.on = null; - // this.how = null; - - let how_keys = [ "outer", "inner", "left", "right" ]; - - if ((kwargs["left"] instanceof DataFrame) && (kwargs["right"] instanceof DataFrame)) { - this.left = kwargs["left"]; - this.right = kwargs["right"]; - } else { - throw new Error("The left and right key value must be a dataFrame"); - } - - if (Array.isArray(kwargs["on"])) { - this.on = kwargs["on"]; - } else { - throw new Error("key 'on' must be a list"); - } - - if (how_keys.includes(kwargs["how"])) { - - this.how = kwargs["how"]; - } else { - throw new Error(`${kwargs["how"]} specify in keyword how is not recognise`); - } - - this.left_col_index = []; - this.right_col_index = []; - - //find the index of the columns - for (let i = 0; i < this.on.length; i++) { - - if (this.left.columns.includes(this.on[i]) && this.right.columns.includes(this.on[i])) { - - let left_index = this.left.columns.indexOf(this.on[i]); - let right_index = this.right.columns.indexOf(this.on[i]); - - this.left_col_index.push(left_index); - this.right_col_index.push(right_index); - } - } - - this.left_key_dict = {}; - this.right_key_dict = {}; - - let left_values = this.left.values; - let right_values = this.right.values; - - - /** - * Create a dictionary for both left and right dataframe - containing the key combination of columns used as keys, and - the value of such keys combination are the rows having this - keys combination. - */ - for (let i = 0; i < left_values.length; i++) { - - let left_value = left_values[i]; - let right_value = right_values[i]; - - let right_key_comb = ""; - let left_key_comb = ""; - - //get the value in the column index - for (let j = 0; j < this.left_col_index.length; j++) { - let index = this.left_col_index[j]; - - left_key_comb += `_${left_value[index]}`; - } - - let self = this; // assign the this scope to self - //filter out the value that are not the column key - let left_value_filter = left_value.filter(function (val, index) { - return !self.left_col_index.includes(index); - }); - - //check if the key combination already exist or not - //before storing the key combination and the value - //associated with it - if (utils.__key_in_object(this.left_key_dict, left_key_comb)) { - this.left_key_dict[left_key_comb].push(left_value_filter); - } else { - this.left_key_dict[left_key_comb] = [ left_value_filter ]; - } - - } - for (let i = 0; i < right_values.length; i++) { - let right_value = right_values[i]; - let right_key_comb = ""; - - for (let j = 0; j < this.right_col_index.length; j++) { - let index = this.right_col_index[j]; - - right_key_comb += `_${right_value[index]}`; - } - let self = this; - let right_value_filter = right_value.filter(function (val, index) { - return !self.right_col_index.includes(index); - }); - - if (utils.__key_in_object(this.right_key_dict, right_key_comb)) { - this.right_key_dict[right_key_comb].push(right_value_filter); - } else { - this.right_key_dict[right_key_comb] = [ right_value_filter ]; - } - } - - - //create column - this.__create_columns(); - - let data = null; - switch (this.how) { - - case "outer": - data = this.outer(); - break; - case "inner": - data = this.inner(); - break; - case "left": - data = this.left_merge(); - break; - case "right": - data = this.right_merge(); - break; - } - - // eslint-disable-next-line no-self-assign - let df = new DataFrame(data = data, { columns: this.columns }); - - return df; - } - - __create_columns() { - - let self = this; - self.left_col = self.left.columns.filter((val, index) => { - return !self.left_col_index.includes(index); - }); - - self.right_col = self.right.columns.filter((val, index) => { - return !self.right_col_index.includes(index); - }); - - self.columns = [ ...self.on ]; - let column_duplicate = {}; - - let temp_column = [ ...self.left_col ]; - temp_column.push(...self.right_col); - - for (let i = 0; i < temp_column.length; i++) { - - let col = temp_column[i]; - if (utils.__key_in_object(column_duplicate, col)) { - - let col_name = `${col}_${column_duplicate[col]}`; - self.columns.push(col_name); - - column_duplicate[col] += 1; - } else { - self.columns.push(col); - column_duplicate[col] = 1; - } - } - } - - outer() { - - let keys = Object.keys(this.left_key_dict); // obtain the keys of the left dataframe - - keys.push(...Object.keys(this.right_key_dict)); - - keys = Array.from(new Set(keys)); // obtain the unique keys - - let data = this.basic(keys); - - return data; - - } - - inner() { - - let left_keys = Object.keys(this.left_key_dict); - let right_keys = Object.keys(this.right_key_dict); - - let keys = left_keys.filter((val) => { - return right_keys.includes(val); - }); - - let data = this.basic(keys); - - return data; - } - - left_merge() { - - let keys = Object.keys(this.left_key_dict); - let data = this.basic(keys); - - return data; - - } - - right_merge() { - let keys = Object.keys(this.right_key_dict); - let data = this.basic(keys); - - return data; - } - - basic(keys) { - - let data = []; - - for (let i = 0; i < keys.length; i++) { - let key = keys[i]; - - let key_array = key.split("_").filter((val) => { - return val != ""; - }); - - if (utils.__key_in_object(this.left_key_dict, key)) { - let left_row = this.left_key_dict[key]; - - - for (let left_i = 0; left_i < left_row.length; left_i++) { - - let left_row_row = left_row[left_i]; - - if (utils.__key_in_object(this.right_key_dict, key)) { - - let right_row = this.right_key_dict[key]; - - for (let r_i = 0; r_i < right_row.length; r_i++) { - - let right_row_row = right_row[r_i]; - - - let inner_data = key_array.slice(0); - inner_data.push(...left_row_row); - inner_data.push(...right_row_row); - - - data.push(inner_data); - } - } else { - let nan_array = Array(this.right_col.length); - - for (let i = 0; i < this.right_col.length; i++) { - nan_array[i] = NaN; - } - - let inner_data = key_array.slice(0); - inner_data.push(...left_row_row); - inner_data.push(...nan_array); - data.push(inner_data); - } - } - } else { - - let right_row = this.right_key_dict[key]; - - for (let i = 0; i < right_row.length; i++) { - - let right_row_row = right_row[i]; - - let nan_array = Array(this.left_col.length); - - for (let j = 0; j < nan_array.length; j++) { - nan_array[j] = NaN; - } - - let inner_data = key_array.slice(0); - inner_data.push(...nan_array); - inner_data.push(...right_row_row); - data.push(inner_data); - } - } - } - return data; - - } -} - - -/** -* Merge DataFrame or named Series objects with a database-style join. -* The join is done on columns or indexes. If joining columns on columns, the DataFrame indexes will be ignored. Otherwise -* if joining indexes on indexes or indexes on a column or columns, the index will be passed on. -* @param {kwargs}{left: DataFrame; -* right: DataFrame | Named Series, Object to merge with; -* on: label, Column or index level names to join on. These must be found in both DataFrames; -* how: {‘left’, ‘right’, ‘outer’, ‘inner’}. Type of merge to be performed. -* @returns {DataFrame} -*/ -export const merge = (kwargs) => { - let merge = new Merge(kwargs); - return merge; -}; diff --git a/src/lib/danfo/core/series.js b/src/lib/danfo/core/series.js deleted file mode 100644 index 06e4168..0000000 --- a/src/lib/danfo/core/series.js +++ /dev/null @@ -1,1306 +0,0 @@ -/** -* Copyright 2020, JsData -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. - -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. - * -*/ - - -import * as tf from "@tensorflow/tfjs"; -import { variance, std, median, mode } from 'mathjs'; -import { Utils } from "./utils"; -import { Str } from "./strings"; -import NDframe from "./generic"; -import { table } from 'table'; -import { Configs } from '../config/config'; -import { TimeSeries } from './timeseries'; -import { Plot } from '../plotting/plot'; -import { indexLoc } from './indexing'; - - -const utils = new Utils(); -const config = new Configs(); //package wide configuration object - - -/** - * One-dimensional ndarray with axis labels (including time series). - * The object supports both integer- and label-based indexing and provides a host of methods for performing operations involving the index. - * Operations between Series (+, -, /, , *) align values based on their associated index values– they need not be the same length. - * @param {data} data Array, JSON of 1D values - * @param {kwargs} Object {columns: column names, dtypes : data type of values} - * - * @returns Series - */ -export class Series extends NDframe { - constructor(data, kwargs) { - if (Array.isArray(data[0]) || utils.__is_object(data[0])) { - data = utils.__convert_2D_to_1D(data); - super(data, kwargs); - } else { - super(data, kwargs); - } - } - - - /** - * Returns a Series in Tensorflow's tensor format - * @returns {1D Tensor} - */ - get tensor() { - return tf.tensor(this.values).asType(this.dtypes[0]); - } - - - /** - * Returns the first n values in a Series - * @param {rows} Number of rows to return - * @returns {Series} - */ - head(rows = 5) { - if (rows > this.shape[0] || rows < 1) { - //return all values - return new Series(this.values, { columns: this.column_names }); - } else { - let data = this.values.slice(0, rows); - return new Series(data, { columns: this.column_names }); - } - - } - - - /** - * Returns the last n values in a Series - * @param {rows} number of rows to return - * @returns {Series} - */ - tail(rows = 5) { - if (rows > this.values.length || rows < 1) { - //return all values - return new Series(this.values, { columns: this.column_names }); - } else { - let data = this.values.slice(this.shape[0] - rows); - let idx = this.index.slice(this.shape[0] - rows); - let sf = new Series(data, { columns: this.column_names, index: idx }); - return sf; - } - - } - - /** - * Gets [num] number of random rows in a dataframe - * @param {num} rows --> The number of rows to return - * @param {seed} seed --> (Optional) An integer specifying the random seed that will be used to create the distribution. - * @returns {Promise} resolves to a Series object - */ - async sample(num = 5, seed = 1) { - if (num > this.shape[0]) { - throw new Error("Sample size n cannot be bigger than size of dataset"); - } - if (num < -1 || num == 0) { - throw new Error("Sample size cannot be less than -1 or 0"); - } - num = num === -1 ? this.shape[0] : num; - const shuffled_index = await tf.data.array(this.index).shuffle(num, seed).take(num).toArray(); - const sf = this.iloc(shuffled_index); - return sf; - } - - /** - * Return Addition of series and other, element-wise (binary operator add). - * Equivalent to series + other - * @param {other} Series or Number to add - * @returns {Series} - */ - add(other) { - if (utils.__is_number(other)) { - //broadcast addition - let sum = this.row_data_tensor.add(other).arraySync(); - return new Series(sum, { columns: this.column_names }); - } else { - if (this.__check_series_op_compactibility) { - let sum = this.tensor.add(other.tensor).arraySync(); - return new Series(sum, { columns: this.column_names }); - } - } - } - - - /** - * Returns the subtraction between a series and other, element-wise (binary operator subtraction). - * Equivalent to series - other - * @param {other} Series, Number to subtract - * @returns {Series} - */ - sub(other) { - if (utils.__is_number(other)) { - let sub = this.tensor.sub(other).arraySync(); - return new Series(sub, { columns: this.column_names }); - } else { - if (this.__check_series_op_compactibility) { - let sub = this.tensor.sub(other.tensor).arraySync(); - return new Series(sub, { columns: this.column_names }); - } - } - } - - - /** - * Return Multiplication of series and other, element-wise (binary operator mul). - * Equivalent to series * other - * @param {other} Series, Number to multiply with. - * @returns {Series} - */ - mul(other) { - if (utils.__is_number(other)) { - let mul = this.tensor.mul(other).arraySync(); - return new Series(mul, { columns: this.column_names }); - } else { - if (this.__check_series_op_compactibility) { - let mul = this.tensor.mul(other.tensor).arraySync(); - return new Series(mul, { columns: this.column_names }); - } - } - } - - - /** - * Return division of series and other, element-wise (binary operator div). - * Equivalent to series / other - * @param {other} Series, Number to divide with. - * @returns {Series} - */ - div(other, round = true) { - if (utils.__is_number(other)) { - let div_result = this.tensor.div(other); - return new Series(div_result.arraySync(), { columns: this.column_names, dtypes: [ div_result.dtype ] }); - } else { - if (this.__check_series_op_compactibility) { - let dtype; - //Check if caller needs a float division - if (round) { - dtype = "float32"; - } else { - dtype = "int32"; - } - //dtype may change after division because of how TFJS works internally, so save dtypes first - let tensor1 = this.tensor.asType(dtype); - let tensor2 = other.tensor.asType(dtype); - let result = tensor1.div(tensor2); - return new Series(result.arraySync(), { columns: this.column_names, dtypes: [ result.dtype ] }); - } - } - } - - /** - * Return Exponential power of series and other, element-wise (binary operator pow). - * Equivalent to series ** other - * @param {other} Series, Number to multiply with. - */ - pow(other) { - if (utils.__is_number(other)) { - let pow_result = this.tensor.pow(other).arraySync(); - return new Series(pow_result, { columns: this.column_names }); - } else { - if (this.__check_series_op_compactibility) { - let pow_result = this.tensor.pow(other.tensor).arraySync(); - return new Series(pow_result, { columns: this.column_names }); - } - } - } - - /** - * Return Modulo of series and other, element-wise (binary operator mod). - * Equivalent to series % other - * @param {other} Series, Number - * @returns {Series} - */ - mod(other) { - if (utils.__is_number(other)) { - let mod_result = this.tensor.mod(other).arraySync(); - return new Series(mod_result, { columns: this.column_names }); - } else { - if (this.__check_series_op_compactibility) { - let mod_result = this.tensor.mod(other.tensor).arraySync(); - return new Series(mod_result, { columns: this.column_names }); - } - } - } - - - /** - * Returns the mean of elements in Series - * @returns {Series} - */ - mean() { - utils._throw_str_dtype_error(this, 'mean'); - let values = utils._remove_nans(this.values); - let mean = tf.tensor(values).mean().arraySync(); - return mean; - } - - - /** - * Returns the median of elements in Series - * @returns {Series} - */ - median() { - utils._throw_str_dtype_error(this, 'median'); - let values = utils._remove_nans(this.values); - let median_val = median(values); - return median_val; - } - - - /** - * Returns the modal value of elements in Series - * @returns {Number} - */ - mode() { - utils._throw_str_dtype_error(this, 'median'); - let values = utils._remove_nans(this.values); - let modal_val = mode(values); - return modal_val; - } - - - /** - * Returns the minimum value in a Series - * @returns {Number} - */ - min() { - utils._throw_str_dtype_error(this, 'min'); - let min = this.row_data_tensor.min().arraySync(); - return min; - - } - - /** - * Returns the maximum value in a Series - * @returns {Number} - */ - max() { - utils._throw_str_dtype_error(this, 'max'); - let max = this.row_data_tensor.max().arraySync(); - return max; - - } - - - /** - * Return the sum of the values in a series. - * This is equivalent to the method tf.sum - * @returns {Number}, sum of values in Series - */ - sum() { - utils._throw_str_dtype_error(this, 'sum'); - if (this.dtypes[0] == "boolean") { - let temp_sum = this.row_data_tensor.sum().arraySync(); - return Number(temp_sum); - } - let temp_sum = this.row_data_tensor.sum().arraySync(); - return Number(temp_sum.toFixed(5)); - } - - - /** - * Return number of non-null elements in a Series - * @returns {Number}, Count of non-null values - */ - count() { - return utils.__count_nan(this.values, true, true); - } - - - /** - * Return maximum of series and other, element-wise (binary operator div). - * @param {other} Series, Numbers to check maximum against - * @returns {Series} - */ - maximum(other) { - if (utils.__is_number(other)) { - let max_result = this.row_data_tensor.maximum(other); - return new Series(max_result.arraySync(), { - columns: this.column_names, - dtypes: max_result.dtype, - index: this.index - }); - } else { - if (this.__check_series_op_compactibility) { - let tensor1 = this.row_data_tensor; - let tensor2 = other.tensor; - let result = tensor1.maximum(tensor2).arraySync(); - return new Series(result, { columns: this.column_names, index: this.index }); - } - } - } - - /** - * Return maximum of series and other, element-wise (binary operator div). - * @param {other} Series, Numbers to check maximum against - * @returns {Series} - */ - minimum(other) { - if (utils.__is_number(other)) { - let max_result = this.row_data_tensor.minimum(other); - return new Series(max_result.arraySync(), { - columns: this.column_names, - dtypes: max_result.dtype, - index: this.index - }); - } else { - if (this.__check_series_op_compactibility) { - let tensor1 = this.tensor; - let tensor2 = other.tensor; - let result = tensor1.minimum(tensor2).arraySync(); - return new Series(result, { columns: this.column_names, index: this.index }); - } - } - } - - - /** - * Round each value in a Series to the given number of decimals. - * @param {dp} Number, Numbers of Decimal places to round to - * @returns {Series} - */ - round(dp) { - if (utils.__is_undefined(dp)) { - //use tensorflow round function to roound to the nearest whole number - let result = tf.round(this.row_data_tensor).arraySync(); - return new Series(result, { columns: this.column_names, index: this.index }); - - } else { - let result = utils.__round(this.values, dp, true); - return new Series(result, { columns: this.column_names, index: this.index }); - - } - - } - - /** - * Return sample standard deviation over requested axis. - * @returns {Number} - */ - std() { - utils._throw_str_dtype_error(this, 'std'); - let values = utils._remove_nans(this.values); - // TODO: Use Tensorflow ops for faster computation - let std_val = std(values); //using math.js - return std_val; - - } - - /** - * Return unbiased variance of Series. - * @returns {Number} - */ - var() { - utils._throw_str_dtype_error(this, 'std'); - let values = utils._remove_nans(this.values); - // TODO: Use Tensorflow ops for faster computation - let var_val = variance(values); //using math.js - return var_val; - - } - - /** - * Return a boolean same-sized object indicating if the values are NaN. NaN and undefined values, - * gets mapped to True values. Everything else gets mapped to False values. - * @return {Series} - */ - isna() { - let new_arr = this.__isna(); - let sf = new Series(new_arr, { - index: this.index, - columns: this.column_names, - dtypes: [ "boolean" ] - }); - return sf; - } - - /** - * Replace NaN or undefined with a specified value" - * @param {kwargs}, {"value": the new value to replace the old value with, inplace: Perform operation inplace or not} - * @return {Series} - */ - fillna(kwargs = {}) { - let params_needed = [ "value", "inplace" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - kwargs['inplace'] = kwargs['inplace'] || false; - - if (!("value" in kwargs)) { - throw Error('Value Error: Must specify value to replace with'); - } - - let new_values = []; - this.values.forEach((val) => { - if (isNaN(val) && typeof val != "string") { - new_values.push(kwargs['value']); - } else { - new_values.push(val); - } - }); - - if (kwargs['inplace']) { - this.data = new_values; - } else { - let sf = new Series(new_values, { - columns: this.column_names, - index: this.index, - dtypes: this.dtypes - }); - return sf; - } - } - - - /** - * Sort a Series in ascending or descending order by some criterion. - * @param {kwargs} Object, {ascending (Bool): Whether to return sorted values in ascending order or not, - * inplace (Bool): Whether to perform sorting on the original Series or not} - * @returns {Series} - */ - sort_values(kwargs = {}) { - let params_needed = [ "inplace", "ascending" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - if (!('ascending' in kwargs)) { - kwargs['ascending'] = true; - } - - if (!('inplace' in kwargs)) { - kwargs['inplace'] = false; - } - - let sorted_values = []; - let arr_obj = [ ...this.values ]; - let range_idx = utils.__range(0, this.index.length - 1); - let sorted_idx = utils._sort_arr_with_index(range_idx, arr_obj, this.dtypes[0]); - - sorted_idx.forEach((idx) => { - sorted_values.push(this.values[idx]); - }); - - if (kwargs['ascending']) { - sorted_values = sorted_values.reverse(); - sorted_idx = sorted_idx.reverse(); - } - - if (kwargs['inplace']) { - this.data = sorted_values; - this.__set_index(sorted_idx); - } else { - let sf = new Series(sorted_values, { columns: this.column_names, index: sorted_idx }); - return sf; - } - } - - - /** - * Makes a deep copy of a Series - * @returns {Series} - */ - copy() { - - let sf = new Series([ ...this.values ], { - columns: [ ...this.column_names ], - index: [ ...this.index ], - dtypes: [ ...this.dtypes[0] ] - }); - return sf; - } - - - /** - * Generate descriptive statistics. - * Descriptive statistics include those that summarize the central tendency, - * dispersion and shape of a dataset’s distribution, excluding NaN values. - * @returns {Series} - */ - describe() { - if (this.dtypes[0] == "string") { - return null; - } else { - - let index = [ 'count', 'mean', 'std', 'min', 'median', 'max', 'variance' ]; - let count = this.count(); - let mean = this.mean(); - let std = this.std(); - let min = this.min(); - let median = this.median(); - let max = this.max(); - let variance = this.var(); - - let vals = [ count, mean, std, min, median, max, variance ]; - let sf = new Series(vals, { columns: this.columns, index: index }); - return sf; - - } - - - } - - - /** - * Returns Series with the index reset. - * This is useful when index is meaningless and needs to be reset to the default before another operation. - * @param {kwargs} {inplace: Modify the Series in place (do not create a new object} - */ - reset_index(kwargs = {}) { - let params_needed = [ "inplace" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - kwargs['inplace'] = kwargs['inplace'] || false; - - if (kwargs['inplace']) { - this.__reset_index(); - } else { - let sf = this.copy(); - sf.__reset_index(); - return sf; - } - } - - /** - * Returns Series with the specified index. - * Set the Series index (row labels) using an array of the same length. - * @param {kwargs} {index: Array of new index values, - * inplace: If operation should happen inplace - * } - */ - set_index(kwargs = {}) { - - let params_needed = [ "index", "inplace" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - - kwargs['inplace'] = kwargs['inplace'] || false; - - if (!('index' in kwargs)) { - throw Error("Index ValueError: You must specify an array of index"); - } - - if (kwargs['index'].length != this.index.length) { - throw Error(`Index LengthError: Lenght of new Index array ${kwargs['index'].length} must match lenght of existing index ${this.index.length}`); - } - - if (kwargs['inplace']) { - this.index_arr = kwargs['index']; - } else { - let sf = this.copy(); - sf.__set_index(kwargs['index']); - return sf; - } - } - - - /** - * Checks if two series are compatible for a mathematical operation - * @param {Series} other Series to compare against - * @returns{boolean} - */ - __check_series_op_compactibility(other) { - if (utils.__is_undefined(other.series)) { - throw Error("param [other] must be a Series or a single value that can be broadcasted"); - } - if (other.values.length != this.values.length) { - throw Error("Shape Error: Series shape do not match"); - } - if (this.dtypes[0] != 'float' || this.dtypes[0] != 'int') { - throw Error(`dtype Error: Cannot perform operation on type ${this.dtypes[0]} with type ${other.dtypes[0]}`); - } - if (other.dtypes[0] != 'float' || other.dtypes[0] != 'int') { - throw Error(`dtype Error: Cannot perform operation on type ${other.dtypes[0]} with type ${this.dtypes[0]}`); - } - - return true; - } - - /** - * map all the element in a column to a variable or function - * @param{callable} callable can either be a funtion or an object - * @return {Array} - */ - map(callable) { - let is_callable = utils.__is_function(callable); - - let data = this.data.map((val) => { - if (is_callable) { - return callable(val); - } else { - if (utils.__is_object(callable)) { - - if (val in callable) { - return callable[val]; - } else { - return NaN; - } - } else { - throw new Error("callable must either be a function or an object"); - } - } - }); - let sf = new Series(data, { - columns: this.column_names, - index: this.index - }); - return sf; - } - - /** - * Applies a function to each element of a Series - * @param {Function} Function to apply to each element of the series - * @return {Array} - */ - apply(callable) { - let is_callable = utils.__is_function(callable); - - if (!is_callable) { - throw new Error("the arguement most be a function"); - } - - let data = this.data.map((val) => { - return callable(val); - }); - return new Series(data, { columns: this.column_names, index: this.index }); - } - - /** - * Returns the unique value(s) in a Series - * @return {Series} - */ - unique() { - - let data_set = new Set(this.values); - let series = new Series(Array.from(data_set)); - - return series; - - } - - /** - * Return the number of unique value in a series - * @return {int} - */ - nunique() { - return this.unique().values.length; - } - - /** - * Returns unique values and their counts in a Series - * @return {Series} - */ - value_counts() { - - let s_data = this.values; - let data_dict = {}; - - for (let i = 0; i < s_data.length; i++) { - let val = s_data[i]; - - if (val in data_dict) { - data_dict[val] += 1; - } else { - data_dict[val] = 1; - } - } - - let index = Object.keys(data_dict).map((x) => { - return parseInt(x) ? parseInt(x) : x; - }); - let data = Object.values(data_dict); - - let series = new Series(data, { index: index }); - return series; - - } - - /** - * Returns the absolute values in Series - * @return {series} - */ - abs() { - let abs_data = this.row_data_tensor.abs().arraySync(); - return new Series(utils.__round(abs_data, 2, true)); - } - - - /** - * Returns the cumulative sum over a Series - * @return {Series} - */ - cumsum() { - let data = this.__cum_ops("sum"); - return data; - } - - /** - * Returns cumulative minimum over a Series - * @returns series - */ - cummin() { - let data = this.__cum_ops("min"); - return data; - } - - /** - * Returns cumulative maximum over a Series - * @returns series - */ - cummax() { - let data = this.__cum_ops("max"); - return data; - } - - /** - * Returns cumulative product over a Series - * @returns series - */ - cumprod() { - let data = this.__cum_ops("prod"); - return data; - } - - - /** - * Returns Less than of series and other. Supports element wise operations - * @param {other} Series, Scalar - * @return {Series} - */ - lt(other) { - return this.__bool_ops(other, "lt"); - } - - /** - * Returns Greater than of series and other. Supports element wise operations - * @param {other} Series, Scalar - * @return {Series} - */ - gt(other) { - return this.__bool_ops(other, "gt"); - } - - /** - * Returns Less than or Equal to of series and other. Supports element wise operations - * @param {other} Series, Scalar - * @return {Series} - */ - le(other) { - return this.__bool_ops(other, "le"); - } - - /** - * Returns Greater than or Equal to of series and other. Supports element wise operations - * @param {other} Series, Scalar - * @return {Series} - */ - ge(other) { - return this.__bool_ops(other, "ge"); - } - - /** - * Returns Not Equal to of series and other. Supports element wise operations - * @param {other} Series, Scalar - * @return {Series} - */ - ne(other) { - return this.__bool_ops(other, "ne"); - } - - - /** - * Returns Equal to of series and other. Supports element wise operations - * @param {other} Series, Scalar - * @return {Series} - */ - eq(other) { - return this.__bool_ops(other, "eq"); - } - - /** - * Replace all occurence of a value with a new value" - * @param {kwargs}, {"replace": the value you want to replace, - * "with": the new value you want to replace the olde value with, - * inplace: Perform operation inplace or not} - * @return {Series} - */ - replace(kwargs = {}) { - let params_needed = [ "replace", "with", "inplace" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - kwargs['inplace'] = kwargs['inplace'] || false; - - if (!("replace" in kwargs)) { - throw Error("Params Error: Must specify param 'replace'"); - } - - if (!("with" in kwargs)) { - throw Error("Params Error: Must specify param 'with'"); - } - - let replaced_arr = []; - let old_arr = this.values; - - old_arr.forEach((val) => { - if (val == kwargs['replace']) { - replaced_arr.push(kwargs['with']); - } else { - replaced_arr.push(val); - } - }); - - if (kwargs['inplace']) { - this.data = replaced_arr; - } else { - let sf = new Series(replaced_arr, { - index: this.index, - columns: this.columns, - dtypes: this.dtypes - }); - return sf; - } - - } - - - /** - * Return a new Series with missing values (NaN) removed. - * @param {kwargs} {inplace: Perform operation inplace or not} - * @return {Series} - */ - dropna(kwargs = {}) { - let params_needed = [ "inplace" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - kwargs['inplace'] = kwargs['inplace'] || false; - - let old_values = this.values; - let old_index = this.index; - let new_values = []; - let new_index = []; - let isna_vals = this.isna().values; - - isna_vals.forEach((val, i) => { - if (!val) { - new_values.push(old_values[i]); - new_index.push(old_index[i]); - } - }); - if (kwargs['inplace']) { - this.index_arr = new_index; - this.data = new_values; - } else { - let sf = new Series(new_values, { - columns: this.column_names, - index: new_index, - dtypes: this.dtypes - }); - return sf; - } - - } - - /** - * Return the integer indices that would sort the Series. - * @param {ascending} boolean true: will sort the Series in ascending order, false: will sort in descending order - * @return {Series} - */ - argsort(ascending = true) { - let sorted_index = this.sort_values({ ascending: ascending }).index; - let sf = new Series(sorted_index); - return sf; - } - - /** - * Return int position of the largest value in the Series. - * @return {Number} - */ - argmax() { - return this.row_data_tensor.argMax().arraySync(); - } - - - /** - * Return int position of the smallest value in the Series. - * @param {ascending} boolean true: will sort the Series in ascending order, false: will sort in descending order - * @return {Series} - */ - argmin() { - return this.row_data_tensor.argMin().arraySync(); - - } - - - /** - * Returns dtype of Series - * @return {string} - */ - get dtype() { - return this.dtypes[0]; - } - - /** - * Return Series with duplicate values removed - * @param {kwargs} {inplace: Perform operation inplace or not, - * keep: first | last which dupliate value to keep} - * @return {Series} - */ - drop_duplicates(kwargs = {}) { - let params_needed = [ "inplace", "keep" ]; - utils._throw_wrong_params_error(kwargs, params_needed); - - kwargs['inplace'] = kwargs['inplace'] || false; - kwargs['keep'] = kwargs['keep'] || "first"; - - - let data_arr, old_index; - if (kwargs['keep'] == "last") { - data_arr = this.values.reverse(); - old_index = this.index.reverse(); - } else { - data_arr = this.values; - old_index = this.index; - } - - let new_index = []; - let new_arr = []; - - data_arr.forEach((val, i) => { - if (!new_arr.includes(val)) { - new_index.push(old_index[i]); - new_arr.push(val); - } - }); - - if (kwargs['keep'] == "last") { - //re-reversed the array and index to its true ordering - new_arr = new_arr.reverse(); - new_index = new_index.reverse(); - } - - if (kwargs['inplace']) { - this.data = new_arr; - this.index_arr = new_index; - } else { - let sf = new Series(new_arr, { - index: new_index, - columns: this.column_names, - dtypes: this.dtypes - }); - return sf; - } - - } - - - /** - * Prints the data in a Series as a grid of row and columns - */ - toString() { - let table_width = 20; - let table_truncate = 20; - let max_row = config.get_max_row; - let data_arr = []; - let table_config = {}; - let header = [ "" ].concat(this.columns); - let idx, data; - - if (this.values.length > max_row) { - //slice Object to show a max of [max_rows] - data = this.values.slice(0, max_row); - idx = this.index.slice(0, max_row); - } else { - data = this.values; - idx = this.index; - } - - idx.forEach((val, i) => { - let row = [ val ].concat(data[i]); - data_arr.push(row); - }); - - //set column width of all columns - table_config[0] = 10; - table_config[1] = { width: table_width, truncate: table_truncate }; - - let table_data = [ header ].concat(data_arr); //Add the column names to values before printing - return table(table_data, { columns: table_config }); - } - - /** - * Perform boolean operations on bool values - * @param {*} other Other series to compare with - * @param {string} b_ops name of operation to perform [ne, ge, le, gt, lt, eq] - */ - __bool_ops(other, b_ops) { - let r_series; - let l_series = this.values; - - if (typeof other == "number") { - r_series = [ ...l_series ].fill(other); //create array of repeated value for broadcasting - } else { - if (!(other instanceof Series)) { - throw new Error("Value Error: 'other' must be an instance of Series"); - } - r_series = other.values; - } - - if (!(l_series.length === r_series.length)) { - throw new Error("Length Error: Both series must be of the same length"); - } - - let data = []; - - for (let i = 0; i < l_series.length; i++) { - - let l_val = l_series[i]; - let r_val = r_series[i]; - let bool = null; - switch (b_ops) { - - case "lt": - bool = l_val < r_val ? true : false; - data.push(bool); - break; - case "gt": - bool = l_val > r_val ? true : false; - data.push(bool); - break; - case "le": - bool = l_val <= r_val ? true : false; - data.push(bool); - break; - case "ge": - bool = l_val >= r_val ? true : false; - data.push(bool); - break; - case "ne": - bool = l_val != r_val ? true : false; - data.push(bool); - break; - case "eq": - bool = l_val === r_val ? true : false; - data.push(bool); - break; - } - } - return new Series(data); - - } - - /** - * perform cumulative operation on series data - * @returns array - */ - __cum_ops(ops) { - - let s_data = this.values; - let temp_val = s_data[0]; - let data = [ temp_val ]; - - for (let i = 1; i < s_data.length; i++) { - - let curr_val = s_data[i]; - switch (ops) { - case "max": - if (curr_val > temp_val) { - data.push(curr_val); - temp_val = curr_val; - } else { - data.push(temp_val); - } - break; - case "min": - if (curr_val < temp_val) { - data.push(curr_val); - temp_val = curr_val; - } else { - data.push(temp_val); - } - break; - case "sum": - temp_val = temp_val + curr_val; - data.push(temp_val); - break; - case "prod": - temp_val = temp_val * curr_val; - data.push(temp_val); - break; - - } - } - return new Series(data); - } - - - /** - * Cast Series to specified data type - * @param {string} dtype data type to cast to [float32, int32, string, boolean] - *@returns {Series} - */ - astype(dtype) { - const __supported_dtypes = [ 'float32', "int32", 'string', 'boolean' ]; - - if (!dtype) { - throw Error("Value Error: Please specify dtype to cast to"); - } - - if (!__supported_dtypes.includes(dtype)) { - throw Error(`dtype ${dtype} not supported. dtype must be one of ${__supported_dtypes}`); - } - - let col_values = this.values; - let new_values = []; - - switch (dtype) { - case "float32": - col_values.forEach((val) => { - new_values.push(Number(val)); - }); - break; - case "int32": - col_values.forEach((val) => { - new_values.push(Number(Number(val).toFixed())); - }); - break; - case "string": - col_values.forEach((val) => { - new_values.push(String(val)); - }); - break; - case "boolean": - col_values.forEach((val) => { - new_values.push(Boolean(val)); - }); - break; - default: - break; - } - - let sf = new Series(new_values, { dtypes: dtype, index: this.index }); - return sf; - - } - - - /** - * Exposes numerous string methods to manipulate Series - */ - get str() { - let values = this.values; - if (this.dtypes[0] != "string") { - let new_vals = []; - //convert each value in array to string - values.forEach((val) => { - new_vals.push(String(val)); - }); - let sf = new Series(new_vals, { columns: this.column_names, index: this.index }); - return new Str(sf); - } - return new Str(this); - - } - - /** - * Returns Danfo Time Object that exposes different time properties - */ - get dt() { - let timeseries = new TimeSeries({ data: this }); // parsed to date-time - timeseries.preprocessed(); - return timeseries; - - } - - /** - * Displays the data in a console friendly manner - */ - print() { - console.log(this + ""); - } - - - /** - * Make plots of Series or DataFrame. - * Uses the Plotly as backend, so therefore supports Plotly's configuration parameters - * @param {string} div Name of the div to show the plot - * @returns {Class} Plot class that expoese different plot type - */ - plot(div) { - const plt = new Plot(this, div); - return plt; - } - - /** - * Slice series by index - * @param {Array} row list of index to slice by - * @returns Series - */ - iloc(row) { - let kwargs = {}; - kwargs["rows"] = row; - kwargs["type"] = "iloc"; - - let [ new_data, columns, rows ] = indexLoc(this, kwargs); - let sf = new Series(new_data, { columns: columns, index: rows }); - - return sf; - } - - /** - * Adds new values to the end of a Series - * @param {Object} val Single value | Array | Series to append to the object - * @param {Boolean} inplace Whether to perform operation inplace or not - */ - append(val, inplace = false) { - if (inplace) { - let self = this; - if (Array.isArray(val)) { - val.forEach((el, i) => { - self.data.push(el); - self.index_arr.push(i); - }); - } else if (val instanceof Series) { - let value = val.values; - let old_index = val.index; - value.forEach((el, i) => { - self.data.push(el); - self.index_arr.push(old_index[i]); - }); - } else { - self.data.push(val); - self.index_arr.push(0); - } - } else { - let sf = this.copy(); - if (Array.isArray(val)) { - val.forEach((el, i) => { - sf.data.push(el); - sf.index_arr.push(i); - }); - } else if (val instanceof Series) { - let value = val.values; - let old_index = val.index; - value.forEach((el, i) => { - sf.data.push(el); - sf.index_arr.push(old_index[i]); - }); - } else { - sf.data.push(val); - sf.index_arr.push(0); - } - return sf; - } - - } - -} - diff --git a/src/lib/danfo/core/strings.js b/src/lib/danfo/core/strings.js deleted file mode 100644 index fc25e44..0000000 --- a/src/lib/danfo/core/strings.js +++ /dev/null @@ -1,336 +0,0 @@ -import { Series } from "./series"; - -/** - * String methods applied on Series and DataFrames - */ -export class Str { - constructor(series) { - this.series = series; - this.array = series.values; - } - - /** - * Converts all characters to lowercase. - * @return {array} - */ - toLowerCase() { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.toLowerCase()); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Converts all characters to uppercase. - * @return {array} - */ - toUpperCase() { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.toUpperCase()); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Capitalize first string - * @return {array} - */ - capitalize() { - let new_arr = []; - this.array.map((val) => { - let f_char = val.slice(0, 1); - let l_char = val.slice(1); - let new_str = `${f_char.toUpperCase()}${l_char.toLowerCase()}`; - new_arr.push(new_str); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - - } - - /** - * Returns the character at the specified index (position) - * @params {index} index position of character - * @return {array} - */ - charAt(index = 0) { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.charAt(index)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Joins two or more strings/arrays. 0 joins from the start - * @params {other} string|array to concatenate with. - * @params {position} where to concat the string from. O concats from the start, 1 concats from the end - * @params {isArray} whether operation is performed on Array or not - * @return {array} - */ - concat(other = "", position = 1) { - if (Array.isArray(other)) { - let final_arr = []; - for (let i = 0; i < other.length; i++) { - let l_str = this.array[i]; - let r_str = other[i]; - if (position == 1) { - final_arr.push(l_str.concat(r_str)); - } else { - final_arr.push(r_str.concat(l_str)); - } - - } - let sf = this.__create_new_sf_from(final_arr, this.series); - return sf; - } else { - - let new_arr = []; - - this.array.map((val) => { - if (position == 1) { - new_arr.push(val.concat(other)); - - } else { - new_arr.push(other.concat(val)); - } - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - } - - - /** - * Checks whether a string begins with specified characters - * @params {String | Character} String or Character to check against - * @return {array} - */ - startsWith(str = "") { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.startsWith(str)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Checks whether a string ends with specified characters - * @params {String | Character} String or Character to check against - * @return {array} - */ - endsWith(str = "") { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.endsWith(str)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Checks whether a string contains the specified string/characters - * @params {String | Character} String or Character to check against - * @return {array} - */ - includes(str = "") { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.includes(str)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Returns the position of the first found occurrence of a specified value in a string - * @params {String | Character} String or Character to check against - * @return {array} - */ - indexOf(str = "") { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.indexOf(str)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Returns the position of the last found occurrence of a specified value in a string - * @params {str: String | Character} String or Character to check against - * @return {array} - */ - lastIndexOf(str = "") { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.lastIndexOf(str)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - - /** - * Searches a string for a specified value, or a regular expression, and returns a new string where the specified values are replaced - * @params {searchValue: String | Character} string value to replace - * @params {replaceValue: String | Character} string to replace with - * @return {array} - */ - replace(searchValue = "", replaceValue = "") { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.replace(searchValue, replaceValue)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Returns a new string with a specified number of copies of an existing string - * @params {num: Integer} Number of times to repeat - * @return {array} - */ - repeat(num = 1) { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.repeat(num)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - - /** - * Searches a string for a specified value, or regular expression, and returns the position of the match - * @params {str: String | Character} String or Character to check against - * @return {array} - */ - search(str = "") { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.search(str)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Extracts a part of a string and returns a new string - * @params {startIndex: Int} index position of start character - * @params {endIndex: Int} index position of last character - * @return {array} - */ - slice(startIndex = 0, endIndex = 1) { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.slice(startIndex, endIndex)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Splits a string into an array of substrings - * @params {val: string} string or character to split at - * @params {endIndex: Int} index position of last character - * @return {array} - */ - split(splitVal = " ") { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.split(splitVal)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Extracts the characters from a string, beginning at a specified start position, and through the specified number of character - * @params {startIndex: Int} index position of start character - * @params {num: Int} number of characters to return - * @return {array} - */ - substr(startIndex = 0, num = 1) { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.substr(startIndex, num)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Extracts the characters from a string, between two specified indices - * @params {startIndex: Int} index position of start character - * @params {endIndex: Int} index position of last character - * @return {array} - */ - substring(startIndex = 0, endIndex = 1) { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.substring(startIndex, endIndex)); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Removes whitespace from both ends of a string - * @return {array} - */ - trim() { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.trim()); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Joins strings to specified value - * @params {valToJoin} string value to join to the array - * @params {joinChar} Character to Join with - * @return {array} - */ - join(valToJoin = "", joinChar = " ") { - let new_arr = []; - this.array.map((val) => { - let l_char = val; - let r_char = valToJoin; - let new_char = `${l_char}${joinChar}${r_char}`; - new_arr.push(new_char); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - /** - * Counts the number of characters in string - * @return {array} - */ - len() { - let new_arr = []; - this.array.map((val) => { - new_arr.push(val.length); - }); - let sf = this.__create_new_sf_from(new_arr, this.series); - return sf; - } - - //create a new series - __create_new_sf_from(new_val, series) { - let sf = new Series(new_val, { columns: series.column_names, index: series.index }); - return sf; - } - - -} diff --git a/src/lib/danfo/core/timeseries.js b/src/lib/danfo/core/timeseries.js deleted file mode 100644 index 1d8af67..0000000 --- a/src/lib/danfo/core/timeseries.js +++ /dev/null @@ -1,305 +0,0 @@ -import { Utils } from "./utils"; -import { Series } from "./series"; -const utils = new Utils; - - -/** - * @class - * @description Handle all datetime operations - * @param {kwargs} Object {"data":[array of string], "format": string} - */ -export class TimeSeries { - constructor(kwargs) { - - utils.__in_object(kwargs, "data", "specify the data"); - - if (kwargs["data"] instanceof Series) { - this.data = kwargs["data"].values; - } else { - this.data = kwargs["data"]; - } - - this.format = kwargs["format"] || null; - - this.keys = { //key: len - "Y": 4, - "m": 2, - "H": 2, - "M": 2, - "S": 2, - "b": 3, - "d": 2, - "-": 1 - }; - - this.__in_format = [ "%Y-m-d%", "%m-d-Y%", "%m-d-Y H%M%S%" ]; - - this.__monthName = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; - this.__weekName = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]; - - } - - /** - * @description preprocessed the data into desirable structure - */ - preprocessed() { - - let format_values = null; - if (this.format) { - format_values = this.generate_format(); - } - - this.date_list = []; - - for (let i = 0; i < this.data.length; i++) { - - let date_string = this.data[i]; - - if (this.format && !this.__in_format.includes(this.format)) { - - let format_dateString = this.__apply_format(date_string, format_values); - let valueDate = new Date(format_dateString); - - this.__is_validDate(valueDate); - - this.date_list.push(valueDate); - - } else if (this.is_timestamp(date_string)) { - - let string2int = parseInt(date_string); - let valueDate = new Date(string2int); - - this.__is_validDate(valueDate); - this.date_list.push(valueDate); - } else { - let valueDate = new Date(date_string); - - this.__is_validDate(valueDate); - this.date_list.push(valueDate); - } - } - - // return this.date_list; - - } - - /** - * @description if format is given, apply the format on each element of the data - * @return string - */ - __apply_format(elem, format) { - - let date_string = ""; - - let temp_val = 0; - - - for (let index in format) { - - let value = format[index]; - - if (index == 0) { - date_string += elem.slice(0, value); - - } else if (index > 4) { - - date_string += ":" + elem.slice(temp_val, temp_val + value); - } else if (index == 4) { - date_string += " " + elem.slice(temp_val, temp_val + value); - } else if (index > 0 && index <= 2) { - date_string += "-" + elem.slice(temp_val, temp_val + value); - } - - temp_val += value; - } - - return date_string; - - } - /** - * @description convert format string to their respective value. - */ - generate_format() { - - let format_list = this.format.split(""); - - let self = this; - let format_keys = format_list.filter(function (key) { - return utils.__key_in_object(self.keys, key); - }); - - let format_value = format_keys.map(function (val) { - return self.keys[val]; - }); - - - return format_value; - } - - /** - * @description check if a string is a timestamp - * @param {date_string} date_string [string] - */ - is_timestamp(date_string) { - - let string2int = parseInt(date_string); - let int2string = String(string2int); - - if (isNaN(string2int) || (int2string.length < date_string.length)) { - return false; - } else { - return true; - } - } - - /** - * @description check if a date instance returns Invalid date - * @param {date_instance} instance of new Date() - */ - __is_validDate(date_instance) { - - if (date_instance.toDateString() == "Invalid Date") { - throw new Error("Invalid date, the date format not recognise"); - } - } - - /** - * @description abstract all date operations - * @param {*} callback [FUNCTION] - * @return series - */ - __date_ops(callback) { - - let data = this.date_list.map(function (date_instance) { - - return callback(date_instance); - }); - - // eslint-disable-next-line no-self-assign - let series = new Series(data = data); - - return series; - } - - /** - * @description obtain the month in a date. - * @return Series - */ - month() { - - let series = this.__date_ops(function (date_instance) { - return date_instance.getMonth(); - }); - - return series; - } - - /** - * @return Series - */ - hour() { - let series = this.__date_ops(function (date_instance) { - return date_instance.getHours(); - }); - - return series; - } - - /** - * @return Series - */ - day() { - let series = this.__date_ops(function (date_instance) { - return date_instance.getDay(); - }); - - return series; - } - - /** - * @description generate year frome date instance - * @return Series - */ - year() { - - let series = this.__date_ops(function (date_instance) { - return date_instance.getFullYear(); - }); - - return series; - } - - /** - * @description generate month name - * @return Series - */ - month_name() { - - let self = this; - let series = this.__date_ops(function (date_instance) { - return self.__monthName[date_instance.getMonth()]; - }); - - return series; - } - - /** - * @description generate days of the week - * @return Series - */ - weekdays() { - let self = this; - let series = this.__date_ops(function (date_instance) { - return self.__weekName[date_instance.getDay()]; - }); - - return series; - } - - /** - * @description day of the month - * @return Series - */ - monthday() { - let series = this.__date_ops(function (date_instance) { - return date_instance.getDate(); - }); - - return series; - } - - /** - * @description obtain the seconds in a date - * @return Series - */ - seconds() { - let series = this.__date_ops(function (date_instance) { - return date_instance.getSeconds(); - }); - - return series; - } - - /** - * @description obtain the minutes in a date - * @return Series - */ - minutes() { - let series = this.__date_ops(function (date_instance) { - return date_instance.getMinutes(); - }); - - return series; - } - -} - - -export const to_datetime = (kwargs) => { - - let timeseries = new TimeSeries(kwargs); // parsed to date-time - timeseries.preprocessed(); // generate date-time list - - return timeseries; - -}; diff --git a/src/lib/danfo/core/utils.js b/src/lib/danfo/core/utils.js deleted file mode 100644 index bdfd3b6..0000000 --- a/src/lib/danfo/core/utils.js +++ /dev/null @@ -1,673 +0,0 @@ -import { tensor, linspace } from "@tensorflow/tfjs"; -import { Configs } from "../config/config"; - -const config = new Configs(); - -export class Utils { - //remove an element from an array - remove(arr, index) { - let new_arr = arr.filter(function (val, i) { - return i != index; - }); - - return new_arr; - } - - //filter element present in an aray - __remove_arr(arr, index) { - let new_arr = arr.filter(function (val, i) { - return !index.includes(i); - }); - - return new_arr; - } - - // Returns if a value is a string - __is_string(value) { - return typeof value === "string" || value instanceof String; - } - - // Returns if a value is really a number - __is_number(value) { - return typeof value === "number" && isFinite(value); - } - - // Returns if a value is an object - __is_object(value) { - return value && typeof value === "object" && value.constructor === Object; - } - - // Returns if a value is null - __is_null(value) { - return value === null; - } - - // Returns if a value is undefined - __is_undefined(value) { - return typeof value === "undefined"; - } - - /** - * Optimized version of random sampling from an array, as implemented in Python - * - * - Chooses k unique random elements from a population sequence or set. - - Returns a new list containing elements from the population while - leaving the original population unchanged. The resulting list is - in selection order so that all sub-slices will also be valid random - samples. This allows raffle winners (the sample) to be partitioned - into grand prize and second place winners (the subslices). - - Members of the population need not be hashable or unique. If the - population contains repeats, then each occurrence is a possible - selection in the sample. - - To choose a sample in a range of integers, use range as an argument. - This is especially fast and space efficient for sampling from a - large population: sample(range(10000000), 60) - - Sampling without replacement entails tracking either potential - selections (the array) in a list or previous selections in a set. - - When the number of selections is small compared to the - population, then tracking selections is efficient, requiring - only a small set and an occasional reselection. For - a larger number of selections, the array tracking method is - preferred since the list takes less space than the - set and it doesn't suffer from frequent reselections. - * - * @param {*} array The array to sample values from randomly - * @param {*} num The number of elements to sample randomly - */ - // Chooses k unique random elements from array. - __sample_from_iter(array, k, destructive) { - var n = array.length; - - if (k < 0 || k > n) - throw new RangeError("Sample larger than population or is negative"); - - if ( - destructive || - n <= (k <= 5 ? 21 : 21 + Math.pow(4, Math.ceil(Math.log(k * 3, 4)))) - ) { - if (!destructive) array = Array.prototype.slice.call(array); - for (var i = 0; i < k; i++) { - // invariant: non-selected at [i,n) - var j = (i + Math.random() * (n - i)) | 0; - var x = array[i]; - array[i] = array[j]; - array[j] = x; - } - array.length = k; // truncate - return array; - } else { - var selected = new Set(); - // eslint-disable-next-line no-empty - while (selected.add((Math.random() * n) | 0).size < k) {} - // eslint-disable-next-line no-undef - return Array.prototype.map.call(selected, (i) => population[i]); - } - } - - //generate integers between two set of numbers - __range(start, end) { - let value = linspace(start, end, end - start + 1).arraySync(); - return value; - } - - //check if key is in object - __key_in_object(object, key) { - if (Object.prototype.hasOwnProperty.call(object, key)) { - return true; - } else { - return false; - } - } - - //transpose row array into column wise array - __get_col_values(data) { - let row_len = data.length; - let cols_len = data[0].length; - var cols_arr = []; - for (var i = 0; i <= cols_len - 1; i++) { - let temp_col = []; - for (let j = 0; j < row_len; j++) { - temp_col.push(data[j][i]); - } - cols_arr.push(temp_col); - } - return cols_arr; - } - - /** - * retrieve row array and column names from object of the form {a: [1,2,3,4], b: [30,20, 30, 20}] - * @param {*} data - */ - _get_row_and_col_values(data) { - let col_names = Object.keys(data); - let col_data = Object.values(data); - let first_col_len = col_data[0].length; - - col_data.forEach((data) => { - if (data.length != first_col_len) { - throw Error("Length Error: Length of columns must be the same!"); - } - }); - let rows_len = col_data[0].length; - let cols_len = col_names.length; - var rows_arr = []; - - for (var i = 0; i <= rows_len - 1; i++) { - var temp_row = []; - for (let j = 0; j < cols_len; j++) { - let _arr = col_data[j]; - temp_row.push(_arr[i]); - } - rows_arr.push(temp_row); - } - return [ rows_arr, col_names ]; - } - - //converts a 2D array of array to 1D for Series Class - __convert_2D_to_1D(data) { - let new_data = []; - data.map((val) => { - if (this.__is_object(val)) { - new_data.push(JSON.stringify(val)); - } else { - new_data.push(`${val}`); - } - }); - return new_data; - } - - __replace_undefined_with_NaN(data, isSeries) { - if (isSeries) { - let temp_arr = []; - data.forEach((val) => { - if (typeof val === "undefined" || val == Infinity || val == null) { - temp_arr.push(NaN); - } else { - temp_arr.push(val); - } - }); - return temp_arr; - } else { - let full_arr = []; - data.forEach((val) => { - var temp_arr = []; - val.forEach((ele) => { - if (typeof ele === "undefined" || ele == Infinity || ele == null) { - temp_arr.push(NaN); - } else { - temp_arr.push(ele); - } - }); - full_arr.push(temp_arr); - }); - return full_arr; - } - } - - __checker(arr_val){ - let dtypes = []; - let lim; - let int_tracker = []; - let float_tracker = []; - let string_tracker = []; - let bool_tracker = []; - - if (arr_val.length == 0){ - dtypes.push("string"); - } - - if (arr_val.length < config.get_dtype_test_lim) { - lim = arr_val.length - 1; - } else { - lim = config.get_dtype_test_lim - 1; - } - arr_val.forEach((ele, indx) => { - let count = indx; - if (typeof ele == "boolean") { - float_tracker.push(false); - int_tracker.push(false); - string_tracker.push(false); - bool_tracker.push(true); - } else if (isNaN(ele) && typeof ele != "string"){ - float_tracker.push(true); - int_tracker.push(false); - string_tracker.push(false); - bool_tracker.push(false); - } else if (!isNaN(Number(ele))) { - if (ele.toString().includes(".")) { - float_tracker.push(true); - int_tracker.push(false); - string_tracker.push(false); - bool_tracker.push(false); - } else { - float_tracker.push(false); - int_tracker.push(true); - string_tracker.push(false); - bool_tracker.push(false); - } - } else { - float_tracker.push(false); - int_tracker.push(false); - string_tracker.push(true); - bool_tracker.push(false); - } - - if (count == lim) { - //if atleast one string appears return string dtype - const even = (element) => element == true; - if (string_tracker.some(even)) { - dtypes = "string"; - } else if (float_tracker.some(even)) { - dtypes = "float32"; - } else if (int_tracker.some(even)) { - dtypes = "int32"; - } else if (bool_tracker.some(even)) { - dtypes = "boolean"; - } else { - dtypes = "undefined"; - } - } - }); - - return dtypes; - } - //infer types from an array of array - __get_t(arr_val) { - const self = this; - if (this.__is_1D_array(arr_val)) { - return [ this.__checker(arr_val) ]; - } else { - const dtypes = arr_val.map((arr) => { - return self.__checker(arr); - }); - return dtypes; - } - } - - - __unique(data) { - let unique = new Set(); - - data.map(function (val) { - unique.add(val[0]); - }); - - let unique_array = Array.from(unique); - - return unique_array; - } - - //second version of In object - __in_object(object, key, message) { - if (!Object.prototype.hasOwnProperty.call(object, key)) { - throw new Error(message); - } - } - - //check if a array is 1D - __is_1D_array(arr) { - if ( - typeof arr[0] == "number" || - typeof arr[0] == "string" || - typeof arr[0] == "boolean" - ) { - return true; - } else { - return false; - } - } - - //converts an array to object with index as value - __arr_to_obj(arr) { - let arr_map = {}; - arr.forEach((ele, i) => { - arr_map[ele] = i; - }); - return arr_map; - } - - /** - * count the NaN and non-NaN values present in an array - * @param {Array} arr Array object - * @param {Boolean} val whether to return the value count instead of the null count - * @param {Boolean} isSeries Whether the Obj is of type series or not - */ - __count_nan(arr, return_val = true, isSeries) { - if (isSeries) { - let null_count = 0; - let val_count = 0; - arr.forEach((ele) => { - if (Number.isNaN(ele)) { - null_count = null_count + 1; - } else { - val_count = val_count + 1; - } - }); - if (return_val) { - return val_count; - } else { - return null_count; - } - } else { - let result_arr = []; - arr.forEach((ele_arr) => { - let null_count = 0; - let val_count = 0; - ele_arr.forEach((ele) => { - if (Number.isNaN(ele)) { - null_count = null_count + 1; - } else { - val_count = val_count + 1; - } - }); - if (return_val) { - result_arr.push(val_count); - } else { - result_arr.push(null_count); - } - }); - return result_arr; - } - } - - //computes the median of an array - __median(arr, isSeries) { - if (isSeries) { - const sorted = arr.slice().sort((a, b) => a - b); - const middle = Math.floor(sorted.length / 2); - - if (sorted.length % 2 === 0) { - return (sorted[middle - 1] + sorted[middle]) / 2; - } - - return sorted[middle]; - } else { - let result_arr = []; - arr.map((ele) => { - const sorted = ele.slice().sort((a, b) => a - b); - const middle = Math.floor(sorted.length / 2); - - if (sorted.length % 2 === 0) { - result_arr.push((sorted[middle - 1] + sorted[middle]) / 2); - } else { - result_arr.push(sorted[middle]); - } - }); - return result_arr; - } - } - - //computes the mode(s) of an array - __mode(arr) { - var modes = [], - count = [], - i, - maxIndex = 0; - - arr.forEach((val) => { - count[val] = (count[val] || 0) + 1; - if (count[val] > maxIndex) { - maxIndex = count[val]; - } - }); - - for (i in count) - if (this.__key_in_object(count, i)) { - if (count[i] === maxIndex) { - modes.push(Number(i)); - } - } - - return modes; - } - - //round elements of an array to ndp - __round(arr, dp = 2, isSeries) { - if (dp < 0) { - dp = 1; - } - if (isSeries) { - let new_arr = []; - arr.map((val) => { - new_arr.push(Number(val.toFixed(dp))); - }); - - return new_arr; - } else { - let result_arr = []; - arr.map((arr_ele) => { - let new_arr = []; - arr_ele.map((val) => { - new_arr.push(Number(val.toFixed(dp))); - }); - result_arr.push(new_arr); - }); - return result_arr; - } - } - - //check a variable is a function - __is_function(variable) { - return typeof variable == "function"; - } - - //generate a random list - __randgen(num, start, end) { - let gen_num = []; - - //random int - function randi(a, b) { - return Math.floor(Math.random() * (b - a) + a); - } - - function recursive(val, arr) { - if (!arr.includes(val)) { - return val; - } - - val = randi(start, end); - - recursive(val, arr); - } - - for (let i = 0; i < num; i++) { - let gen_val = randi(start, end); - let recur_val = recursive(gen_val, gen_num); - gen_num.push(recur_val); - } - - return gen_num; - } - - _throw_wrong_params_error(kwargs, params_needed) { - let keys = Object.keys(kwargs); - let bool = []; - for (let i = 0; i < keys.length; i++) { - if (params_needed.includes(keys[i])) { - bool.push(true); - } else { - bool.push(false); - } - } - const truthy = (element) => element == false; - if (bool.some(truthy)) { - throw Error( - `Params Error: A specified parameter is not supported. Your params must be any of the following [${params_needed}]` - ); - } - } - - //maps int values (0, 1) to bools (false, true) - __map_int_to_bool(arr, dim) { - let new_arr = []; - if (dim == 2) { - arr.map((outer_val) => { - let temp_arr = []; - outer_val.map((val) => { - if (val == 1) { - temp_arr.push(true); - } else { - temp_arr.push(false); - } - }); - new_arr.push(temp_arr); - }); - return new_arr; - } else { - arr.map((val) => { - if (val == 1) { - new_arr.push(true); - } else { - new_arr.push(false); - } - }); - return new_arr; - } - } - - __std(data) { - let tensor_data = data; - - let mean = tensor_data.mean(); - let sub_mean_pow = tensor_data.sub(mean).pow(2); - let mean_data = sub_mean_pow.mean(); - let std = mean_data.sqrt(); - - return std; - } - - __zeros(row, column) { - let zero_data = []; - - for (let i = 0; i < row; i++) { - let col_data = Array(column); - for (let j = 0; j < column; j++) { - col_data[j] = 0; - } - zero_data.push(col_data); - } - return zero_data; - } - - __shuffle(num, array) { - //https://stackoverflow.com/questions/18806210/generating-non-repeating-random-numbers-in-js/18806417 - var j, - temp; - - for (let i = 0; i < num; i++) { - j = Math.floor(Math.random() * (array.length - i)) + i; - - // swap randomly chosen element with current element - temp = array[i]; - array[i] = array[j]; - array[j] = temp; - } - - return array.slice(0, num); - } - - __sort(arr, ascending = true) { - let sorted = arr.slice(); - return sorted.sort((a, b) => { - if (ascending) { - if (typeof a === "string" && typeof b === "string") { - return a.charCodeAt() - b.charCodeAt(); - } else { - return a - b; - } - } else { - if (typeof a === "string" && typeof b === "string") { - return b.charCodeAt() - a.charCodeAt(); - } else { - return b - a; - } - } - }); - } - - __is_browser_env() { - var isBrowser = new Function( - "try {return this===window;}catch(e){ return false;}" - ); - // tests if global scope is binded to window - return isBrowser(); - } - - __is_node_env() { - var isNode = new Function( - "try {return this===global;}catch(e){return false;}" - ); - // tests if global scope is binded to window - return isNode(); - } - - _throw_str_dtype_error(obj, ops) { - if (obj.dtypes[0] == "string") { - throw Error( - `dtype error: String data type does not support ${ops} operation` - ); - } - } - - /** - * Remove NaN values from Array - * @param {*} arr - */ - _remove_nans(arr) { - let values = arr.filter((val) => !isNaN(val) && typeof val != "string"); - return values; - } - - __get_duplicate(arr) { - let temp_obj = {}; - let rslt_obj = {}; - - arr.forEach((val, index) => { - if (val in temp_obj) { - temp_obj[val]["count"] += 1; - temp_obj[val]["index"].push(index); - } else { - temp_obj[val] = {}; - temp_obj[val]["count"] = 1; - temp_obj[val]["index"] = [ index ]; - } - }); - - for (let key in temp_obj) { - if (temp_obj[key]["count"] >= 2) { - rslt_obj[key] = {}; - rslt_obj[key]["count"] = temp_obj[key]["count"]; - rslt_obj[key]["index"] = temp_obj[key]["index"]; - } - } - - return rslt_obj; - } - - /** - * Sorts an array by index - * @param {Array} arr1 - * @param {Array} arr2 - * @param {string} dtype - * - * @returns sorted index - */ - _sort_arr_with_index(arr1, arr2, dtype) { - let sorted_idx = arr1.map((item, index) => { - return [ arr2[index], item ]; - }); - if (dtype == "string") { - sorted_idx.sort(); - } else { - sorted_idx.sort(([ arg1 ], [ arg2 ]) => arg2 - arg1); - } - - return sorted_idx.map(([ , item ]) => item); - } -} diff --git a/src/lib/danfo/index.js b/src/lib/danfo/index.js deleted file mode 100644 index b565502..0000000 --- a/src/lib/danfo/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import NDframe from "./core/generic"; - -export { Series } from "./core/series"; -export { DataFrame } from "./core/frame"; -export { to_datetime } from "./core/timeseries"; -export { read_csv, read_json, read_excel } from "./io/reader"; -export { merge } from "./core/merge"; -export { concat } from "./core/concat"; -export { LabelEncoder, OneHotEncoder } from "./preprocessing/encodings"; -export { MinMaxScaler, StandardScaler } from "./preprocessing/scalers"; -export { date_range } from "./core/date_range"; -export { get_dummies } from "./core/get_dummies"; -export { Configs } from "./config/config"; -export { NDframe }; -export { Str } from "./core/strings"; -export { Utils } from "./core/utils"; - -export const _version = "0.2.5"; diff --git a/src/lib/danfo/io/reader.js b/src/lib/danfo/io/reader.js deleted file mode 100644 index e9e8c88..0000000 --- a/src/lib/danfo/io/reader.js +++ /dev/null @@ -1,116 +0,0 @@ -import { data } from "@tensorflow/tfjs"; -import XLSX from "xlsx"; -import { DataFrame } from "../core/frame"; - - -/** - * Reads a CSV file from local or remote storage - * @param {string} source URL to CSV file - * @param {object} config (Optional). A CSV Config object that contains configurations - * for reading and decoding from CSV file(s). - * { start: The index position to start from when reading the CSV file. - * - * end: The end position to stop at when reading the CSV file. - * - * ...csvConfigs: other supported Tensorflow csvConfig parameters. See https://js.tensorflow.org/api/latest/#data.csv - * } - * - * @returns {Promise} DataFrame structure of parsed CSV data - */ -export const read_csv = async (source, configs = {}) => { - let { start, end } = configs; - if (!(source.startsWith("https") || source.startsWith("http"))) { - throw new Error("Cannot read local file in browser environment"); - } - let tfdata = []; - await data.csv(source, configs) - .skip(start) - .take(end) - .forEachAsync((row) => { - return tfdata.push(row); - }); - const df = new DataFrame(tfdata); - return df; -}; - -/** - * Reads a JSON file from local or remote address - * @param {string} source URL or local file path to retreive JSON file. - * @returns {Promise} DataFrame structure of parsed CSV data - */ -export const read_json = async (source) => { - let res = await fetch(source, { method: "Get" }); - let json = await res.json(); - let df = new DataFrame(json); - return df; - -}; - -/** - * Reads an Excel file from local or remote address - * @param {string} source URL to Excel file - * @param {object} configs { - * - * sheet : string, (Optional) Name of the sheet which u want to parse. Default will be the first sheet. - * - * header_index : int, (Optional) Index of the row which represents the header(columns) of the data. Default will be the first non empty row. - * - * data_index : int, (Optional) Index of the row from which actual data(content) starts. Default will be the next row of `header_index`. - * - * } - * @returns {Promise} DataFrame structure of parsed Excel data - */ -export const read_excel = async (source, configs = {}) => { - let { sheet, header_index, data_index } = configs; - let workbook; - if (!header_index) { - //default header_index - header_index = 1; - } - if (!data_index) { - //default data_index - data_index = header_index + 1; - } - try { - let res = await fetch(source, { method: "Get" }); - res = await res.arrayBuffer(); - res = new Uint8Array(res); - workbook = XLSX.read(res, { type: "array" }); - - - // Parse worksheet from workbook - const worksheet = workbook.Sheets[sheet || workbook.SheetNames[0]]; - let range = XLSX.utils.decode_range(worksheet["!ref"]); - let column_names = [], - data = []; - for (let R = header_index - 1; R <= range.e.r; ++R) { - let row_data = []; - for (let C = range.s.c; C <= range.e.c; ++C) { - let cell_ref; - - //Populate column_names - if (R == header_index - 1) { - cell_ref = XLSX.utils.encode_cell({ c: C, r: header_index - 1 }); - if (worksheet[cell_ref]) { - column_names.push(worksheet[cell_ref].v); - } - } - - //Populate corresponding data row - if (R >= data_index - 1) { - cell_ref = XLSX.utils.encode_cell({ c: C, r: R }); - if (worksheet[cell_ref]) { - row_data.push(worksheet[cell_ref].v); - } - } - } - if (R >= data_index - 1) { - data.push(row_data); - } - } - let df = new DataFrame(data, { columns: column_names }); - return df; - } catch (err) { - throw new Error(err); - } -}; diff --git a/src/lib/danfo/plotting/plot.js b/src/lib/danfo/plotting/plot.js deleted file mode 100644 index aa5fc19..0000000 --- a/src/lib/danfo/plotting/plot.js +++ /dev/null @@ -1,866 +0,0 @@ -import { Utils } from "../core/utils"; -import { Series } from "../core/series"; -const utils = new Utils(); - -/** - * Change: Rising Odegua 6th Feb 2021 - * We no longer bundle Plotjs with DanfoJs. I noticed that removing this single - * inport reduces the bundle size from 5.7mb to 2.1mb. I know it's still a huge - * bundle, but it's progress! - * If you need to use Plotly, then you can add the Plotly CDN - * to your script before DanfoJs CDN - */ -try { - const version = Plotly.version; - console.info(`Using Plotly version ${version}`); -} catch (error) { - console.info(`Plotly CDN not found. If you need to make Plots, then add the Plotly CDN to your script`); -} - -/** - * Plotting methods and Functions performed on Series and DataFrames - */ -export class Plot { - constructor(ndframe, div) { - this.div = div; - this.ndframe = ndframe; - } - - - /** - * Plot Series or DataFrame as lines. This function is useful to plot lines using DataFrame’s values as coordinates. - * Make plots of Series or DataFrame. - * Uses the Plotly as backend, so supoorts Plotly's configuration parameters - * @param {string} div Name of the div to show the plot - * @param {Object} config configuration options for making Plots, supports Plotly parameters - */ - line(config = {}) { - - let ret_params = this.__get_plot_params(config); - let this_config = ret_params[0]; - let params = ret_params[1]; - - if (this.ndframe instanceof Series) { - let trace = {}; - let y = this.ndframe.values; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - trace["y"] = y; - trace['type'] = "line"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - //check if plotting two columns against each other - if (utils.__key_in_object(this_config, 'x') && utils.__key_in_object(this_config, 'y')) { - if (!this.ndframe.column_names.includes(this_config['x'])) { - throw Error(`Column Error: ${this_config['x']} not found in columns`); - } - if (!this.ndframe.column_names.includes(this_config['y'])) { - throw Error(`Column Error: ${this_config['y']} not found in columns`); - } - - - let x = this.ndframe[this_config['x']].values; - let y = this.ndframe[this_config['y']].values; - - let trace = {}; - trace["x"] = x; - trace['y'] = y; - - - let xaxis = {}; let yaxis = {}; - xaxis['title'] = this_config['x']; - yaxis['title'] = this_config['y']; - - this_config['layout']['xaxis'] = xaxis; - this_config['layout']['yaxis'] = yaxis; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else if (utils.__key_in_object(this_config, 'x') || utils.__key_in_object(this_config, 'y')) { - //plot single column specified in either of param [x | y] against index - //plot columns against index - let data = []; - let cols_to_plot; - - if (utils.__key_in_object(this_config, "columns")) { - cols_to_plot = this.____check_if_cols_exist(this_config['columns']); - } else { - cols_to_plot = this.ndframe.column_names; - } - - cols_to_plot.forEach((c_name) => { - let trace = {}; - - params.forEach((param) => { //TODO accept individual configuration for traces - trace[param] = config[param]; - }); - if (utils.__key_in_object(this_config, 'x')) { - trace["x"] = this.ndframe[this_config['x']].values; - trace["y"] = this.ndframe[c_name].values; - trace['name'] = c_name; - } else { - trace["y"] = this.ndframe[this_config['y']].values; - trace["x"] = this.ndframe[c_name].values; - trace['name'] = c_name; - } - - data.push(trace); - - }); - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } else { - //plot columns against index - let data = []; - let cols_to_plot; - - if (utils.__key_in_object(this_config, "columns")) { - cols_to_plot = this.____check_if_cols_exist(this_config['columns']); - } else { - cols_to_plot = this.ndframe.column_names; - } - - cols_to_plot.forEach((c_name) => { - let trace = {}; - - params.forEach((param) => { //TODO accept individual configuration for traces - trace[param] = config[param]; - }); - trace["x"] = this.ndframe.index; - trace["y"] = this.ndframe[c_name].values; - trace['name'] = c_name; - - data.push(trace); - - }); - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } - - } - - - } - - - /** - * Plot Series or DataFrame as Bars. - * Uses the Plotly as backend, so supoorts Plotly's configuration parameters - * @param {string} div Name of the div to show the plot - * @param {Object} config configuration options for making Plots, supports Plotly parameters - */ - bar(config = {}) { - - let ret_params = this.__get_plot_params(config); - let this_config = ret_params[0]; - let params = ret_params[1]; - - if (this.ndframe instanceof Series) { - let trace = {}; - let y = this.ndframe.values; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - trace["y"] = y; - trace['type'] = "bar"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - //check if plotting two columns against each other - if (utils.__key_in_object(this_config, 'x') && utils.__key_in_object(this_config, 'y')) { - if (!this.ndframe.column_names.includes(this_config['x'])) { - throw Error(`Column Error: ${this_config['x']} not found in columns`); - } - if (!this.ndframe.column_names.includes(this_config['y'])) { - throw Error(`Column Error: ${this_config['y']} not found in columns`); - } - - - let x = this.ndframe[this_config['x']].values; - let y = this.ndframe[this_config['y']].values; - - let trace = {}; - trace["x"] = x; - trace['y'] = y; - trace['type'] = "bar"; - - - let xaxis = {}; let yaxis = {}; - xaxis['title'] = this_config['x']; - yaxis['title'] = this_config['y']; - - this_config['layout']['xaxis'] = xaxis; - this_config['layout']['yaxis'] = yaxis; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else if (utils.__key_in_object(this_config, 'x') || utils.__key_in_object(this_config, 'y')) { - //plot single column specified in either of param [x | y] against index - let trace = {}; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - if (utils.__key_in_object(this_config, 'x')) { - trace['y'] = this.ndframe[this_config['x']].values; - } else { - trace['y'] = this.ndframe[this_config['y']].values; - } - trace['type'] = "bar"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - //plot columns against index - let data = []; - let cols_to_plot; - - if (utils.__key_in_object(this_config, "columns")) { - cols_to_plot = this.____check_if_cols_exist(this_config['columns']); - } else { - cols_to_plot = this.ndframe.column_names; - } - - cols_to_plot.forEach((c_name) => { - let trace = {}; - - // params.forEach(param => { //TODO accept individual configuration for traces - // trace[param] = config[param] - // }) - trace['x'] = this.ndframe.index; - trace["y"] = this.ndframe[c_name].values; - trace['name'] = c_name; - trace['type'] = "bar"; - - data.push(trace); - - }); - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } - - } - - - } - - - /** - * Plot two or more columns in a DataFrame as scatter points. If Series, plot against its index - * Uses the Plotly as backend, so supoorts Plotly's configuration parameters - * @param {string} div Name of the div to show the plot - * @param {Object} config configuration options for making Plots, supports Plotly parameters - */ - scatter(config = {}) { - - let ret_params = this.__get_plot_params(config); - let this_config = ret_params[0]; - let params = ret_params[1]; - - if (this.ndframe instanceof Series) { - let trace = {}; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - trace["x"] = this.ndframe.values; - trace['y'] = this.ndframe.index; - trace['type'] = "scatter"; - trace['mode'] = "markers"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - //check if plotting two columns against each other - if (utils.__key_in_object(this_config, 'x') && utils.__key_in_object(this_config, 'y')) { - if (!this.ndframe.column_names.includes(this_config['x'])) { - throw Error(`Column Error: ${this_config['x']} not found in columns`); - } - if (!this.ndframe.column_names.includes(this_config['y'])) { - throw Error(`Column Error: ${this_config['y']} not found in columns`); - } - - - let x = this.ndframe[this_config['x']].values; - let y = this.ndframe[this_config['y']].values; - - let trace = {}; - trace["x"] = x; - trace['y'] = y; - trace['type'] = "scatter"; - trace['mode'] = "markers"; - - let xaxis = {}; let yaxis = {}; - xaxis['title'] = this_config['x']; - yaxis['title'] = this_config['y']; - - this_config['layout']['xaxis'] = xaxis; - this_config['layout']['yaxis'] = yaxis; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else if (utils.__key_in_object(this_config, 'x') || utils.__key_in_object(this_config, 'y')) { - //plot single column specified in either of param [x | y] against index - let trace = {}; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - if (utils.__key_in_object(this_config, 'x')) { - trace['y'] = this.ndframe.index; - trace['x'] = this.ndframe[this_config['x']].values; - - } else { - trace['x'] = this.ndframe.index; - trace['y'] = this.ndframe[this_config['y']].values; - - } - trace['type'] = "scatter"; - trace['mode'] = "markers"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - //plot columns against index - let data = []; - let cols_to_plot; - - if (utils.__key_in_object(this_config, "columns")) { - cols_to_plot = this.____check_if_cols_exist(this_config['columns']); - } else { - cols_to_plot = this.ndframe.column_names; - } - - cols_to_plot.forEach((c_name) => { - let trace = {}; - - // params.forEach(param => { //TODO accept individual configuration for traces - // trace[param] = config[param] - // }) - trace['y'] = this.ndframe.index; - trace["x"] = this.ndframe[c_name].values; - trace['name'] = c_name; - trace['type'] = "scatter"; - trace['mode'] = "markers"; - data.push(trace); - - }); - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } - - } - - - } - - - /** - * Plot columns in a Series/DataFrame as Histograms. - * Uses the Plotly as backend, so supoorts Plotly's configuration parameters - * @param {string} div Name of the div to show the plot - * @param {Object} config configuration options for making Plots, supports Plotly parameters - */ - hist(config = {}) { - - let ret_params = this.__get_plot_params(config); - let this_config = ret_params[0]; - let params = ret_params[1]; - - if (this.ndframe instanceof Series) { - let trace = {}; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - trace["x"] = this.ndframe.values; - trace['type'] = "histogram"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else if (utils.__key_in_object(this_config, 'x')) { - //plot as vertical histogram - let trace = {}; - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - trace['x'] = this.ndframe[this_config['y']].values; - trace['type'] = "histogram"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else if (utils.__key_in_object(this_config, 'y')) { - //plot as vertical histogram - let trace = {}; - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - trace['y'] = this.ndframe[this_config['y']].values; - trace['type'] = "histogram"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - let data = []; - let cols_to_plot; - - if (utils.__key_in_object(this_config, "columns")) { - cols_to_plot = this.____check_if_cols_exist(this_config['columns']); - } else { - cols_to_plot = this.ndframe.column_names; - } - - cols_to_plot.forEach((c_name) => { - let trace = {}; - trace["x"] = this.ndframe[c_name].values; - trace['name'] = c_name; - trace['type'] = "histogram"; - data.push(trace); - - }); - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } - - } - - - /** - * Makes Pie Plots from two Columns in a DataFrame. - * Uses the Plotly as backend, so supoorts Plotly's configuration parameters - * @param {string} div Name of the div to show the plot - * @param {Object} config configuration options for making Plots, supports Plotly parameters - */ - pie(config = {}) { - - let ret_params = this.__get_plot_params(config); - let this_config = ret_params[0]; - - - if (this.ndframe instanceof Series) { - let data = [ { - values: this.ndframe.values, - labels: this.ndframe.index, - type: 'pie', - name: this_config['labels'], - hoverinfo: 'label+percent+name', - automargin: true - } ]; - - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } else if (utils.__key_in_object(this_config, 'values') && utils.__key_in_object(this_config, 'labels')) { - if (!this.ndframe.column_names.includes(this_config['labels'])) { - throw Error(`Column Error: ${this_config['labels']} not found in columns. labels name must be one of [ ${this.ndframe.column_names}]`); - } - if (!this.ndframe.column_names.includes(this_config['values'])) { - throw Error(`Column Error: ${this_config['values']} not found in columns. value name must be one of [ ${this.ndframe.column_names}]`); - } - let data = [ { - values: this.ndframe[this_config['values']].values, - labels: this.ndframe[this_config['labels']].values, - type: 'pie', - name: this_config['labels'], - hoverinfo: 'label+percent+name', - automargin: true - } ]; - - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } else { - let cols_to_plot; - - if (utils.__key_in_object(this_config, "columns")) { - cols_to_plot = this.____check_if_cols_exist(this_config['columns']); - } else { - cols_to_plot = this.ndframe.column_names; - } - - if (utils.__key_in_object(this_config, 'row_pos')) { - if (this_config['row_pos'].length != cols_to_plot.length - 1) { - throw Error(`Lenght of row_pos array must be equal to number of columns. Got ${this_config['row_pos'].length}, expected ${cols_to_plot.length - 1}`); - } - } else { - let temp_arr = []; - for (let i = 0; i < cols_to_plot.length - 1; i++) { - temp_arr.push(0); - } - this_config['row_pos'] = temp_arr; - - } - - if (utils.__key_in_object(this_config, 'col_pos')) { - if (this_config['col_pos'].length != cols_to_plot.length - 1) { - throw Error(`Lenght of col_pos array must be equal to number of columns. Got ${this_config['col_pos'].length}, expected ${cols_to_plot.length - 1}`); - } - } else { - let temp_arr = []; - for (let i = 0; i < cols_to_plot.length - 1; i++) { - temp_arr.push(i); - } - this_config['col_pos'] = temp_arr; - - } - let data = []; - - cols_to_plot.forEach((c_name, i) => { - let trace = {}; - trace["values"] = this.ndframe[c_name].values; - trace['labels'] = this.ndframe[this_config['labels']].values; - trace['name'] = c_name; - trace['type'] = "pie"; - trace['domain'] = { row: this_config['row_pos'][i], column: this_config['col_pos'][i] }; - trace["hoverinfo"] = 'label+percent+name'; - trace['textposition'] = "outside"; - trace['automargin'] = true; - data.push(trace); - - }); - - if (!utils.__key_in_object(this_config, "grid")) { - //set default grid - let size = Number((this.ndframe.shape[1] / 2).toFixed()) + 1; - this_config['grid'] = { rows: size, columns: size }; - } - this_config['layout']['grid'] = this_config['grid']; - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - - } - - } - - - /** - * Plot Box plots from Series or DataFrame as lines. - * Uses the Plotly as backend, so supoorts Plotly's configuration parameters - * @param {Object} config configuration options for making Plots, supports Plotly parameters - */ - box(config = {}) { - - let ret_params = this.__get_plot_params(config); - let this_config = ret_params[0]; - let params = ret_params[1]; - - if (this.ndframe instanceof Series) { - let trace = {}; - let y = this.ndframe.values; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - trace["y"] = y; - trace['type'] = "box"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - //check if plotting two columns against each other - if (utils.__key_in_object(this_config, 'x') && utils.__key_in_object(this_config, 'y')) { - if (!this.ndframe.column_names.includes(this_config['x'])) { - throw Error(`Column Error: ${this_config['x']} not found in columns`); - } - if (!this.ndframe.column_names.includes(this_config['y'])) { - throw Error(`Column Error: ${this_config['y']} not found in columns`); - } - - - let x = this.ndframe[this_config['x']].values; - let y = this.ndframe[this_config['y']].values; - - let trace = {}; - trace["x"] = x; - trace['y'] = y; - trace['type'] = 'box'; - - - let xaxis = {}; let yaxis = {}; - xaxis['title'] = this_config['x']; - yaxis['title'] = this_config['y']; - - this_config['layout']['xaxis'] = xaxis; - this_config['layout']['yaxis'] = yaxis; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else if (utils.__key_in_object(this_config, 'x') || utils.__key_in_object(this_config, 'y')) { - //plot single column specified in either of param [x | y] against index - let trace = {}; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - if (utils.__key_in_object(this_config, 'x')) { - trace['x'] = this.ndframe[this_config['x']].values; - trace['y'] = this.ndframe.index; - trace['type'] = 'box'; - } else { - trace['x'] = this.ndframe.index; - trace['y'] = this_config['y']; - trace['type'] = 'box'; - } - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - //plot columns against index - let data = []; - let cols_to_plot; - - if (utils.__key_in_object(this_config, "columns")) { - cols_to_plot = this.____check_if_cols_exist(this_config['columns']); - } else { - cols_to_plot = this.ndframe.column_names; - } - - cols_to_plot.forEach((c_name) => { - let trace = {}; - - params.forEach((param) => { //TODO accept individual configuration for traces - trace[param] = config[param]; - }); - trace["y"] = this.ndframe[c_name].values; - trace['name'] = c_name; - trace['type'] = 'box'; - data.push(trace); - - }); - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } - - } - - - } - - - /** - * Plot Violin plots from Series or DataFrame as lines. - * Uses the Plotly as backend, so supoorts Plotly's configuration parameters - * @param {Object} config configuration options for making Plots, supports Plotly parameters - */ - violin(config = {}) { - - let ret_params = this.__get_plot_params(config); - let this_config = ret_params[0]; - let params = ret_params[1]; - - if (this.ndframe instanceof Series) { - let trace = {}; - let y = this.ndframe.values; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - trace["y"] = y; - trace['type'] = "violin"; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - //check if plotting two columns against each other - if (utils.__key_in_object(this_config, 'x') && utils.__key_in_object(this_config, 'y')) { - if (!this.ndframe.column_names.includes(this_config['x'])) { - throw Error(`Column Error: ${this_config['x']} not found in columns`); - } - if (!this.ndframe.column_names.includes(this_config['y'])) { - throw Error(`Column Error: ${this_config['y']} not found in columns`); - } - - - let x = this.ndframe[this_config['x']].values; - let y = this.ndframe[this_config['y']].values; - - let trace = {}; - trace["x"] = x; - trace['y'] = y; - trace['type'] = 'violin'; - - - let xaxis = {}; let yaxis = {}; - xaxis['title'] = this_config['x']; - yaxis['title'] = this_config['y']; - - this_config['layout']['xaxis'] = xaxis; - this_config['layout']['yaxis'] = yaxis; - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else if (utils.__key_in_object(this_config, 'x') || utils.__key_in_object(this_config, 'y')) { - //plot single column specified in either of param [x | y] against index - let trace = {}; - - params.forEach((param) => { - if (!param == "layout") { - trace[param] = config[param]; - } - }); - - if (utils.__key_in_object(this_config, 'x')) { - trace['x'] = this.ndframe[this_config['x']].values; - trace['y'] = this.ndframe.index; - trace['type'] = 'violin'; - } else { - trace['x'] = this.ndframe.index; - trace['y'] = this_config['y']; - trace['type'] = 'violin'; - } - - Plotly.newPlot(this.div, [ trace ], this_config['layout'], this_config); - - } else { - //plot columns against index - let data = []; - let cols_to_plot; - - if (utils.__key_in_object(this_config, "columns")) { - cols_to_plot = this.____check_if_cols_exist(this_config['columns']); - } else { - cols_to_plot = this.ndframe.column_names; - } - - cols_to_plot.forEach((c_name) => { - let trace = {}; - - params.forEach((param) => { //TODO accept individual configuration for traces - trace[param] = config[param]; - }); - trace["y"] = this.ndframe[c_name].values; - trace['name'] = c_name; - trace['type'] = 'violin'; - data.push(trace); - - }); - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } - - } - - - } - - /** - * Display DataFrame in a div using D3.js format - * Uses the Plotly as backend, so supoorts Plotly's configuration parameters - * @param {Object} config configuration options for making Plots, supports Plotly parameters - */ - table(config = {}) { - let ret_params = this.__get_plot_params(config); - let this_config = ret_params[0]; - let header = {}; - let cells = {}; - let cols_data = []; - let cols_2_show; - - - if (utils.__key_in_object(this_config, 'columns')) { - - this_config['columns'].forEach((cname) => { - if (!this.ndframe.column_names.includes(cname)) { - throw Error(`Column Error: ${cname} not found in columns. Columns should be one of [ ${this.ndframe.column_names} ]`); - } - - let idx = this.ndframe.column_names.indexOf(cname); - cols_data.push(this.ndframe.col_data[idx]); - }); - cols_2_show = this_config['columns']; - } else { - - cols_2_show = this.ndframe.column_names; - cols_data = this.ndframe.col_data; - - } - - header['values'] = cols_2_show; - cells['values'] = cols_data; - - if (this_config['header_style']) { - Object.keys(this_config['header_style']).forEach((param) => { - header[param] = this_config['header_style'][param]; - }); - } - - if (this_config['cell_style']) { - Object.keys(this_config['cell_style']).forEach((param) => { - cells[param] = this_config['cell_style'][param]; - }); - } - var data = [ { - type: 'table', - header: header, - cells: cells - } ]; - Plotly.newPlot(this.div, data, this_config['layout'], this_config); - - } - - - __get_plot_params(config) { - let params = Object.keys(config); - let this_config = {}; - - params.forEach((param) => { - this_config[param] = config[param]; - }); - - if (!utils.__key_in_object(config, "layout")) { - this_config['layout'] = {}; - } - - - return [ this_config, params ]; - - } - - ____check_if_cols_exist(cols) { - cols.forEach((col) => { - if (!this.ndframe.column_names.includes(col)) { - throw Error(`Column Error: ${col} not found in columns. Columns should be one of [ ${this.ndframe.column_names} ]`); - } - }); - return cols; - } - - -} diff --git a/src/lib/danfo/preprocessing/encodings.js b/src/lib/danfo/preprocessing/encodings.js deleted file mode 100644 index ace3388..0000000 --- a/src/lib/danfo/preprocessing/encodings.js +++ /dev/null @@ -1,108 +0,0 @@ -import { Series } from "../core/series"; -import { Utils } from "../core/utils"; -import { DataFrame } from "../core/frame"; - -const utils = new Utils; - -export class LabelEncoder { - - /** - * - * @param {data} data [Array|Series] - * @returns Array. - */ - fit(data) { - let in_data = null; - if (Array.isArray(data)) { - in_data = data; - } else if (data instanceof Series) { - in_data = data.values; - } else { - throw new Error("data must be an array or a Series"); - } - - let data_set = new Set(in_data); - this.label = Array.from(data_set); - - let self = this; - let output_data = in_data.map((x) => { - return self.label.indexOf(x); - }); - - return new Series(output_data); - } - - /** - * Transform data using the label generated from fitting - * @param {data} data [Array|Series] - * @returns Array - */ - transform(data) { - let in_data = null; - if (Array.isArray(data)) { - in_data = data; - } else if (data instanceof Series) { - in_data = data.values; - } else { - throw new Error("data must be an array or a Series"); - } - - let self = this; - let output_data = in_data.map((x) => { - return self.label.indexOf(x); - }); - return new Series(output_data); - } -} - -export class OneHotEncoder { - - fit(data) { - let in_data = null; - if (Array.isArray(data)) { - in_data = data; - } else if (data instanceof Series) { - in_data = data.values; - } else { - throw new Error("data must be an array"); - } - - let data_set = new Set(in_data); - this.label = Array.from(data_set); - - let onehot_data = utils.__zeros(in_data.length, this.label.length); - - for (let i = 0; i < in_data.length; i++) { - - let elem = in_data[i]; - let elem_index = this.label.indexOf(elem); - onehot_data[i][elem_index] = 1; - } - - return new DataFrame(onehot_data, { columns: this.label }); - - } - - transform(data) { - let in_data = null; - - if (Array.isArray(data)) { - in_data = data; - } else if (data instanceof Series) { - in_data = data.values; - } else { - throw new Error("data must be an array"); - } - - let onehot_data = utils.__zeros(in_data.length, this.label.length); - - for (let i = 0; i < in_data.length; i++) { - let elem = in_data[i]; - let elem_index = this.label.indexOf(elem); - onehot_data[i][elem_index] = 1; - } - - return new DataFrame(onehot_data, { columns: this.label }); - - } -} diff --git a/src/lib/danfo/preprocessing/scalers.js b/src/lib/danfo/preprocessing/scalers.js deleted file mode 100644 index 2542512..0000000 --- a/src/lib/danfo/preprocessing/scalers.js +++ /dev/null @@ -1,267 +0,0 @@ -import { tensor, moments } from "@tensorflow/tfjs"; -import { Series } from "../core/series"; -import { DataFrame } from "../core/frame"; -import { Utils } from "../core/utils"; - -const utils = new Utils(); - -export class MinMaxScaler { - /** - * Fit minmax scaler on data, to obtain their min and max value - * @param {data} data [DataRame | Series | Array] - * @returns Array - */ - fit(data) { - let tensor_data = null; - if (Array.isArray(data)) { - tensor_data = tensor(data); - } else if (data instanceof DataFrame || data instanceof Series) { - if (data.dtypes.includes("string")) { - throw Error("Dtype Error: Cannot perform operation on string dtypes"); - } - tensor_data = tensor(data.values); - } else { - throw new Error("data must either be an Array, DataFrame or Series"); - } - - this.max = tensor_data.max(0); - this.min = tensor_data.min(0); - - let output_data = tensor_data - .sub(this.min) - .div(this.max.sub(this.min)) - .arraySync(); - - if (data instanceof Series || Array.isArray(data)) { - return new Series(output_data); - } else { - return new DataFrame(output_data); - } - } - - /** - * Transform an array using the min and max generated from the fitting on data - * @param {data} data [Array] - * @returns array - */ - transform(data) { - if (data instanceof Series) { - if (data.dtypes.includes("string")) { - throw Error("Dtype Error: Cannot perform operation on string dtypes"); - } - let tensor_data = tensor(data.values); - let output_data = tensor_data - .sub(this.min) - .div(this.max.sub(this.min)) - .arraySync(); - return new Series(output_data); - } else if (Array.isArray(data)) { - let tensor_data = tensor(data); - let output_data = tensor_data - .sub(this.min) - .div(this.max.sub(this.min)) - .arraySync(); - if (utils.__is_1D_array(data)) { - return new Series(output_data); - } else { - return new DataFrame(output_data); - } - } else if (data instanceof DataFrame) { - if (data.dtypes.includes("string")) { - throw Error("Dtype Error: Cannot perform operation on string dtypes"); - } - let tensor_data = tensor(data.values); - let output_data = tensor_data - .sub(this.min) - .div(this.max.sub(this.min)) - .arraySync(); - return new DataFrame(output_data); - } else { - throw Error("Value Error: Data type not supoorted"); - } - } -} - -export class StandardScaler { - /** - * - * @param {data} data [DataRame | Series | Array] - * @returns Array - */ - fit(data) { - let tensor_data = null; - if (Array.isArray(data)) { - tensor_data = tensor(data); - } else if (data instanceof DataFrame || data instanceof Series) { - if (data.dtypes.includes("string")) { - throw Error("Dtype Error: Cannot perform operation on string dtypes"); - } - tensor_data = tensor(data.values); - } else { - throw new Error("data must either be an Array, DataFrame or Series"); - } - - this.std = moments(tensor_data, 0).variance.sqrt(); - this.mean = tensor_data.mean(0); - let output_data = tensor_data.sub(this.mean).div(this.std).arraySync(); - - if (data instanceof Series || Array.isArray(data)) { - return new Series((data = output_data)); - } else { - return new DataFrame((data = output_data)); - } - } - - transform(data) { - // if(!Array.isArray(data)){ - // throw new Error(data) - // } - - if (data instanceof Series) { - if (data.dtypes.includes("string")) { - throw Error("Dtype Error: Cannot perform operation on string dtypes"); - } - let tensor_data = tensor(data.values); - let output_data = tensor_data.sub(this.mean).div(this.std).arraySync(); - return new Series(output_data); - } else if (Array.isArray(data)) { - let tensor_data = tensor(data); - let output_data = tensor_data.sub(this.mean).div(this.std).arraySync(); - if (utils.__is_1D_array(data)) { - return new Series(output_data); - } else { - return new DataFrame(output_data); - } - } else if (data instanceof DataFrame) { - if (data.dtypes.includes("string")) { - throw Error("Dtype Error: Cannot perform operation on string dtypes"); - } - let tensor_data = tensor(data.values); - let output_data = tensor_data.sub(this.mean).div(this.std).arraySync(); - return new DataFrame(output_data); - } else { - throw Error("Value Error: Data type not supoorted"); - } - } -} - -// export class RobustScaler{ - -// __median(arr, isTensor,return_index) { -// if (!isTensor) { -// const sorted = arr.slice().sort((a, b) => a - b); -// const middle = Math.floor(sorted.length / 2); - -// if (sorted.length % 2 === 0) { - -// return return_index ? [(middle - 1) , middle] : (sorted[middle - 1] + sorted[middle]) / 2; -// } - -// return return_index ? middle : sorted[middle] ; -// } else { -// let result_arr = [] -// arr.map(ele => { -// const sorted = ele.slice().sort((a, b) => a - b); -// const middle = Math.floor(sorted.length / 2); - -// if (sorted.length % 2 === 0) { -// result_arr.push(return_index ? [(middle - 1) , middle] :(sorted[middle - 1] + sorted[middle]) / 2 ) -// } else { -// result_arr.push(return_index ? middle : sorted[middle]) -// } - -// }) -// return result_arr -// } - -// } - -// quantile(data,isTensor){ - -// if(isTensor){ -// data = utils.__get_col_values(data); -// } - -// let median = this.__median(data,isTensor,true) -// let med = this.__median(data,isTensor,false) - -// let q1 = [] -// let q2 = [] - -// if(!isTensor){ -// let sorted = data.slice().sort((a, b) => a - b); - -// if(Array.isArray(median)){ -// let lower = median[0] -// let lower_data = sorted.slice(0,lower+1) -// let upper_data = sorted.slice(lower+1,) - -// q1.push(this.__median(lower_data,isTensor,false)); -// q2.push(this.__median(upper_data,isTensor,false)); - -// }else{ -// let lower_data = sorted.slice(0,median) -// let upper_data = sorted.slice(median+1,) - -// q1.push(this.__median(lower_data,isTensor,false)); -// q2.push(this.__median(upper_data,isTensor,false)); -// } - -// }else{ - -// data.map((x,i)=>{ -// let sorted = x.slice().sort((a, b) => a - b); - -// if(Array.isArray(median[i])){ -// let lower = median[i][0] -// let lower_data = sorted.slice(0,lower+1) -// let upper_data = sorted.slice(lower+1,) - -// q1.push(this.__median(lower_data,!isTensor,false)); -// q2.push(this.__median(upper_data,!isTensor,false)); - -// }else{ -// let lower_data = sorted.slice(0,median[i]) -// let upper_data = sorted.slice(median[i]+1,) - -// q1.push(this.__median(lower_data,!isTensor,false)); -// q2.push(this.__median(upper_data,!isTensor,false)); -// } - -// }) -// } - -// return [q1,q2, med] - -// } - -// /** -// * Fit robust scalar on data to obtain the first quantile and third quantile -// * @param {data} data [DataRame | Series | Array] -// * @returns Array -// */ -// fit(data){ - -// let tensor_data = null -// let isTensor = false; -// if(Array.isArray(data)){ -// tensor_data = tensor(data) -// } -// else if((data instanceof DataFrame)){ -// tensor_data = tensor(data.values) -// isTensor = true; -// } -// else if((data instanceof Series)){ -// tensor_data = tensor(data.values) -// } -// else{ -// throw new Error("data must either be an Array, DataFrame or Series") -// } - -// let [q1, q3, median] = this.quantile(data,isTensor) -// let q3_tensor = tensor(q3) -// let output_data = tensor_data.sub(median).div(q3_tensor.sub(q1)).arraySync() - -// return output_data; -// } -// } diff --git a/src/lib/ml5/Word2vec/index.js b/src/lib/ml5/Word2vec/index.js index 6ecbbc0..bfd28d6 100644 --- a/src/lib/ml5/Word2vec/index.js +++ b/src/lib/ml5/Word2vec/index.js @@ -7,205 +7,16 @@ Word2Vec */ -import * as tf from '@tensorflow/tfjs'; -import axios from 'axios'; -import callCallback from '../utils/callcallback'; - - -class Word2Vec { - /** - * Create Word2Vec model - * @param {String} modelPath - path to pre-trained word vector model in .json e.g data/wordvecs1000.json - * @param {function} callback - Optional. A callback function that is called once the model has loaded. If no callback is provided, it will return a promise - * that will be resolved once the model has loaded. - */ - constructor(modelPath, callback) { - this.model = {}; - this.modelPath = modelPath; - this.modelSize = 0; - this.modelLoaded = false; - - this.ready = callCallback(this.loadModel(), callback); - // TODO: Add support to Promise - // this.then = this.ready.then.bind(this.ready); - } - - async loadModel() { - const {data} = await axios.get(this.modelPath) - - Object.keys(data.vectors).forEach((word) => { - this.model[word] = tf.tensor1d(data.vectors[word]); - }); - this.modelSize = Object.keys(this.model).length; - this.modelLoaded = true; - return this; - } - - dispose(callback) { - Object.values(this.model).forEach(x => x.dispose()); - if (callback) { - callback(); - } - } - - async add(inputs, maxOrCb, cb) { - const { max, callback } = Word2Vec.parser(maxOrCb, cb, 10); - - await this.ready; - return tf.tidy(() => { - const sum = Word2Vec.addOrSubtract(this.model, inputs, 'ADD'); - const result = Word2Vec.nearest(this.model, sum, inputs.length, inputs.length + max); - if (callback) { - callback(undefined, result); - } - return result; - }); - } - - async subtract(inputs, maxOrCb, cb) { - const { max, callback } = Word2Vec.parser(maxOrCb, cb, 10); - - await this.ready; - return tf.tidy(() => { - const subtraction = Word2Vec.addOrSubtract(this.model, inputs, 'SUBTRACT'); - const result = Word2Vec.nearest(this.model, subtraction, inputs.length, inputs.length + max); - if (callback) { - callback(undefined, result); - } - return result; - }); - } - - async average(inputs, maxOrCb, cb) { - const { max, callback } = Word2Vec.parser(maxOrCb, cb, 10); - - await this.ready; - return tf.tidy(() => { - const sum = Word2Vec.addOrSubtract(this.model, inputs, 'ADD'); - const avg = tf.div(sum, tf.tensor(inputs.length)); - const result = Word2Vec.nearest(this.model, avg, inputs.length, inputs.length + max); - if (callback) { - callback(undefined, result); - } - return result; - }); - } - - async nearest(input, maxOrCb, cb) { - const { max, callback } = Word2Vec.parser(maxOrCb, cb, 10); - - await this.ready; - const vector = this.model[input]; - let result; - if (vector) { - result = Word2Vec.nearest(this.model, vector, 1, max + 1); - } else { - result = null; - } - - if (callback) { - callback(undefined, result); - } - return result; - } - - /* Given a set of your own words, find the nearest neighbors */ - async nearestFromSet(input, set, maxOrCb, cb) { - const { max, callback } = Word2Vec.parser(maxOrCb, cb, 10); - await this.ready; - const vector = this.model[input]; - - // If the input vector isn't found, bail out early. - if (!vector) { - if(callback) callback(undefined, null); - return null; - } - - const miniModel = {}; - set.forEach((word) => { - if (this.model[word]) miniModel[word] = this.model[word]; - }); - - // If none of the words in the set are found, also bail out - if (!miniModel.length) { - if(callback) callback(undefined, null); - return null; - } - - const result = Word2Vec.nearest(miniModel, vector, 1, max + 1); - - if (callback) { - callback(undefined, result); - } - return result; - } - - async getRandomWord(callback) { - await this.ready; - const words = Object.keys(this.model); - const result = words[Math.floor(Math.random() * words.length)]; - if (callback) { - callback(undefined, result); - } - return result; - } - - static parser(maxOrCallback, cb, defaultMax) { - let max = defaultMax; - let callback = cb; - - if (typeof maxOrCallback === 'function') { - callback = maxOrCallback; - } else if (typeof maxOrCallback === 'number') { - max = maxOrCallback; - } - return { max, callback }; - } - - static addOrSubtract(model, values, operation) { - return tf.tidy(() => { - const vectors = []; - const notFound = []; - if (values.length < 2) { - throw new Error('Invalid input, must be passed more than 1 value'); - } - values.forEach((value) => { - const vector = model[value]; - if (!vector) { - notFound.push(value); - } else { - vectors.push(vector); - } - }); - - if (notFound.length > 0) { - throw new Error(`Invalid input, vector not found for: ${notFound.toString()}`); - } - let result = vectors[0]; - if (operation === 'ADD') { - for (let i = 1; i < vectors.length; i += 1) { - result = tf.add(result, vectors[i]); - } - } else { - for (let i = 1; i < vectors.length; i += 1) { - result = tf.sub(result, vectors[i]); - } - } - return result; - }); - } - - static nearest(model, input, start, max) { - const nearestVectors = []; - Object.keys(model).forEach((word) => { - const distance = tf.util.distSquared(input.dataSync(), model[word].dataSync()); - nearestVectors.push({ word, distance }); - }); - nearestVectors.sort((a, b) => a.distance - b.distance); - return nearestVectors.slice(start, max); - } -} - -const word2vec = (model, cb) => new Word2Vec(model, cb); +const word2vec = () => { + console.log('%cword2vec has been disabled', 'color: #A155FF; font-size: 16px'); + console.log( + `We've intentionally disabled the word2vec function after recognizing it has the ` + + `potential to produce harmful outputs while using the model files included in our ` + + `examples. We'll consider reenabling the word2vec function along with changes to ` + + `address these issues in a future release of ml5.js. You can find further updates ` + + `about this topic on our Twitter account (https://twitter.com/ml5js/status/1445762321444315147) and GitHub ` + + `(https://github.com/ml5js/ml5-library/issues/1238).`, + ); +}; export default word2vec; diff --git a/src/lib/ml5/Word2vec/index_test.js b/src/lib/ml5/Word2vec/index_test.js deleted file mode 100644 index 0cb8017..0000000 --- a/src/lib/ml5/Word2vec/index_test.js +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (c) 2018 ml5 -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -/* eslint no-loop-func: 0 */ -const { tf, word2vec } = ml5; - -const W2V_MODEL_URL = 'https://raw.githubusercontent.com/ml5js/ml5-data-and-training/master/models/wordvecs/common-english/wordvecs1000.json'; - -describe('word2vec', () => { - let word2vecInstance; - let numTensorsBeforeAll; - let numTensorsBeforeEach; - beforeAll((done) => { - jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000; - numTensorsBeforeAll = tf.memory().numTensors; - word2vecInstance = word2vec(W2V_MODEL_URL, done); - }); - - // afterAll(() => { - // word2vecInstance.dispose(); - // const numTensorsAfterAll = tf.memory().numTensors; - // if (numTensorsBeforeAll !== numTensorsAfterAll) { - // throw new Error(`Leaking Tensors (${numTensorsAfterAll} vs ${numTensorsBeforeAll})`); - // } - // }); - - beforeEach(() => { - numTensorsBeforeEach = tf.memory().numTensors; - }); - - afterEach(() => { - const numTensorsAfterEach = tf.memory().numTensors; - if (numTensorsBeforeEach !== numTensorsAfterEach) { - throw new Error(`Leaking Tensors (${numTensorsAfterEach} vs ${numTensorsBeforeEach})`); - } - }); - - it('creates a new instance', () => { - expect(word2vecInstance).toEqual(jasmine.objectContaining({ - modelLoaded: true, - modelSize: 1000, - })); - }); - - describe('getRandomWord', () => { - it('returns a random word', () => { - word2vecInstance.getRandomWord() - .then(word => expect(typeof word).toEqual('string')); - }); - }); - - describe('nearest', () => { - it('returns a sorted array of nearest words', () => { - for (let i = 0; i < 100; i += 1) { - word2vecInstance.getRandomWord() - .then(word => word2vecInstance.nearest(word)) - .then((nearest) => { - let currentDistance = 0; - for (const { word, distance: nextDistance } of nearest) { - expect(typeof word).toEqual('string'); - expect(nextDistance).toBeGreaterThan(currentDistance); - currentDistance = nextDistance; - } - }) - } - }); - - it('returns a list of the right length', () => { - for (let i = 0; i < 100; i += 1) { - word2vecInstance.getRandomWord() - .then(word => word2vecInstance.nearest(word, i)) - .then(nearest => expect(nearest.length).toEqual(i)); - } - }); - }); - - describe('nearestFromSet', () => { - it('should return null when input word is fake', () => { - word2vecInstance.nearestFromSet('asdfsda', ['cat', 'ape', 'lamp']) - .then((nearest) => { - expect(nearest).toBe(null); - }); - }); - it('should return null for an empty set', () => { - word2vecInstance.nearestFromSet('dog', []) - .then((nearest) => { - expect(nearest).toBe(null); - }); - }); - it('should return null when word set is fake', () => { - word2vecInstance.nearestFromSet('dog', ["lsdfjk", "slkjf"]) - .then((nearest) => { - expect(nearest).toBe(null); - }); - }); - it('nearest to "human" in ["ape", "cat", "lamp"] is "ape", then "cat"', () => { - word2vecInstance.nearestFromSet('human', ['cat', 'ape', 'lamp']) - .then((nearest) => { - expect(nearest[0].word).toEqual('ape'); - expect(nearest[1].word).toEqual('cat'); - expect(nearest[1].word).toEqual('lamp'); - }); - }); -}); - - describe('add', () => { - it('cat + dog = horse', () => { - word2vecInstance.add(['cat', 'dog'], 1) - .then(result => expect(result[0].word).toBe('horse')); - }); - }); - - describe('subtract', () => { - it('cat - dog = fish', () => { - word2vecInstance.subtract(['cat', 'dog'], 1) - .then(result => expect(result[0].word).toBe('fish')); - }); - }); - - describe('average', () => { - it('moon & sun = avenue', () => { - word2vecInstance.average(['moon', 'sun'], 1) - .then(result => expect(result[0].word).toBe('earth')); - }); - }); -}); diff --git a/src/lib/ml5/package.json b/src/lib/ml5/package.json index de94e62..c6fd1ef 100644 --- a/src/lib/ml5/package.json +++ b/src/lib/ml5/package.json @@ -1,6 +1,6 @@ { "name": "ml5", - "version": "0.6.1", + "version": "0.8.0", "description": "A friendly machine learning library for the web.", "main": "dist/ml5.min.js", "directories": { diff --git a/test/test.html b/test/test.html deleted file mode 100644 index b9c892d..0000000 --- a/test/test.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - número Tests - - - - - - - - -
- - - - - - - - - - - - - - diff --git a/test/unit/data/index.js b/test/unit/data/index.js deleted file mode 100644 index 1f7bd4b..0000000 --- a/test/unit/data/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable func-names */ -/* eslint-disable prefer-arrow-callback */ - -describe('DataFrame', function () { - let pInst; - - beforeEach(function () { - pInst = new p5(function () { }); - }); - - afterEach(function () { - pInst.remove(); - }); - - describe('DataFrame', function () { - it('Should have a dfd.DataFrame under the hood', function () { - const df = pInst.createDataFrame([[1, 2, 3], [4, 5, 6]]); - expect(df).to.be.an.instanceof(num.DataFrame); - }); - }); - - describe('createDataFrame()', function () { - it('Should require an argument', function () { - expect(pInst.createDataFrame).to.throw(Error); - }); - - it('Should accept JSON arguments', function () { - const json_data = [ - { A: 0.4612, B: 4.28283, C: -1.509, D: -1.1352 }, - { A: 0.5112, B: -0.22863, C: -3.39059, D: 1.1632 }, - { A: 0.6911, B: -0.82863, C: -1.5059, D: 2.1352 }, - { A: 0.4692, B: -1.28863, C: 4.5059, D: 4.1632 } - ]; - const df = pInst.createDataFrame(json_data); - expect(df).to.be.an.instanceof(num.DataFrame); - }); - - it('Should accept Tensor arguments', function () { - const t = pInst.createTensor([[12, 34, 2.2, 2], [30, 30, 2.1, 7]]); - const df = pInst.createDataFrame(t); - expect(df).to.be.an.instanceof(num.DataFrame); - }); - - it('Should accept tf.Tensor arguments', function () { - const t = num.tf.tensor([[12, 34, 2.2, 2], [30, 30, 2.1, 7]]); - const df = pInst.createDataFrame(t); - expect(df).to.be.an.instanceof(num.DataFrame); - }); - - it('Should reject garbage arguments', function () { - expect(() => pInst.createDataFrame("I'm only happy when it rains")).to.throw(Error); - }); - }); - - describe('loadDataFrame()', function () { - it('Should load csv files', function () { - pInst.loadDataFrame('https://assets.computiful.org/pre-alpha/who_life_expectancy.csv', 'csv', (df) => { - expect(df).to.be.an.instanceof(num.dfd.DataFrame); - }); - }); - }); -}); diff --git a/test/unit/ml5/index.js b/test/unit/ml5/index.js index 1ae99ff..b425686 100644 --- a/test/unit/ml5/index.js +++ b/test/unit/ml5/index.js @@ -14,7 +14,7 @@ describe('ml5', function () { describe('window.ml5', function () { it('Should exist', function () { - expect(ml5.version).to.equal('0.6.1'); + expect(ml5.version).to.equal('0.8.0'); }); }); }); diff --git a/webpack.config.js b/webpack.config.js index a7ccd1b..217f1f3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -3,7 +3,6 @@ const path = require('path'); module.exports = { entry: './src/index.ts', mode: 'production', - devtool: 'inline-source-map', module: { rules: [ {