From c8ffc5f54618b86720c9f50ba408a7c57bf9a5e0 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Tue, 23 May 2023 11:50:50 +0400 Subject: [PATCH 01/23] Update generate.py --- generate.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/generate.py b/generate.py index cd48988..a0c6142 100644 --- a/generate.py +++ b/generate.py @@ -147,3 +147,5 @@ def main(): if __name__ == "__main__": main() + + From 95f020829c588d36a8a545ae349ec4900c19e66c Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Fri, 1 Sep 2023 12:33:33 +0400 Subject: [PATCH 02/23] Add configuration files and refactor coding style with prettier. --- port/js/babel.config.js | 6 +- port/js/jest.config.js | 8 + port/js/package-lock.json | 2502 +++++++++++++++++---------------- port/js/package.json | 17 +- port/js/prettier.config.js | 10 + port/js/rollup.config.js | 35 +- port/js/src/messgen.js | 978 ++++++------- port/js/src/utf8.js | 104 +- port/js/tests/messgen.test.js | 942 ++++++------- port/js/tests/utf8.test.js | 18 +- 10 files changed, 2391 insertions(+), 2229 deletions(-) create mode 100644 port/js/jest.config.js create mode 100644 port/js/prettier.config.js diff --git a/port/js/babel.config.js b/port/js/babel.config.js index b278488..7db9b6f 100644 --- a/port/js/babel.config.js +++ b/port/js/babel.config.js @@ -1,5 +1,3 @@ module.exports = { - "presets": [ - "@babel/preset-env" - ] -}; \ No newline at end of file + presets: ['@babel/preset-env'] +} diff --git a/port/js/jest.config.js b/port/js/jest.config.js new file mode 100644 index 0000000..ac5d640 --- /dev/null +++ b/port/js/jest.config.js @@ -0,0 +1,8 @@ +/** @type {import('jest').Config} */ +const config = { + transform: { + '\\.js?$': 'babel-jest' + } +} + +module.exports = config diff --git a/port/js/package-lock.json b/port/js/package-lock.json index 424a77c..574b2f7 100644 --- a/port/js/package-lock.json +++ b/port/js/package-lock.json @@ -9,11 +9,12 @@ "version": "1.0.0", "license": "ISC", "devDependencies": { - "@babel/preset-env": "^7.21.4", - "@rollup/plugin-terser": "^0.4.0", - "@types/jest": "^29.5.0", - "jest": "^29.5.0", - "rollup": "^3.20.2" + "@babel/preset-env": "^7.22.14", + "@rollup/plugin-terser": "^0.4.3", + "@types/jest": "^29.5.4", + "jest": "^29.6.4", + "prettier": "3.0.3", + "rollup": "^3.28.1" } }, "node_modules/@ampproject/remapping": { @@ -30,47 +31,48 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", + "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.11", + "@babel/parser": "^7.22.11", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -81,12 +83,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -96,63 +98,60 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", - "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz", + "integrity": "sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -162,13 +161,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", - "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -178,142 +178,128 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dev": true, "dependencies": { - "@babel/types": "^7.21.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" @@ -323,122 +309,121 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", + "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -446,9 +431,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.22.14", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.14.tgz", + "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -458,12 +443,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -473,14 +458,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -489,17 +474,11 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, "engines": { "node": ">=6.9.0" }, @@ -507,63 +486,49 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -572,46 +537,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -620,14 +576,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -636,50 +591,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -688,60 +630,46 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -750,10 +678,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-bigint": { + "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -762,22 +690,22 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { + "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -789,37 +717,59 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -828,37 +778,48 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz", + "integrity": "sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -867,85 +828,131 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -954,13 +961,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -969,13 +977,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -984,13 +993,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -999,15 +1009,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1016,13 +1024,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1031,13 +1041,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1046,21 +1057,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1069,14 +1072,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1085,13 +1088,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1100,14 +1103,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1116,13 +1119,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz", + "integrity": "sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1131,14 +1136,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", + "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1147,13 +1154,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1162,30 +1170,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1194,13 +1201,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1209,14 +1217,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1225,15 +1233,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz", + "integrity": "sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1242,16 +1252,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1260,14 +1268,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1276,29 +1284,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz", + "integrity": "sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1307,14 +1316,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1323,13 +1332,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1339,12 +1351,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1354,13 +1366,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1370,12 +1382,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1385,12 +1397,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1400,13 +1412,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1416,12 +1428,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1431,12 +1443,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1446,12 +1458,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1461,12 +1473,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1476,13 +1504,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1491,39 +1519,43 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "version": "7.22.14", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.14.tgz", + "integrity": "sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1533,45 +1565,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.11", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.11", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.11", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.12", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.11", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1581,19 +1630,17 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/regjsgen": { @@ -1603,45 +1650,45 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", + "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.11", + "@babel/types": "^7.22.11", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1650,13 +1697,13 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", + "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1695,16 +1742,16 @@ } }, "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -1782,37 +1829,37 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1899,89 +1946,89 @@ } }, "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/types": "^29.6.3", + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -1989,13 +2036,13 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2084,24 +2131,24 @@ } }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -2110,13 +2157,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.4", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -2125,14 +2172,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -2140,22 +2187,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.6.4", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2242,12 +2289,12 @@ } }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -2343,9 +2390,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2361,9 +2408,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -2377,30 +2424,24 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@rollup/plugin-terser": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.0.tgz", - "integrity": "sha512-Ipcf3LPNerey1q9ZMjiaWHlNPEHNU/B5/uh9zXLltfEQ1lVSLLeZSgAtTPWGyw8Ip1guOeq+mDtdOlEj/wNxQw==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", + "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", "dev": true, "dependencies": { - "serialize-javascript": "^6.0.0", - "smob": "^0.0.6", - "terser": "^5.15.1" + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" }, "engines": { "node": ">=14.0.0" @@ -2415,33 +2456,33 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2471,12 +2512,12 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/graceful-fs": { @@ -2513,9 +2554,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "version": "29.5.4", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", + "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2523,15 +2564,9 @@ } }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", "dev": true }, "node_modules/@types/stack-utils": { @@ -2556,9 +2591,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2626,15 +2661,15 @@ } }, "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -2732,10 +2767,26 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -2748,42 +2799,42 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-preset-current-node-syntax": { @@ -2810,12 +2861,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -2854,9 +2905,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -2866,13 +2917,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -2915,9 +2970,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001474", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz", - "integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==", + "version": "1.0.30001525", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", + "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", "dev": true, "funding": [ { @@ -2973,9 +3028,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/cliui": { @@ -3003,9 +3058,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -3042,12 +3097,12 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz", - "integrity": "sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg==", + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", + "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.21.10" }, "funding": { "type": "opencollective", @@ -3086,10 +3141,18 @@ } }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deepmerge": { "version": "4.3.1", @@ -3110,18 +3173,18 @@ } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/electron-to-chromium": { - "version": "1.4.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.355.tgz", - "integrity": "sha512-056hxzEE4l667YeOccgjhRr5fTiwZ6EIJ4FpzGps4k3YcS8iAhiaBYUBrv5E2LDQJsussscv9EEUwAYKnv+ZKg==", + "version": "1.4.508", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", + "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", "dev": true }, "node_modules/emittery": { @@ -3224,16 +3287,16 @@ } }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "@jest/expect-utils": "^29.6.4", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3286,9 +3349,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3466,9 +3529,9 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3532,33 +3595,66 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", + "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-report/node_modules/has-flag": { @@ -3597,9 +3693,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -3610,15 +3706,15 @@ } }, "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", + "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.4", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.6.4" }, "bin": { "jest": "bin/jest.js" @@ -3636,12 +3732,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -3649,28 +3746,28 @@ } }, "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -3750,21 +3847,21 @@ } }, "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -3854,31 +3951,31 @@ } }, "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.6.4", + "@jest/types": "^29.6.3", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3969,15 +4066,15 @@ } }, "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4054,9 +4151,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -4066,16 +4163,16 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4152,46 +4249,46 @@ } }, "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4203,28 +4300,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-diff": "^29.6.4", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4301,18 +4398,18 @@ } }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4391,14 +4488,14 @@ } }, "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4422,26 +4519,26 @@ } }, "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -4451,13 +4548,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4534,30 +4631,30 @@ } }, "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -4636,31 +4733,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -4739,34 +4836,31 @@ } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-diff": "^29.6.4", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.6.3", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4843,9 +4937,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4876,12 +4970,12 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -4963,17 +5057,17 @@ } }, "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5062,18 +5156,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -5151,13 +5245,13 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -5290,20 +5384,53 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -5372,9 +5499,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-path": { @@ -5543,9 +5670,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" @@ -5563,13 +5690,28 @@ "node": ">=8" } }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -5603,9 +5745,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true, "funding": [ { @@ -5652,15 +5794,15 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", "dev": true }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -5714,12 +5856,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -5761,9 +5903,9 @@ } }, "node_modules/rollup": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", - "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5797,9 +5939,9 @@ ] }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5857,9 +5999,9 @@ } }, "node_modules/smob": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/smob/-/smob-0.0.6.tgz", - "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", + "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", "dev": true }, "node_modules/source-map": { @@ -6002,13 +6144,13 @@ } }, "node_modules/terser": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", - "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", + "version": "5.19.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", + "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -6132,9 +6274,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -6144,6 +6286,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -6151,7 +6297,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -6280,9 +6426,9 @@ "dev": true }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", diff --git a/port/js/package.json b/port/js/package.json index 3c84329..75d9610 100644 --- a/port/js/package.json +++ b/port/js/package.json @@ -6,6 +6,7 @@ "scripts": { "build": "node_modules/.bin/rollup -c --bundleConfigAsCjs", "test": "jest --coverage --coverageReporters json-summary", + "prettier": "prettier --write \"src/**/*.js\" \"tests/**/*.js\" \"*.js\"", "gen-json": "python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l json -o ../../tests/js", "gen-ts": "npm run gen-json && python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l ts -o ../../tests/js", "gen-cpp": "python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l cpp -o ../../tests/js", @@ -14,15 +15,11 @@ "author": "", "license": "ISC", "devDependencies": { - "@babel/preset-env": "^7.21.4", - "@rollup/plugin-terser": "^0.4.0", - "@types/jest": "^29.5.0", - "jest": "^29.5.0", - "rollup": "^3.20.2" - }, - "jest": { - "transform": { - "^.+\\.jsx?$": "babel-jest" - } + "@babel/preset-env": "^7.22.14", + "@rollup/plugin-terser": "^0.4.3", + "@types/jest": "^29.5.4", + "jest": "^29.6.4", + "prettier": "3.0.3", + "rollup": "^3.28.1" } } diff --git a/port/js/prettier.config.js b/port/js/prettier.config.js new file mode 100644 index 0000000..556edf6 --- /dev/null +++ b/port/js/prettier.config.js @@ -0,0 +1,10 @@ +/** @type {import("prettier").Config} */ +const config = { + tabWidth: 2, + useTabs: false, + singleQuote: true, + printWidth: 120, + trailingComma: 'none', + semi: false +} +module.exports = config diff --git a/port/js/rollup.config.js b/port/js/rollup.config.js index f3f19ec..2278513 100644 --- a/port/js/rollup.config.js +++ b/port/js/rollup.config.js @@ -1,19 +1,20 @@ -import terser from '@rollup/plugin-terser'; -import pkg from './package.json'; +import terser from '@rollup/plugin-terser' +import pkg from './package.json' -const OUTPUT_NAME = `dist/messgen`; +const OUTPUT_NAME = `dist/messgen` -export default { - input: `src/messgen.js`, - output: [ - { - file: OUTPUT_NAME + ".js", - format: 'umd', - name: pkg.name, - sourcemap: false - } - ], - plugins: [ - terser() - ] -}; \ No newline at end of file +/** @type {import('rollup').RollupOptions} */ +const config = { + input: `src/messgen.js`, + output: [ + { + file: OUTPUT_NAME + '.js', + format: 'umd', + name: pkg.name, + sourcemap: false + } + ], + plugins: [terser()] +} + +export default config diff --git a/port/js/src/messgen.js b/port/js/src/messgen.js index 36a188c..6994bca 100644 --- a/port/js/src/messgen.js +++ b/port/js/src/messgen.js @@ -1,10 +1,10 @@ -'use strict'; +'use strict' -import {encodeUTF8, decodeUTF8} from "./utf8.js"; +import { encodeUTF8, decodeUTF8 } from './utf8.js' -const IS_LITTLE_ENDIAN = true; +const IS_LITTLE_ENDIAN = true -const DYNAMIC_SIZE_TYPE = "Uint32"; +const DYNAMIC_SIZE_TYPE = 'Uint32' /** * @@ -12,202 +12,247 @@ const DYNAMIC_SIZE_TYPE = "Uint32"; * Write function returns type byte size. */ const basicTypes = [ - { - name: "Char", - size: 1, - read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), - write: (v, s, a) => { v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN); return 1; } - }, { - name: "Int8", - size: 1, - read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setInt8(s, a, IS_LITTLE_ENDIAN); return 1; } - }, { - name: "Uint8", - size: 1, - read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setUint8(s, a, IS_LITTLE_ENDIAN); return 1; } - }, { - name: "Int16", - size: 2, - read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setInt16(s, a, IS_LITTLE_ENDIAN); return 2; } - }, { - name: "Uint16", - size: 2, - read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setUint16(s, a, IS_LITTLE_ENDIAN); return 2; } - }, { - name: "Int32", - size: 4, - read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setInt32(s, a, IS_LITTLE_ENDIAN); return 4; } - }, { - name: "Uint32", - size: 4, - read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setUint32(s, a, IS_LITTLE_ENDIAN); return 4; } - }, { - name: "Int64", - size: 8, - read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setBigInt64(s, a, IS_LITTLE_ENDIAN); return 8; } - }, { - name: "Uint64", - size: 8, - read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setBigUint64(s, a, IS_LITTLE_ENDIAN); return 8; } - }, { - name: "Float", - size: 4, - read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setFloat32(s, a, IS_LITTLE_ENDIAN); return 4; } - }, { - name: "Float32", - size: 4, - read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setFloat32(s, a, IS_LITTLE_ENDIAN); return 4; } - }, { - name: "Double", - size: 8, - read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setFloat64(s, a, IS_LITTLE_ENDIAN); return 8; } - }, { - name: "String", - size: 4, - read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), - write: (v, s, a) => { - let size = a.length; - v.setUint32(s, size, true); - for (let i = 0, s2 = s + 4; i < size; i++) { - v.setUint8(s2 + i, a[i], true); - } - return size + 4; - } + { + name: 'Char', + size: 1, + read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), + write: (v, s, a) => { + v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN) + return 1 + } + }, + { + name: 'Int8', + size: 1, + read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt8(s, a, IS_LITTLE_ENDIAN) + return 1 + } + }, + { + name: 'Uint8', + size: 1, + read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint8(s, a, IS_LITTLE_ENDIAN) + return 1 + } + }, + { + name: 'Int16', + size: 2, + read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt16(s, a, IS_LITTLE_ENDIAN) + return 2 + } + }, + { + name: 'Uint16', + size: 2, + read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint16(s, a, IS_LITTLE_ENDIAN) + return 2 + } + }, + { + name: 'Int32', + size: 4, + read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Uint32', + size: 4, + read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Int64', + size: 8, + read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigInt64(s, a, IS_LITTLE_ENDIAN) + return 8 + } + }, + { + name: 'Uint64', + size: 8, + read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigUint64(s, a, IS_LITTLE_ENDIAN) + return 8 + } + }, + { + name: 'Float', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Float32', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Double', + size: 8, + read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat64(s, a, IS_LITTLE_ENDIAN) + return 8 + } + }, + { + name: 'String', + size: 4, + read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), + write: (v, s, a) => { + let size = a.length + v.setUint32(s, size, true) + for (let i = 0, s2 = s + 4; i < size; i++) { + v.setUint8(s2 + i, a[i], true) + } + return size + 4 } -]; + } +] let typeIndex = [], - typeSize = []; + typeSize = [] let readFunc = [], - writeFunc = []; + writeFunc = [] for (let i = 0; i < basicTypes.length; i++) { - let ti = basicTypes[i]; - typeIndex[ti.name] = i; - typeSize[i] = ti.size; - readFunc[i] = ti.read; - writeFunc[i] = ti.write; + let ti = basicTypes[i] + typeIndex[ti.name] = i + typeSize[i] = ti.size + readFunc[i] = ti.read + writeFunc[i] = ti.write } -const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE]; -const DYN_TYPE_SIZE = typeSize[DYN_TYPE]; -const DYN_READ = readFunc[DYN_TYPE]; -const DYN_WRITE = writeFunc[DYN_TYPE]; +const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE] +const DYN_TYPE_SIZE = typeSize[DYN_TYPE] +const DYN_READ = readFunc[DYN_TYPE] +const DYN_WRITE = writeFunc[DYN_TYPE] function parseType(typeStr, includeMessages) { - - let a = typeStr.split('['), - name = a[0].trim(); - - let size, isComplex = false; - - let type = typeIndex[name]; - - if (type != undefined) { - size = typeSize[type]; - } else if (includeMessages && includeMessages[name]) { - type = includeMessages[name]; - size = type.size; - isComplex = true; - } else { - throw new Error(`Unknown type: ${ name }, if is complex type you must define before the struct. `); - } - - let length = parseInt(a[1]); - - return { - typeIndex: type, - typeSize: size, - length: isNaN(length) ? 0 : length, - isArray: a.length === 2, - isComplex: isComplex - }; + let a = typeStr.split('['), + name = a[0].trim() + + let size, + isComplex = false + + let type = typeIndex[name] + + if (type !== undefined) { + size = typeSize[type] + } else if (includeMessages && includeMessages[name]) { + type = includeMessages[name] + size = type.size + isComplex = true + } else { + throw new Error(`Unknown type: ${name}, if is complex type you must define before the struct. `) + } + + let length = parseInt(a[1]) + + return { + typeIndex: type, + typeSize: size, + length: isNaN(length) ? 0 : length, + isArray: a.length === 2, + isComplex: isComplex + } } /** * class Struct */ export class Struct { - constructor(schema, includeMessages) { - - this._id = 0; - this._size = 0; - this._fields = null; - this._schema = null; - - this._includeMessages = includeMessages; - - this.set(schema); + constructor(schema, includeMessages) { + this._id = 0 + this._size = 0 + this._fields = null + this._schema = null + + this._includeMessages = includeMessages + + this.set(schema) + } + + get schema() { + return this._schema + } + + get id() { + return this._id + } + + get size() { + return this._size + } + + get fields() { + return this._fields + } + + set(schema) { + if (schema) { + this._id = schema.id || 0 + this._size = 0 + this._fields = new Array(schema.fields.length) + this._schema = schema + this._init() } + } - get schema() { - return this._schema; - } + _init() { + let schemaFields = this._schema.fields - get id() { - return this._id; - } + let offset = 0 - get size() { - return this._size; - } + for (let i = 0, len = schemaFields.length; i < len; i++) { + let si = schemaFields[i], + tp = parseType(si.type, this._includeMessages) - get fields() { - return this._fields; - } + this._fields[i] = { + name: si.name, + type: si.type, + _offset: offset, + _prop: tp + } - set(schema) { - if (schema) { - this._id = schema.id || 0; - this._size = 0; - this._fields = new Array(schema.fields.length); - this._schema = schema; - this._init(); + if (tp.isArray) { + if (tp.length === 0) { + offset += DYN_TYPE_SIZE + } else { + offset += tp.typeSize * tp.length } + } else { + offset += tp.typeSize + } } - _init() { - - let schemaFields = this._schema.fields; - - let offset = 0; - - for (let i = 0, len = schemaFields.length; i < len; i++) { - - let si = schemaFields[i], - tp = parseType(si.type, this._includeMessages); - - this._fields[i] = { - name: si.name, - type: si.type, - _offset: offset, - _prop: tp - }; - - if (tp.isArray) { - if (tp.length === 0) { - offset += DYN_TYPE_SIZE; - } else { - offset += tp.typeSize * tp.length; - } - } else { - offset += tp.typeSize; - } - } - - this._size = offset; - } + this._size = offset + } } // uint32 seq; //!< Sequence number @@ -216,336 +261,312 @@ export class Struct { // uint8 msg_id; //!< Message type ID export const HEADER_STRUCT = new Struct({ - fields: [ - { 'name': "seq", 'type': "Uint32" }, - { 'name': "cls", 'type': "Uint8" }, - { 'name': "msg_id", 'type': "Uint8" }, - { 'name': "size", 'type': "Uint32" } - ] -}); + fields: [ + { name: 'seq', type: 'Uint32' }, + { name: 'cls', type: 'Uint8' }, + { name: 'msg_id', type: 'Uint8' }, + { name: 'size', type: 'Uint32' } + ] +}) /** * class Buffer */ export class Buffer { - constructor(arrayBuffer) { - this._dataView = new DataView(arrayBuffer); - this._dynamicOffset = 0; + constructor(arrayBuffer) { + this._dataView = new DataView(arrayBuffer) + this._dynamicOffset = 0 + } + + // TODO: перенести в модуль messages + // а модуль messages генерализировать + static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { + let res = [] + let buf = new Buffer(data) + let cur = 0 + while (cur < buf.size) { + let h = buf.deserialize(headerStruct, cur), + m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__) + m.__MSG_ID__ = h.msg_id + cur += h.__SIZE__ + m.__SIZE__ + res.push(m) } - - // TODO: перенести в модуль messages - // а модуль messages генерализировать - static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { - let res = []; - let buf = new Buffer(data); - let cur = 0; - while (cur < buf.size) { - let h = buf.deserialize(headerStruct, cur), - m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__); - m.__MSG_ID__ = h.msg_id; - cur += h.__SIZE__ + m.__SIZE__; - res.push(m); - } - return res; - } - - static mergeArrayBuffers(tArrs, type = Uint8Array) { - const ret = new (type)(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)); - let off = 0; - tArrs.forEach((tArr) => { - ret.set(new (type)(tArr), off); - off += tArr.byteLength; - }); - return ret; - } - - static appendBuffer(buffer1, buffer2) { - var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); - tmp.set(new Uint8Array(buffer1), 0); - tmp.set(new Uint8Array(buffer2), buffer1.byteLength); - return tmp.buffer; - } - - static calcSize(fields, includeMessages) { - - let size = 0; - - for (let i = 0, len = fields.length; i < len; i++) { - - let fi = fields[i], - tp = fi._prop = parseType(fi.type, includeMessages); - - if (tp.isArray) { - - if (tp.isComplex) { - if (tp.length === 0) { - size += DYN_TYPE_SIZE; - } - for (let i = 0; i < fi.value.length; i++) { - let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages); - size += Buffer.calcSize(arr, includeMessages); - } - } else { - - let arrayLength = 0; - - // Dynamic size array - if (tp.length === 0) { - arrayLength = fi.value.length; - size += tp.typeSize * arrayLength + DYN_TYPE_SIZE; // for dynamic array length descriptor - } else { - // static size array - arrayLength = tp.length; - size += tp.typeSize * arrayLength; - } - - if (tp.typeIndex === typeIndex.String) { - fi._bytes = []; - for (let i = 0; i < arrayLength; i++) { - let b = encodeUTF8(fi.value[i] || ""); - fi._bytes.push(b); - size += b.length; - } - } - } - - } else if (tp.typeIndex === typeIndex.String) { - fi._bytes = encodeUTF8(fi.value || ""); - size += tp.typeSize + fi._bytes.length; - } else { - - if (tp.isComplex) { - size += Buffer.calcSize(fi.value, includeMessages); - } else { - size += tp.typeSize; - } + return res + } + + static mergeArrayBuffers(tArrs, type = Uint8Array) { + const ret = new type(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)) + let off = 0 + tArrs.forEach((tArr) => { + ret.set(new type(tArr), off) + off += tArr.byteLength + }) + return ret + } + + static appendBuffer(buffer1, buffer2) { + var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength) + tmp.set(new Uint8Array(buffer1), 0) + tmp.set(new Uint8Array(buffer2), buffer1.byteLength) + return tmp.buffer + } + + static calcSize(fields, includeMessages) { + let size = 0 + + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + tp = (fi._prop = parseType(fi.type, includeMessages)) + + if (tp.isArray) { + if (tp.isComplex) { + if (tp.length === 0) { + size += DYN_TYPE_SIZE + } + for (let i = 0; i < fi.value.length; i++) { + let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages) + size += Buffer.calcSize(arr, includeMessages) + } + } else { + let arrayLength = 0 + + // Dynamic size array + if (tp.length === 0) { + arrayLength = fi.value.length + size += tp.typeSize * arrayLength + DYN_TYPE_SIZE // for dynamic array length descriptor + } else { + // static size array + arrayLength = tp.length + size += tp.typeSize * arrayLength + } + + if (tp.typeIndex === typeIndex.String) { + fi._bytes = [] + for (let i = 0; i < arrayLength; i++) { + let b = encodeUTF8(fi.value[i] || '') + fi._bytes.push(b) + size += b.length } + } } - - return size; - } - - static createValueArray(schemaFields, obj, includeMessages) { - - const len = schemaFields.length; - - let arr = new Array(len); - - for (let k = 0; k < len; k++) { - - let sk = schemaFields[k], - type = sk.type; - - if (includeMessages && includeMessages[type]) { - arr[k] = { - 'value': Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), - 'type': type - } - } else { - arr[k] = { 'value': obj[sk.name], 'type': type }; - } + } else if (tp.typeIndex === typeIndex.String) { + fi._bytes = encodeUTF8(fi.value || '') + size += tp.typeSize + fi._bytes.length + } else { + if (tp.isComplex) { + size += Buffer.calcSize(fi.value, includeMessages) + } else { + size += tp.typeSize } - - return arr; + } } - static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { + return size + } - let arr = Buffer.createValueArray(struct.fields, obj, includeMessages); + static createValueArray(schemaFields, obj, includeMessages) { + const len = schemaFields.length - let messageSize = Buffer.calcSize(arr, includeMessages); + let arr = new Array(len) - let headerBuf = Buffer.serializeObj(headerStruct.fields, { - seq: obj.seq, - size: messageSize, - cls: obj.cls, - msg_id: struct.id - }, - includeMessages); + for (let k = 0; k < len; k++) { + let sk = schemaFields[k], + type = sk.type - return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)); + if (includeMessages && includeMessages[type]) { + arr[k] = { + value: Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), + type: type + } + } else { + arr[k] = { value: obj[sk.name], type: type } + } } - static serializeObj(schemaFields, obj, includeMessages) { + return arr + } - let arr = Buffer.createValueArray(schemaFields, obj, includeMessages); + static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { + let arr = Buffer.createValueArray(struct.fields, obj, includeMessages) - return Buffer.serialize(arr, includeMessages); - } - - static writeDataView(fields, dataView, includeMessages, offset = 0) { + let messageSize = Buffer.calcSize(arr, includeMessages) - for (let i = 0, len = fields.length; i < len; i++) { + let headerBuf = Buffer.serializeObj( + headerStruct.fields, + { + seq: obj.seq, + size: messageSize, + cls: obj.cls, + msg_id: struct.id + }, + includeMessages + ) - let fi = fields[i], - p = fi._prop; + return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)) + } - if (p.isArray) { + static serializeObj(schemaFields, obj, includeMessages) { + let arr = Buffer.createValueArray(schemaFields, obj, includeMessages) - let arrayLength = p.length; + return Buffer.serialize(arr, includeMessages) + } - // Setting array size value for dynamic array size - if (arrayLength === 0) { - arrayLength = fi.value.length; - offset += DYN_WRITE(dataView, offset, fi.value.length); - } + static writeDataView(fields, dataView, includeMessages, offset = 0) { + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + p = fi._prop - // Write array - for (let j = 0; j < arrayLength; j++) { - let val = fi._bytes && fi._bytes[j] || fi.value[j]; - if (p.isComplex) { - let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages); - let size = Buffer.calcSize(valArr, includeMessages); - Buffer.writeDataView(valArr, dataView, includeMessages, offset); - offset += size; - } else { - offset += writeFunc[p.typeIndex](dataView, offset, val); - } - } + if (p.isArray) { + let arrayLength = p.length - } else { - - if (p.isComplex) { - let size = Buffer.calcSize(fi.value, includeMessages); - Buffer.writeDataView(fi.value, dataView, includeMessages, offset); - offset += size; - } else { - let val = fi._bytes || fi.value; - offset += writeFunc[p.typeIndex](dataView, offset, val); - } - } + // Setting array size value for dynamic array size + if (arrayLength === 0) { + arrayLength = fi.value.length + offset += DYN_WRITE(dataView, offset, fi.value.length) } - return offset; - } - - static serialize(fields, includeMessages) { - - let allSize = Buffer.calcSize(fields, includeMessages); - - let arrayBuffer = new ArrayBuffer(allSize), - dv = new DataView(arrayBuffer); - - Buffer.writeDataView(fields, dv, includeMessages); - - return arrayBuffer; - } - - get size() { - return this._dataView.buffer.byteLength; - } - - get dataView() { - return this._dataView; - } - - set(arrayBuffer) { - this._dataView = null; - this._dataView = new DataView(arrayBuffer); - } - - deserialize(struct, offset = 0, sizeOffset = 0) { - this._dynamicOffset = 0; - let res = this.__deserialize__(struct, offset, sizeOffset); - res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset; - return res; + // Write array + for (let j = 0; j < arrayLength; j++) { + let val = (fi._bytes && fi._bytes[j]) || fi.value[j] + if (p.isComplex) { + let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages) + let size = Buffer.calcSize(valArr, includeMessages) + Buffer.writeDataView(valArr, dataView, includeMessages, offset) + offset += size + } else { + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } else { + if (p.isComplex) { + let size = Buffer.calcSize(fi.value, includeMessages) + Buffer.writeDataView(fi.value, dataView, includeMessages, offset) + offset += size + } else { + let val = fi._bytes || fi.value + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } } - __deserialize__(struct, offset, sizeOffset) { - - this._includeMessages = struct._includeMessages; + return offset + } - let fields = struct.fields, - dv = this._dataView, - res = {}; + static serialize(fields, includeMessages) { + let allSize = Buffer.calcSize(fields, includeMessages) - let currOffset = 0; + let arrayBuffer = new ArrayBuffer(allSize), + dv = new DataView(arrayBuffer) - for (let f = 0, len = fields.length; f < len; f++) { + Buffer.writeDataView(fields, dv, includeMessages) - let fi = fields[f], - p = fi._prop; + return arrayBuffer + } - currOffset = offset + fi._offset; + get size() { + return this._dataView.buffer.byteLength + } - if (p.isArray) { + get dataView() { + return this._dataView + } - if (p.length === 0) { + set(arrayBuffer) { + this._dataView = null + this._dataView = new DataView(arrayBuffer) + } - // - // Dynamic size array - // + deserialize(struct, offset = 0, sizeOffset = 0) { + this._dynamicOffset = 0 + let res = this.__deserialize__(struct, offset, sizeOffset) + res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset + return res + } - let length = DYN_READ(dv, currOffset + this._dynamicOffset); + __deserialize__(struct, offset, sizeOffset) { + this._includeMessages = struct._includeMessages - res[fi.name] = new Array(length); + let fields = struct.fields, + dv = this._dataView, + res = {} - let currOffset_dyn = DYN_TYPE_SIZE + currOffset; + let currOffset = 0 - if (p.typeIndex === typeIndex.String) { - for (let j = 0; j < length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize); - this._dynamicOffset += dv.getUint32(currOffset_dyn + this._dynamicOffset + j * p.typeSize, true); - } - } else { - if (p.isComplex) { - for (let j = 0; j < length; j++) { - res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset_dyn + j * p.typeSize, sizeOffset); - } - } else { - for (let j = 0; j < length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize); - } - } - } + for (let f = 0, len = fields.length; f < len; f++) { + let fi = fields[f], + p = fi._prop - this._dynamicOffset += length * p.typeSize; + currOffset = offset + fi._offset - } else { + if (p.isArray) { + if (p.length === 0) { + // + // Dynamic size array + // - // - //Static size array - // + let length = DYN_READ(dv, currOffset + this._dynamicOffset) - res[fi.name] = new Array(p.length); + res[fi.name] = new Array(length) - if (p.typeIndex === typeIndex.String) { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize); - this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true); - } - } else { - if (p.isComplex) { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset + j * p.typeSize, sizeOffset); - } - } else { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize); - } - } - } - } + let currOffset_dyn = DYN_TYPE_SIZE + currOffset + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize) + this._dynamicOffset += dv.getUint32(currOffset_dyn + this._dynamicOffset + j * p.typeSize, true) + } + } else { + if (p.isComplex) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset_dyn + j * p.typeSize, sizeOffset) + } } else { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize) + } + } + } - if (p.isComplex) { - - res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset); - - } else { + this._dynamicOffset += length * p.typeSize + } else { + // + //Static size array + // - res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset); + res[fi.name] = new Array(p.length) - if (p.typeIndex === typeIndex.String) { - this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true); - } - } + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize) + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true) + } + } else { + if (p.isComplex) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset + j * p.typeSize, sizeOffset) + } + } else { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize) + } } + } } + } else { + if (p.isComplex) { + res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset) + } else { + res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset) - return res; + if (p.typeIndex === typeIndex.String) { + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true) + } + } + } } + + return res + } } /** @@ -554,40 +575,37 @@ export class Buffer { * @param {*} headerSchema - message header schema */ export function initializeMessages(messagesJson, headerSchema) { - - let res = { - __id__: [], - __name__: [], - HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT - }; - - for (let m of getKeysWithSortById(messagesJson)) { - - let name = m.trim(), - messageObj = messagesJson[m], - msg = "MSG_" + name.toUpperCase(), - id = messageObj.id; - - if (!res.__id__[id]) { - let msg_struct = new Struct(messageObj, res); - - res.__id__[id] = msg_struct; - res.__name__[id] = m.trim(); - res[msg] = msg_struct; - res[name] = msg_struct; - - } else { - console.warn(`Warning: message ${ id } ${ msg } already exists.`); - } + let res = { + __id__: [], + __name__: [], + HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT + } + + for (let m of getKeysWithSortById(messagesJson)) { + let name = m.trim(), + messageObj = messagesJson[m], + msg = 'MSG_' + name.toUpperCase(), + id = messageObj.id + + if (!res.__id__[id]) { + let msg_struct = new Struct(messageObj, res) + + res.__id__[id] = msg_struct + res.__name__[id] = m.trim() + res[msg] = msg_struct + res[name] = msg_struct + } else { + console.warn(`Warning: message ${id} ${msg} already exists.`) } + } - return res; + return res } const getKeysWithSortById = (obj) => { - let keys = Object.keys(obj); - keys.sort((a, b) => { - return obj[a].id - obj[b].id; - }); - return keys; + let keys = Object.keys(obj) + keys.sort((a, b) => { + return obj[a].id - obj[b].id + }) + return keys } diff --git a/port/js/src/utf8.js b/port/js/src/utf8.js index f58e51e..2171234 100644 --- a/port/js/src/utf8.js +++ b/port/js/src/utf8.js @@ -1,63 +1,63 @@ -'use strict'; +'use strict' // This is free and unencumbered software released into the public domain. // https://gist.github.com/pascaldekloe // Marshals a string to an Uint8Array. export function encodeUTF8(s) { - var i = 0, bytes = new Uint8Array(s.length * 4); - for (var ci = 0; ci != s.length; ci++) { - var c = s.charCodeAt(ci); - if (c < 128) { - bytes[i++] = c; - continue; - } - if (c < 2048) { - bytes[i++] = c >> 6 | 192; - } else { - if (c > 0xd7ff && c < 0xdc00) { - if (++ci >= s.length) - throw new Error('UTF-8 encode: incomplete surrogate pair'); - var c2 = s.charCodeAt(ci); - if (c2 < 0xdc00 || c2 > 0xdfff) - throw new Error('UTF-8 encode: second surrogate character 0x' + c2.toString(16) + ' at index ' + ci + ' out of range'); - c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff); - bytes[i++] = c >> 18 | 240; - bytes[i++] = c >> 12 & 63 | 128; - } else bytes[i++] = c >> 12 | 224; - bytes[i++] = c >> 6 & 63 | 128; - } - bytes[i++] = c & 63 | 128; + var i = 0, + bytes = new Uint8Array(s.length * 4) + for (var ci = 0; ci !== s.length; ci++) { + var c = s.charCodeAt(ci) + if (c < 128) { + bytes[i++] = c + continue } - return bytes.subarray(0, i); -}; + if (c < 2048) { + bytes[i++] = (c >> 6) | 192 + } else { + if (c > 0xd7ff && c < 0xdc00) { + if (++ci >= s.length) throw new Error('UTF-8 encode: incomplete surrogate pair') + var c2 = s.charCodeAt(ci) + if (c2 < 0xdc00 || c2 > 0xdfff) + throw new Error( + 'UTF-8 encode: second surrogate character 0x' + c2.toString(16) + ' at index ' + ci + ' out of range' + ) + c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff) + bytes[i++] = (c >> 18) | 240 + bytes[i++] = ((c >> 12) & 63) | 128 + } else bytes[i++] = (c >> 12) | 224 + bytes[i++] = ((c >> 6) & 63) | 128 + } + bytes[i++] = (c & 63) | 128 + } + return bytes.subarray(0, i) +} // Unmarshals a string from an Uint8Array. export function decodeUTF8(bytes) { - var i = 0, s = ''; - while (i < bytes.length) { - var c = bytes[i++]; - if (c > 127) { - if (c > 191 && c < 224) { - if (i >= bytes.length) - throw new Error('UTF-8 decode: incomplete 2-byte sequence'); - c = (c & 31) << 6 | bytes[i++] & 63; - } else if (c > 223 && c < 240) { - if (i + 1 >= bytes.length) - throw new Error('UTF-8 decode: incomplete 3-byte sequence'); - c = (c & 15) << 12 | (bytes[i++] & 63) << 6 | bytes[i++] & 63; - } else if (c > 239 && c < 248) { - if (i + 2 >= bytes.length) - throw new Error('UTF-8 decode: incomplete 4-byte sequence'); - c = (c & 7) << 18 | (bytes[i++] & 63) << 12 | (bytes[i++] & 63) << 6 | bytes[i++] & 63; - } else throw new Error('UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1)); - } - if (c <= 0xffff) s += String.fromCharCode(c); - else if (c <= 0x10ffff) { - c -= 0x10000; - s += String.fromCharCode(c >> 10 | 0xd800) - s += String.fromCharCode(c & 0x3FF | 0xdc00) - } else throw new Error('UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach'); + var i = 0, + s = '' + while (i < bytes.length) { + var c = bytes[i++] + if (c > 127) { + if (c > 191 && c < 224) { + if (i >= bytes.length) throw new Error('UTF-8 decode: incomplete 2-byte sequence') + c = ((c & 31) << 6) | (bytes[i++] & 63) + } else if (c > 223 && c < 240) { + if (i + 1 >= bytes.length) throw new Error('UTF-8 decode: incomplete 3-byte sequence') + c = ((c & 15) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) + } else if (c > 239 && c < 248) { + if (i + 2 >= bytes.length) throw new Error('UTF-8 decode: incomplete 4-byte sequence') + c = ((c & 7) << 18) | ((bytes[i++] & 63) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) + } else throw new Error('UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1)) } - return s; -}; \ No newline at end of file + if (c <= 0xffff) s += String.fromCharCode(c) + else if (c <= 0x10ffff) { + c -= 0x10000 + s += String.fromCharCode((c >> 10) | 0xd800) + s += String.fromCharCode((c & 0x3ff) | 0xdc00) + } else throw new Error('UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach') + } + return s +} diff --git a/port/js/tests/messgen.test.js b/port/js/tests/messgen.test.js index 02d6eeb..2a497d7 100644 --- a/port/js/tests/messgen.test.js +++ b/port/js/tests/messgen.test.js @@ -1,491 +1,475 @@ -'use strict'; +'use strict' -import {Buffer, Struct, HEADER_STRUCT, initializeMessages} from '../src/messgen.js'; +import { Buffer, Struct, HEADER_STRUCT, initializeMessages } from '../src/messgen.js' describe('Serialization deserialization tests', () => { - it('Basic types', () => { - - let srcStruct = new Struct({ - "id": 2, - "fields": [ - { name: "type_Int8", type: "Int8" }, - { name: "type_Uint8", type: "Uint8" }, - { name: "type_Int16", type: "Int16" }, - { name: "type_Uint16", type: "Uint16" }, - { name: "type_Int32", type: "Int32" }, - { name: "type_Uint32", type: "Uint32" }, - { name: "type_Int64", type: "Int64" }, - { name: "type_Uint64", type: "Uint64" }, - { name: "type_String", type: "String" }, - { name: "type_Double", type: "Double" }, - { name: "type_Char", type: "Char" } - ] - }); - - let srcData = { - type_Int8: 8, - type_Uint8: 8, - type_Int16: 8, - type_Uint16: 8, - type_Int32: 8, - type_Uint32: 8, - type_Int64: BigInt(8), - type_Uint64: BigInt(8), - type_String: "This is test string", - type_Double: -Math.PI, - type_Char: 'A' - }; - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); - - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); - - let res = new Buffer(b).deserialize(srcStruct); - - expect(res).toEqual(srcData); - }); - - it('Basic types fixed array size', () => { - - const ARRAY_SIZE = 100; - - let srcStruct = new Struct({ - "id": 2, - "fields": [ - { name: "type_Int8", type: `Int8[${ARRAY_SIZE}]` }, - { name: "type_Uint8", type: `Uint8[${ARRAY_SIZE}]` }, - { name: "type_Int16", type: `Int16[${ARRAY_SIZE}]` }, - { name: "type_Uint16", type: `Uint16[${ARRAY_SIZE}]` }, - { name: "type_Int32", type: `Int32[${ARRAY_SIZE}]` }, - { name: "type_Uint32", type: `Uint32[${ARRAY_SIZE}]` }, - { name: "type_Int64", type: `Int64[${ARRAY_SIZE}]` }, - { name: "type_Uint64", type: `Uint64[${ARRAY_SIZE}]` }, - { name: "type_String", type: `String[${ARRAY_SIZE}]` }, - { name: "type_Double", type: `Double[${ARRAY_SIZE}]` }, - { name: "type_Char", type: `Char[${ARRAY_SIZE}]` } - ] - }); - - let srcData = { - type_Int8: new Array(ARRAY_SIZE), - type_Uint8: new Array(ARRAY_SIZE), - type_Int16: new Array(ARRAY_SIZE), - type_Uint16: new Array(ARRAY_SIZE), - type_Int32: new Array(ARRAY_SIZE), - type_Uint32: new Array(ARRAY_SIZE), - type_Int64: new Array(ARRAY_SIZE), - type_Uint64: new Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - }; - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i; - srcData.type_Uint8[i] = i; - srcData.type_Int16[i] = i; - srcData.type_Uint16[i] = i; - srcData.type_Int32[i] = i; - srcData.type_Uint32[i] = i; - srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i); - srcData.type_Uint64[i] = BigInt(i); - srcData.type_String[i] = "string-" + i; - srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0; - srcData.type_Char[i] = 'a'; - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); - - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); - - let res = new Buffer(b).deserialize(srcStruct); - - expect(res).toEqual(srcData); - }); - - it('Basic types dynamic array size', () => { - - const ARRAY_SIZE = 100; - - let srcStruct = new Struct({ - "id": 2, - "fields": [ - { name: "type_Int8", type: `Int8[]` }, - { name: "type_Uint8", type: `Uint8[]` }, - { name: "type_Int16", type: `Int16[]` }, - { name: "type_Uint16", type: `Uint16[]` }, - { name: "type_Int32", type: `Int32[]` }, - { name: "type_Uint32", type: `Uint32[]` }, - { name: "type_Int64", type: `Int64[]` }, - { name: "type_Uint64", type: `Uint64[]` }, - { name: "type_String", type: `String[]` }, - { name: "type_Double", type: `Double[]` }, - { name: "type_Char", type: `Char[]` } - ] - }); - - let srcData = { - type_Int8: new Array(ARRAY_SIZE), - type_Uint8: new Array(ARRAY_SIZE), - type_Int16: new Array(ARRAY_SIZE), - type_Uint16: new Array(ARRAY_SIZE), - type_Int32: new Array(ARRAY_SIZE), - type_Uint32: new Array(ARRAY_SIZE), - type_Int64: new Array(ARRAY_SIZE), - type_Uint64: new Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - }; - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i; - srcData.type_Uint8[i] = i; - srcData.type_Int16[i] = i; - srcData.type_Uint16[i] = i; - srcData.type_Int32[i] = i; - srcData.type_Uint32[i] = i; - srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i); - srcData.type_Uint64[i] = BigInt(i); - srcData.type_String[i] = "string-" + i; - srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0; - srcData.type_Char[i] = 'A'; - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); - - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); - - let res = new Buffer(b).deserialize(srcStruct); - - expect(res).toEqual(srcData); - }); - - it('Basic message with header', () => { - - let srcStruct = new Struct({ - "id": 2, - "fields": [ - { name: "type_Int8", type: "Int8" }, - { name: "type_Uint8", type: "Uint8" }, - { name: "type_Int16", type: "Int16" }, - { name: "type_Uint16", type: "Uint16" }, - { name: "type_Int32", type: "Int32" }, - { name: "type_Uint32", type: "Uint32" }, - { name: "type_Int64", type: "Int64" }, - { name: "type_Uint64", type: "Uint64" }, - { name: "type_String", type: "String" }, - { name: "type_Double", type: "Double" }, - { name: "type_Char", type: "Char" } - ] - }); - - let srcData = { - type_Int8: 8, - type_Uint8: 8, - type_Int16: -16, - type_Uint16: 16, - type_Int32: -32, - type_Uint32: 32, - type_Int64: BigInt(-64), - type_Uint64: BigInt(64), - type_String: "This is test string", - type_Double: Math.PI, - type_Char: 'A' - }; - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); - - let b = Buffer.serializeMessage(srcStruct, srcData); - - let buf = new Buffer(b); - let headerRes = buf.deserialize(HEADER_STRUCT, 0); - let res = buf.deserialize(srcStruct, headerRes.__SIZE__); - - expect(res).toEqual(srcData); - }); - - it('Basic types fixed array size with header', () => { - - const ARRAY_SIZE = 100; - - let srcStruct = new Struct({ - "id": 2, - "fields": [ - { name: "type_Int8", type: `Int8[${ARRAY_SIZE}]` }, - { name: "type_Uint8", type: `Uint8[${ARRAY_SIZE}]` }, - { name: "type_Int16", type: `Int16[${ARRAY_SIZE}]` }, - { name: "type_Uint16", type: `Uint16[${ARRAY_SIZE}]` }, - { name: "type_Int32", type: `Int32[${ARRAY_SIZE}]` }, - { name: "type_Uint32", type: `Uint32[${ARRAY_SIZE}]` }, - { name: "type_Int64", type: `Int64[${ARRAY_SIZE}]` }, - { name: "type_Uint64", type: `Uint64[${ARRAY_SIZE}]` }, - { name: "type_String", type: `String[${ARRAY_SIZE}]` }, - { name: "type_Double", type: `Double[${ARRAY_SIZE}]` }, - { name: "type_Char", type: `Char[${ARRAY_SIZE}]` } - ] - }); - - let srcData = { - type_Int8: new Array(ARRAY_SIZE), - type_Uint8: new Array(ARRAY_SIZE), - type_Int16: new Array(ARRAY_SIZE), - type_Uint16: new Array(ARRAY_SIZE), - type_Int32: new Array(ARRAY_SIZE), - type_Uint32: new Array(ARRAY_SIZE), - type_Int64: new Array(ARRAY_SIZE), - type_Uint64: new Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - }; - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i; - srcData.type_Uint8[i] = i; - srcData.type_Int16[i] = i; - srcData.type_Uint16[i] = i; - srcData.type_Int32[i] = i; - srcData.type_Uint32[i] = i; - srcData.type_Int64[i] = BigInt(i); - srcData.type_Uint64[i] = BigInt(i); - srcData.type_String[i] = "string-" + i; - srcData.type_Double[i] = i * 12.45; - srcData.type_Char[i] = 'A'; - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); - - let b = Buffer.serializeMessage(srcStruct, srcData); - - let buf = new Buffer(b); - let headerRes = buf.deserialize(HEADER_STRUCT, 0); - let res = buf.deserialize(srcStruct, headerRes.__SIZE__); - - expect(res).toEqual(srcData); - }); - - it('Basic types dynamic array size with header', () => { - - const ARRAY_SIZE = 100; - - let srcStruct = new Struct({ - "id": 2, - "fields": [ - { name: "type_Int8", type: `Int8[]` }, - { name: "type_Uint8", type: `Uint8[]` }, - { name: "type_Int16", type: `Int16[]` }, - { name: "type_Uint16", type: `Uint16[]` }, - { name: "type_Int32", type: `Int32[]` }, - { name: "type_Uint32", type: `Uint32[]` }, - { name: "type_Int64", type: `Int64[]` }, - { name: "type_Uint64", type: `Uint64[]` }, - { name: "type_String", type: `String[]` }, - { name: "type_Double", type: `Double[]` }, - { name: "type_Char", type: `Char[]` } - ] - }); - - let srcData = { - type_Int8: new Array(ARRAY_SIZE), - type_Uint8: new Array(ARRAY_SIZE), - type_Int16: new Array(ARRAY_SIZE), - type_Uint16: new Array(ARRAY_SIZE), - type_Int32: new Array(ARRAY_SIZE), - type_Uint32: new Array(ARRAY_SIZE), - type_Int64: new Array(ARRAY_SIZE), - type_Uint64: new Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - }; - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i; - srcData.type_Uint8[i] = i; - srcData.type_Int16[i] = i; - srcData.type_Uint16[i] = i; - srcData.type_Int32[i] = i; - srcData.type_Uint32[i] = i; - srcData.type_Int64[i] = BigInt(i); - srcData.type_Uint64[i] = BigInt(i); - srcData.type_String[i] = "string-" + i; - srcData.type_Double[i] = i * 12.45; - srcData.type_Char[i] = 'A'; - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); - - let b = Buffer.serializeMessage(srcStruct, srcData); - - let buf = new Buffer(b); - let headerRes = buf.deserialize(HEADER_STRUCT, 0); - let res = buf.deserialize(srcStruct, headerRes.__SIZE__); - - expect(res).toEqual(srcData); - }); - - it('Complex type with dynamic array size', () => { - - let schema = { - "MyYZ": { - id: 100, - fields: [ - { "name": "y", "type": "Int8" }, - { "name": "z", "type": "Int16" }, - { "name": "s", "type": "String[]" }, - ] - }, - "Coords": { - "id": 111, - "fields": [ - { "name": "x", "type": "Int16" }, - { "name": "yz", "type": "MyYZ" }, - ] - }, - "Param": { - "id": 112, - "fields": [ - { "name": "coords", "type": "Coords[]" }, - { "name": "xxx", "type": "Uint8" } - ] - } - }; - - let includeMsg = initializeMessages(schema); - - let srcStruct = new Struct({ - "id": 2, - "fields": [ - { name: "a", type: "Int8" }, - { name: "param", type: "Param" } - ] - }, includeMsg); - - let srcData = { - a: 32, - param: { - coords: [{ - x: 5, - yz: { - y: 1, - z: 200, - s: ["aaaaa", "xxxx"] - } - }, { - x: 10, - yz: { - y: 4, - z: 800, - s: ["dddddd"] - } - }, { - x: 999, - yz: { - y: 5, - z: 1400, - s: ["e"] - } - }], - xxx: 16 - } - }; + it('Basic types', () => { + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: 'Int8' }, + { name: 'type_Uint8', type: 'Uint8' }, + { name: 'type_Int16', type: 'Int16' }, + { name: 'type_Uint16', type: 'Uint16' }, + { name: 'type_Int32', type: 'Int32' }, + { name: 'type_Uint32', type: 'Uint32' }, + { name: 'type_Int64', type: 'Int64' }, + { name: 'type_Uint64', type: 'Uint64' }, + { name: 'type_String', type: 'String' }, + { name: 'type_Double', type: 'Double' }, + { name: 'type_Char', type: 'Char' } + ] + }) - let valArr = Buffer.createValueArray(srcStruct.fields, srcData, includeMsg); - srcData.__SIZE__ = Buffer.calcSize(valArr, includeMsg); + let srcData = { + type_Int8: 8, + type_Uint8: 8, + type_Int16: 8, + type_Uint16: 8, + type_Int32: 8, + type_Uint32: 8, + type_Int64: BigInt(8), + type_Uint64: BigInt(8), + type_String: 'This is test string', + type_Double: -Math.PI, + type_Char: 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + + let res = new Buffer(b).deserialize(srcStruct) + + expect(res).toEqual(srcData) + }) + + it('Basic types fixed array size', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[${ARRAY_SIZE}]` }, + { name: 'type_Uint8', type: `Uint8[${ARRAY_SIZE}]` }, + { name: 'type_Int16', type: `Int16[${ARRAY_SIZE}]` }, + { name: 'type_Uint16', type: `Uint16[${ARRAY_SIZE}]` }, + { name: 'type_Int32', type: `Int32[${ARRAY_SIZE}]` }, + { name: 'type_Uint32', type: `Uint32[${ARRAY_SIZE}]` }, + { name: 'type_Int64', type: `Int64[${ARRAY_SIZE}]` }, + { name: 'type_Uint64', type: `Uint64[${ARRAY_SIZE}]` }, + { name: 'type_String', type: `String[${ARRAY_SIZE}]` }, + { name: 'type_Double', type: `Double[${ARRAY_SIZE}]` }, + { name: 'type_Char', type: `Char[${ARRAY_SIZE}]` } + ] + }) - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData, includeMsg); + let srcData = { + type_Int8: new Array(ARRAY_SIZE), + type_Uint8: new Array(ARRAY_SIZE), + type_Int16: new Array(ARRAY_SIZE), + type_Uint16: new Array(ARRAY_SIZE), + type_Int32: new Array(ARRAY_SIZE), + type_Uint32: new Array(ARRAY_SIZE), + type_Int64: new Array(ARRAY_SIZE), + type_Uint64: new Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 + srcData.type_Char[i] = 'a' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + + let res = new Buffer(b).deserialize(srcStruct) + + expect(res).toEqual(srcData) + }) + + it('Basic types dynamic array size', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[]` }, + { name: 'type_Uint8', type: `Uint8[]` }, + { name: 'type_Int16', type: `Int16[]` }, + { name: 'type_Uint16', type: `Uint16[]` }, + { name: 'type_Int32', type: `Int32[]` }, + { name: 'type_Uint32', type: `Uint32[]` }, + { name: 'type_Int64', type: `Int64[]` }, + { name: 'type_Uint64', type: `Uint64[]` }, + { name: 'type_String', type: `String[]` }, + { name: 'type_Double', type: `Double[]` }, + { name: 'type_Char', type: `Char[]` } + ] + }) - let res = new Buffer(b, includeMsg).deserialize(srcStruct); + let srcData = { + type_Int8: new Array(ARRAY_SIZE), + type_Uint8: new Array(ARRAY_SIZE), + type_Int16: new Array(ARRAY_SIZE), + type_Uint16: new Array(ARRAY_SIZE), + type_Int32: new Array(ARRAY_SIZE), + type_Uint32: new Array(ARRAY_SIZE), + type_Int64: new Array(ARRAY_SIZE), + type_Uint64: new Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 + srcData.type_Char[i] = 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + + let res = new Buffer(b).deserialize(srcStruct) + + expect(res).toEqual(srcData) + }) + + it('Basic message with header', () => { + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: 'Int8' }, + { name: 'type_Uint8', type: 'Uint8' }, + { name: 'type_Int16', type: 'Int16' }, + { name: 'type_Uint16', type: 'Uint16' }, + { name: 'type_Int32', type: 'Int32' }, + { name: 'type_Uint32', type: 'Uint32' }, + { name: 'type_Int64', type: 'Int64' }, + { name: 'type_Uint64', type: 'Uint64' }, + { name: 'type_String', type: 'String' }, + { name: 'type_Double', type: 'Double' }, + { name: 'type_Char', type: 'Char' } + ] + }) - expect(res).toEqual(srcData); - }); + let srcData = { + type_Int8: 8, + type_Uint8: 8, + type_Int16: -16, + type_Uint16: 16, + type_Int32: -32, + type_Uint32: 32, + type_Int64: BigInt(-64), + type_Uint64: BigInt(64), + type_String: 'This is test string', + type_Double: Math.PI, + type_Char: 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeMessage(srcStruct, srcData) + + let buf = new Buffer(b) + let headerRes = buf.deserialize(HEADER_STRUCT, 0) + let res = buf.deserialize(srcStruct, headerRes.__SIZE__) + + expect(res).toEqual(srcData) + }) + + it('Basic types fixed array size with header', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[${ARRAY_SIZE}]` }, + { name: 'type_Uint8', type: `Uint8[${ARRAY_SIZE}]` }, + { name: 'type_Int16', type: `Int16[${ARRAY_SIZE}]` }, + { name: 'type_Uint16', type: `Uint16[${ARRAY_SIZE}]` }, + { name: 'type_Int32', type: `Int32[${ARRAY_SIZE}]` }, + { name: 'type_Uint32', type: `Uint32[${ARRAY_SIZE}]` }, + { name: 'type_Int64', type: `Int64[${ARRAY_SIZE}]` }, + { name: 'type_Uint64', type: `Uint64[${ARRAY_SIZE}]` }, + { name: 'type_String', type: `String[${ARRAY_SIZE}]` }, + { name: 'type_Double', type: `Double[${ARRAY_SIZE}]` }, + { name: 'type_Char', type: `Char[${ARRAY_SIZE}]` } + ] + }) - it('Error if wrong order of complex type', () => { + let srcData = { + type_Int8: new Array(ARRAY_SIZE), + type_Uint8: new Array(ARRAY_SIZE), + type_Int16: new Array(ARRAY_SIZE), + type_Uint16: new Array(ARRAY_SIZE), + type_Int32: new Array(ARRAY_SIZE), + type_Uint32: new Array(ARRAY_SIZE), + type_Int64: new Array(ARRAY_SIZE), + type_Uint64: new Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = i * 12.45 + srcData.type_Char[i] = 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeMessage(srcStruct, srcData) + + let buf = new Buffer(b) + let headerRes = buf.deserialize(HEADER_STRUCT, 0) + let res = buf.deserialize(srcStruct, headerRes.__SIZE__) + + expect(res).toEqual(srcData) + }) + + it('Basic types dynamic array size with header', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[]` }, + { name: 'type_Uint8', type: `Uint8[]` }, + { name: 'type_Int16', type: `Int16[]` }, + { name: 'type_Uint16', type: `Uint16[]` }, + { name: 'type_Int32', type: `Int32[]` }, + { name: 'type_Uint32', type: `Uint32[]` }, + { name: 'type_Int64', type: `Int64[]` }, + { name: 'type_Uint64', type: `Uint64[]` }, + { name: 'type_String', type: `String[]` }, + { name: 'type_Double', type: `Double[]` }, + { name: 'type_Char', type: `Char[]` } + ] + }) - // wrong order - let schema = { - "First": { - id: 1, - fields: [ - { "name": "x", "type": "Second" }, - ] - }, - "Second": { - "id": 2, - "fields": [ - { "name": "xxx", "type": "Uint8" } - ] + let srcData = { + type_Int8: new Array(ARRAY_SIZE), + type_Uint8: new Array(ARRAY_SIZE), + type_Int16: new Array(ARRAY_SIZE), + type_Uint16: new Array(ARRAY_SIZE), + type_Int32: new Array(ARRAY_SIZE), + type_Uint32: new Array(ARRAY_SIZE), + type_Int64: new Array(ARRAY_SIZE), + type_Uint64: new Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = i * 12.45 + srcData.type_Char[i] = 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeMessage(srcStruct, srcData) + + let buf = new Buffer(b) + let headerRes = buf.deserialize(HEADER_STRUCT, 0) + let res = buf.deserialize(srcStruct, headerRes.__SIZE__) + + expect(res).toEqual(srcData) + }) + + it('Complex type with dynamic array size', () => { + let schema = { + MyYZ: { + id: 100, + fields: [ + { name: 'y', type: 'Int8' }, + { name: 'z', type: 'Int16' }, + { name: 's', type: 'String[]' } + ] + }, + Coords: { + id: 111, + fields: [ + { name: 'x', type: 'Int16' }, + { name: 'yz', type: 'MyYZ' } + ] + }, + Param: { + id: 112, + fields: [ + { name: 'coords', type: 'Coords[]' }, + { name: 'xxx', type: 'Uint8' } + ] + } + } + + let includeMsg = initializeMessages(schema) + + let srcStruct = new Struct( + { + id: 2, + fields: [ + { name: 'a', type: 'Int8' }, + { name: 'param', type: 'Param' } + ] + }, + includeMsg + ) + + let srcData = { + a: 32, + param: { + coords: [ + { + x: 5, + yz: { + y: 1, + z: 200, + s: ['aaaaa', 'xxxx'] } - }; - - expect(() => { - initializeMessages(schema) - }).toThrow('Unknown type'); - - // missed type - let schema1 = { - "First": { - id: 1, - fields: [ - { "name": "x", "type": "Second" }, - ] + }, + { + x: 10, + yz: { + y: 4, + z: 800, + s: ['dddddd'] } - }; - - expect(() => { - initializeMessages(schema1) - }).toThrow('Unknown type'); - - // correct location - let schema2 = { - "First": { - id: 1, - fields: [ - { "name": "x", "type": "Uint8" }, - ] - }, - "Second": { - "id": 2, - "fields": [ - { "name": "xxx", "type": "First" } - ] + }, + { + x: 999, + yz: { + y: 5, + z: 1400, + s: ['e'] } - }; - - expect(() => { - initializeMessages(schema2) - }).not.toThrow('Unknown type'); - - // change order - let schema3 = { - "Second": { - "id": 2, - "fields": [ - { "name": "xxx", "type": "First" } - ] - }, - "First": { - id: 1, - fields: [ - { "name": "x", "type": "Uint8" }, - ] - }, - }; - - expect(() => { - initializeMessages(schema3) - }).not.toThrow('Unknown type'); - - }) - - it('TODO: compose tests for not equal size arrays messages', () => { - expect(true).toBe(true); - }); -}); + } + ], + xxx: 16 + } + } + + let valArr = Buffer.createValueArray(srcStruct.fields, srcData, includeMsg) + srcData.__SIZE__ = Buffer.calcSize(valArr, includeMsg) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData, includeMsg) + + let res = new Buffer(b, includeMsg).deserialize(srcStruct) + + expect(res).toEqual(srcData) + }) + + it('Error if wrong order of complex type', () => { + // wrong order + let schema = { + First: { + id: 1, + fields: [{ name: 'x', type: 'Second' }] + }, + Second: { + id: 2, + fields: [{ name: 'xxx', type: 'Uint8' }] + } + } + + expect(() => { + initializeMessages(schema) + }).toThrow('Unknown type') + + // missed type + let schema1 = { + First: { + id: 1, + fields: [{ name: 'x', type: 'Second' }] + } + } + + expect(() => { + initializeMessages(schema1) + }).toThrow('Unknown type') + + // correct location + let schema2 = { + First: { + id: 1, + fields: [{ name: 'x', type: 'Uint8' }] + }, + Second: { + id: 2, + fields: [{ name: 'xxx', type: 'First' }] + } + } + + expect(() => { + initializeMessages(schema2) + }).not.toThrow('Unknown type') + + // change order + let schema3 = { + Second: { + id: 2, + fields: [{ name: 'xxx', type: 'First' }] + }, + First: { + id: 1, + fields: [{ name: 'x', type: 'Uint8' }] + } + } + + expect(() => { + initializeMessages(schema3) + }).not.toThrow('Unknown type') + }) + + it('TODO: compose tests for not equal size arrays messages', () => { + expect(true).toBe(true) + }) +}) diff --git a/port/js/tests/utf8.test.js b/port/js/tests/utf8.test.js index f9f752f..420b555 100644 --- a/port/js/tests/utf8.test.js +++ b/port/js/tests/utf8.test.js @@ -1,12 +1,12 @@ -'use strict'; +'use strict' -import {encodeUTF8, decodeUTF8} from '../src/utf8.js'; +import { encodeUTF8, decodeUTF8 } from '../src/utf8.js' describe('UTF8 function test', () => { - it('Encoding decoding test', () => { - let testStr = "✈✈✈ Hello world! ✈✈✈"; - let byteArr = encodeUTF8(testStr); - let dstStr = decodeUTF8(byteArr); - expect(testStr).toBe(dstStr); - }); -}); + it('Encoding decoding test', () => { + let testStr = '✈✈✈ Hello world! ✈✈✈' + let byteArr = encodeUTF8(testStr) + let dstStr = decodeUTF8(byteArr) + expect(testStr).toBe(dstStr) + }) +}) From ae216944e8ad5e90491526c56862fd09a1f88b36 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Fri, 1 Sep 2023 14:23:17 +0400 Subject: [PATCH 03/23] Add optional typedArray implementation to buffer class --- port/js/src/messgen.d.ts | 69 ++++++++++---------- port/js/src/messgen.js | 49 ++++++++++----- port/js/tests/messgen.test.js | 115 ++++++++++++++++++++++++++++++++++ 3 files changed, 183 insertions(+), 50 deletions(-) diff --git a/port/js/src/messgen.d.ts b/port/js/src/messgen.d.ts index 2e0e3f7..11eac0a 100644 --- a/port/js/src/messgen.d.ts +++ b/port/js/src/messgen.d.ts @@ -8,63 +8,64 @@ export type Schema = { fields: Field[] } - export class Struct { - constructor(schema: Schema) {} - + constructor(schema: Schema) + get schema(): Schema - + get id(): number - + get size(): number - + get fields(): Field[] - + set(schema: Schema): void } - declare type Messages = { __id__: Struct[] __name__: KEYS[] -} & - Record & +} & Record & addPrefixToObject>, 'MSG_'> & - Record; + Record export const HEADER_STRUCT: Struct -type Obj = Record; +type Obj = Record export class Buffer { - constructor(data: ArrayBufferLike) - + constructor(data: ArrayBufferLike, useTypedArray?: boolean) + static deserialize(messages, data, headerStruct?: Struct, includeMessages?: Messages) - + static mergeArrayBuffers(tArrs: Array, type: Uint8ArrayConstructor): Uint8Array - + static appendBuffer(buffer1: ArrayBuffer, buffer2: ArrayBuffer): Uint8Array - + static calcSize(fields: Field[], includeMessages?: Messages) - - static createValueArray(schemaFields: Schema["fields"], obj: Obj, includeMessages?: Messages) - - static serializeMessage(struct: Struct, obj: Obj, headerStruct ?: Struct, includeMessages?: Messages): Uint8Array - - static serializeObj(schemaFields: Schema["fields"], obj: Obj, includeMessages?: Messages) - - static writeDataView(fields: Field[], dataView, includeMessages?: Messages, offset ?: number) - + + static createValueArray(schemaFields: Schema['fields'], obj: Obj, includeMessages?: Messages) + + static serializeMessage( + struct: Struct, + obj: Obj, + headerStruct?: Struct, + includeMessages?: Messages + ): Uint8Array + + static serializeObj(schemaFields: Schema['fields'], obj: Obj, includeMessages?: Messages) + + static writeDataView(fields: Field[], dataView, includeMessages?: Messages, offset?: number) + static serialize(fields: Field[], includeMessages?: Messages) - + get size(): number - + get dataView(): DataView - + set(arrayBuffer: ArrayBufferLike): void - + deserialize(struct: Struct, offset?: number, sizeOffset?: number): Obj - } export function initializeMessages( @@ -81,11 +82,11 @@ export function initializeMessages( // https://stackoverflow.com/questions/71824852/convert-typescript-object-keys-to-uppercase // All string-type keys in the object, and then uppercased -type UppercaseStringKeys = Uppercase>; +type UppercaseStringKeys = Uppercase> // An object consisting of the above keys with the same values from the original object type UppercaseObjectKeys = { - [x in UppercaseStringKeys]: x extends string ? T[Lowercase] : T[x]; -}; + [x in UppercaseStringKeys]: x extends string ? T[Lowercase] : T[x] +} // https://stackoverflow.com/questions/57510388/define-prefix-for-object-keys-using-types-in-typescript type addPrefixToObject = { [K in keyof T as K extends string ? `${P}${K}` : never]: T[K] diff --git a/port/js/src/messgen.js b/port/js/src/messgen.js index 6994bca..b685119 100644 --- a/port/js/src/messgen.js +++ b/port/js/src/messgen.js @@ -19,7 +19,8 @@ const basicTypes = [ write: (v, s, a) => { v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN) return 1 - } + }, + typedArray: Array }, { name: 'Int8', @@ -28,7 +29,8 @@ const basicTypes = [ write: (v, s, a) => { v.setInt8(s, a, IS_LITTLE_ENDIAN) return 1 - } + }, + typedArray: Int8Array }, { name: 'Uint8', @@ -37,7 +39,8 @@ const basicTypes = [ write: (v, s, a) => { v.setUint8(s, a, IS_LITTLE_ENDIAN) return 1 - } + }, + typedArray: Uint8Array }, { name: 'Int16', @@ -46,7 +49,8 @@ const basicTypes = [ write: (v, s, a) => { v.setInt16(s, a, IS_LITTLE_ENDIAN) return 2 - } + }, + typedArray: Int16Array }, { name: 'Uint16', @@ -55,7 +59,8 @@ const basicTypes = [ write: (v, s, a) => { v.setUint16(s, a, IS_LITTLE_ENDIAN) return 2 - } + }, + typedArray: Uint16Array }, { name: 'Int32', @@ -64,7 +69,8 @@ const basicTypes = [ write: (v, s, a) => { v.setInt32(s, a, IS_LITTLE_ENDIAN) return 4 - } + }, + typedArray: Int32Array }, { name: 'Uint32', @@ -73,7 +79,8 @@ const basicTypes = [ write: (v, s, a) => { v.setUint32(s, a, IS_LITTLE_ENDIAN) return 4 - } + }, + typedArray: Uint32Array }, { name: 'Int64', @@ -82,7 +89,8 @@ const basicTypes = [ write: (v, s, a) => { v.setBigInt64(s, a, IS_LITTLE_ENDIAN) return 8 - } + }, + typedArray: BigInt64Array }, { name: 'Uint64', @@ -91,7 +99,8 @@ const basicTypes = [ write: (v, s, a) => { v.setBigUint64(s, a, IS_LITTLE_ENDIAN) return 8 - } + }, + typedArray: BigUint64Array }, { name: 'Float', @@ -109,7 +118,8 @@ const basicTypes = [ write: (v, s, a) => { v.setFloat32(s, a, IS_LITTLE_ENDIAN) return 4 - } + }, + typedArray: Float32Array }, { name: 'Double', @@ -118,7 +128,8 @@ const basicTypes = [ write: (v, s, a) => { v.setFloat64(s, a, IS_LITTLE_ENDIAN) return 8 - } + }, + typedArray: Float64Array }, { name: 'String', @@ -131,7 +142,8 @@ const basicTypes = [ v.setUint8(s2 + i, a[i], true) } return size + 4 - } + }, + typedArray: Array } ] @@ -139,7 +151,8 @@ let typeIndex = [], typeSize = [] let readFunc = [], - writeFunc = [] + writeFunc = [], + typedArray = [] for (let i = 0; i < basicTypes.length; i++) { let ti = basicTypes[i] @@ -147,6 +160,7 @@ for (let i = 0; i < basicTypes.length; i++) { typeSize[i] = ti.size readFunc[i] = ti.read writeFunc[i] = ti.write + typedArray[i] = ti.typedArray } const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE] @@ -273,9 +287,11 @@ export const HEADER_STRUCT = new Struct({ * class Buffer */ export class Buffer { - constructor(arrayBuffer) { + _useTypedArray = false + constructor(arrayBuffer, useTypedArray = false) { this._dataView = new DataView(arrayBuffer) this._dynamicOffset = 0 + this._useTypedArray = useTypedArray } // TODO: перенести в модуль messages @@ -497,6 +513,7 @@ export class Buffer { p = fi._prop currOffset = offset + fi._offset + const ArrayType = this._useTypedArray ? typedArray[p.typeIndex] ?? Array : Array if (p.isArray) { if (p.length === 0) { @@ -506,7 +523,7 @@ export class Buffer { let length = DYN_READ(dv, currOffset + this._dynamicOffset) - res[fi.name] = new Array(length) + res[fi.name] = new ArrayType(length) let currOffset_dyn = DYN_TYPE_SIZE + currOffset @@ -533,7 +550,7 @@ export class Buffer { //Static size array // - res[fi.name] = new Array(p.length) + res[fi.name] = new ArrayType(p.length) if (p.typeIndex === typeIndex.String) { for (let j = 0; j < p.length; j++) { diff --git a/port/js/tests/messgen.test.js b/port/js/tests/messgen.test.js index 2a497d7..5d67d06 100644 --- a/port/js/tests/messgen.test.js +++ b/port/js/tests/messgen.test.js @@ -161,6 +161,121 @@ describe('Serialization deserialization tests', () => { expect(res).toEqual(srcData) }) + it('Basic types fixed typed array size', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[${ARRAY_SIZE}]` }, + { name: 'type_Uint8', type: `Uint8[${ARRAY_SIZE}]` }, + { name: 'type_Int16', type: `Int16[${ARRAY_SIZE}]` }, + { name: 'type_Uint16', type: `Uint16[${ARRAY_SIZE}]` }, + { name: 'type_Int32', type: `Int32[${ARRAY_SIZE}]` }, + { name: 'type_Uint32', type: `Uint32[${ARRAY_SIZE}]` }, + { name: 'type_Int64', type: `Int64[${ARRAY_SIZE}]` }, + { name: 'type_Uint64', type: `Uint64[${ARRAY_SIZE}]` }, + { name: 'type_String', type: `String[${ARRAY_SIZE}]` }, + { name: 'type_Double', type: `Double[${ARRAY_SIZE}]` }, + { name: 'type_Char', type: `Char[${ARRAY_SIZE}]` } + ] + }) + + let srcData = { + type_Int8: new Int8Array(ARRAY_SIZE), + type_Uint8: new Uint8Array(ARRAY_SIZE), + type_Int16: new Int16Array(ARRAY_SIZE), + type_Uint16: new Uint16Array(ARRAY_SIZE), + type_Int32: new Int32Array(ARRAY_SIZE), + type_Uint32: new Uint32Array(ARRAY_SIZE), + type_Int64: new BigInt64Array(ARRAY_SIZE), + type_Uint64: new BigUint64Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Float64Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 + srcData.type_Char[i] = 'a' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + let res = new Buffer(b, true).deserialize(srcStruct) + + expect(res).toEqual(srcData) + }) + + it('Basic types dynamic typed array size', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[]` }, + { name: 'type_Uint8', type: `Uint8[]` }, + { name: 'type_Int16', type: `Int16[]` }, + { name: 'type_Uint16', type: `Uint16[]` }, + { name: 'type_Int32', type: `Int32[]` }, + { name: 'type_Uint32', type: `Uint32[]` }, + { name: 'type_Int64', type: `Int64[]` }, + { name: 'type_Uint64', type: `Uint64[]` }, + { name: 'type_String', type: `String[]` }, + { name: 'type_Double', type: `Double[]` }, + { name: 'type_Char', type: `Char[]` } + ] + }) + + let srcData = { + type_Int8: new Int8Array(ARRAY_SIZE), + type_Uint8: new Uint8Array(ARRAY_SIZE), + type_Int16: new Int16Array(ARRAY_SIZE), + type_Uint16: new Uint16Array(ARRAY_SIZE), + type_Int32: new Int32Array(ARRAY_SIZE), + type_Uint32: new Uint32Array(ARRAY_SIZE), + type_Int64: new BigInt64Array(ARRAY_SIZE), + type_Uint64: new BigUint64Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Float64Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 + srcData.type_Char[i] = 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + + let res = new Buffer(b, true).deserialize(srcStruct) + + expect(res).toEqual(srcData) + }) + it('Basic message with header', () => { let srcStruct = new Struct({ id: 2, From 9605f6b21249e3fcb8f71371e980e650f941d900 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Fri, 1 Sep 2023 15:29:03 +0400 Subject: [PATCH 04/23] Added new tests for dynamic message handling in messgen. --- .../typed_array_dynamic_message.yaml | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml diff --git a/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml b/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml new file mode 100644 index 0000000..1a1561c --- /dev/null +++ b/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml @@ -0,0 +1,32 @@ +id: 14 +fields: + - name: type_Int8 + type: int8[] + + - name: type_Uint8 + type: uint8[] + + - name: type_Int16 + type: int16[] + + - name: type_Uint16 + type: uint16[] + + - name: type_Int32 + type: int32[] + + - name: type_Uint32 + type: uint32[] + + - name: type_Int64 + type: int64[] + + - name: type_Uint64 + type: uint64[] + + - name: type_String + type: string[] + + + - name: type_Char + type: char From feeba3a3654e99f25100bd7826d2d88eaf20f8e9 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Fri, 1 Sep 2023 15:31:04 +0400 Subject: [PATCH 05/23] Update tab spacing in JS files --- port/js/babel.config.js | 2 +- port/js/jest.config.js | 6 +- port/js/prettier.config.js | 12 +- port/js/rollup.config.js | 20 +- port/js/src/messgen.d.ts | 67 +-- port/js/src/messgen.js | 1027 +++++++++++++++++---------------- port/js/src/utf8.js | 102 ++-- port/js/tests/messgen.test.js | 908 ++++++++++++++--------------- port/js/tests/utf8.test.js | 12 +- 9 files changed, 1092 insertions(+), 1064 deletions(-) diff --git a/port/js/babel.config.js b/port/js/babel.config.js index 7db9b6f..6ab438e 100644 --- a/port/js/babel.config.js +++ b/port/js/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: ['@babel/preset-env'] + presets: ['@babel/preset-env'] } diff --git a/port/js/jest.config.js b/port/js/jest.config.js index ac5d640..a1c7a58 100644 --- a/port/js/jest.config.js +++ b/port/js/jest.config.js @@ -1,8 +1,8 @@ /** @type {import('jest').Config} */ const config = { - transform: { - '\\.js?$': 'babel-jest' - } + transform: { + '\\.js?$': 'babel-jest' + } } module.exports = config diff --git a/port/js/prettier.config.js b/port/js/prettier.config.js index 556edf6..7fd196d 100644 --- a/port/js/prettier.config.js +++ b/port/js/prettier.config.js @@ -1,10 +1,10 @@ /** @type {import("prettier").Config} */ const config = { - tabWidth: 2, - useTabs: false, - singleQuote: true, - printWidth: 120, - trailingComma: 'none', - semi: false + tabWidth: 4, + useTabs: false, + singleQuote: true, + printWidth: 120, + trailingComma: 'none', + semi: false } module.exports = config diff --git a/port/js/rollup.config.js b/port/js/rollup.config.js index 2278513..d3509d1 100644 --- a/port/js/rollup.config.js +++ b/port/js/rollup.config.js @@ -5,16 +5,16 @@ const OUTPUT_NAME = `dist/messgen` /** @type {import('rollup').RollupOptions} */ const config = { - input: `src/messgen.js`, - output: [ - { - file: OUTPUT_NAME + '.js', - format: 'umd', - name: pkg.name, - sourcemap: false - } - ], - plugins: [terser()] + input: `src/messgen.js`, + output: [ + { + file: OUTPUT_NAME + '.js', + format: 'umd', + name: pkg.name, + sourcemap: false + } + ], + plugins: [terser()] } export default config diff --git a/port/js/src/messgen.d.ts b/port/js/src/messgen.d.ts index 2e0e3f7..06fd72a 100644 --- a/port/js/src/messgen.d.ts +++ b/port/js/src/messgen.d.ts @@ -8,63 +8,64 @@ export type Schema = { fields: Field[] } - export class Struct { - constructor(schema: Schema) {} - + constructor(schema: Schema) + get schema(): Schema - + get id(): number - + get size(): number - + get fields(): Field[] - + set(schema: Schema): void } - declare type Messages = { __id__: Struct[] __name__: KEYS[] -} & - Record & +} & Record & addPrefixToObject>, 'MSG_'> & - Record; + Record export const HEADER_STRUCT: Struct -type Obj = Record; +type Obj = Record export class Buffer { constructor(data: ArrayBufferLike) - + static deserialize(messages, data, headerStruct?: Struct, includeMessages?: Messages) - + static mergeArrayBuffers(tArrs: Array, type: Uint8ArrayConstructor): Uint8Array - + static appendBuffer(buffer1: ArrayBuffer, buffer2: ArrayBuffer): Uint8Array - + static calcSize(fields: Field[], includeMessages?: Messages) - - static createValueArray(schemaFields: Schema["fields"], obj: Obj, includeMessages?: Messages) - - static serializeMessage(struct: Struct, obj: Obj, headerStruct ?: Struct, includeMessages?: Messages): Uint8Array - - static serializeObj(schemaFields: Schema["fields"], obj: Obj, includeMessages?: Messages) - - static writeDataView(fields: Field[], dataView, includeMessages?: Messages, offset ?: number) - + + static createValueArray(schemaFields: Schema['fields'], obj: Obj, includeMessages?: Messages) + + static serializeMessage( + struct: Struct, + obj: Obj, + headerStruct?: Struct, + includeMessages?: Messages + ): Uint8Array + + static serializeObj(schemaFields: Schema['fields'], obj: Obj, includeMessages?: Messages) + + static writeDataView(fields: Field[], dataView, includeMessages?: Messages, offset?: number) + static serialize(fields: Field[], includeMessages?: Messages) - + get size(): number - + get dataView(): DataView - + set(arrayBuffer: ArrayBufferLike): void - + deserialize(struct: Struct, offset?: number, sizeOffset?: number): Obj - } export function initializeMessages( @@ -81,11 +82,11 @@ export function initializeMessages( // https://stackoverflow.com/questions/71824852/convert-typescript-object-keys-to-uppercase // All string-type keys in the object, and then uppercased -type UppercaseStringKeys = Uppercase>; +type UppercaseStringKeys = Uppercase> // An object consisting of the above keys with the same values from the original object type UppercaseObjectKeys = { - [x in UppercaseStringKeys]: x extends string ? T[Lowercase] : T[x]; -}; + [x in UppercaseStringKeys]: x extends string ? T[Lowercase] : T[x] +} // https://stackoverflow.com/questions/57510388/define-prefix-for-object-keys-using-types-in-typescript type addPrefixToObject = { [K in keyof T as K extends string ? `${P}${K}` : never]: T[K] diff --git a/port/js/src/messgen.js b/port/js/src/messgen.js index 6994bca..2adc646 100644 --- a/port/js/src/messgen.js +++ b/port/js/src/messgen.js @@ -12,141 +12,141 @@ const DYNAMIC_SIZE_TYPE = 'Uint32' * Write function returns type byte size. */ const basicTypes = [ - { - name: 'Char', - size: 1, - read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), - write: (v, s, a) => { - v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN) - return 1 - } - }, - { - name: 'Int8', - size: 1, - read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setInt8(s, a, IS_LITTLE_ENDIAN) - return 1 - } - }, - { - name: 'Uint8', - size: 1, - read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setUint8(s, a, IS_LITTLE_ENDIAN) - return 1 - } - }, - { - name: 'Int16', - size: 2, - read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setInt16(s, a, IS_LITTLE_ENDIAN) - return 2 - } - }, - { - name: 'Uint16', - size: 2, - read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setUint16(s, a, IS_LITTLE_ENDIAN) - return 2 - } - }, - { - name: 'Int32', - size: 4, - read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setInt32(s, a, IS_LITTLE_ENDIAN) - return 4 - } - }, - { - name: 'Uint32', - size: 4, - read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setUint32(s, a, IS_LITTLE_ENDIAN) - return 4 - } - }, - { - name: 'Int64', - size: 8, - read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setBigInt64(s, a, IS_LITTLE_ENDIAN) - return 8 - } - }, - { - name: 'Uint64', - size: 8, - read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setBigUint64(s, a, IS_LITTLE_ENDIAN) - return 8 - } - }, - { - name: 'Float', - size: 4, - read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setFloat32(s, a, IS_LITTLE_ENDIAN) - return 4 - } - }, - { - name: 'Float32', - size: 4, - read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setFloat32(s, a, IS_LITTLE_ENDIAN) - return 4 - } - }, - { - name: 'Double', - size: 8, - read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setFloat64(s, a, IS_LITTLE_ENDIAN) - return 8 - } - }, - { - name: 'String', - size: 4, - read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), - write: (v, s, a) => { - let size = a.length - v.setUint32(s, size, true) - for (let i = 0, s2 = s + 4; i < size; i++) { - v.setUint8(s2 + i, a[i], true) - } - return size + 4 + { + name: 'Char', + size: 1, + read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), + write: (v, s, a) => { + v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN) + return 1 + } + }, + { + name: 'Int8', + size: 1, + read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt8(s, a, IS_LITTLE_ENDIAN) + return 1 + } + }, + { + name: 'Uint8', + size: 1, + read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint8(s, a, IS_LITTLE_ENDIAN) + return 1 + } + }, + { + name: 'Int16', + size: 2, + read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt16(s, a, IS_LITTLE_ENDIAN) + return 2 + } + }, + { + name: 'Uint16', + size: 2, + read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint16(s, a, IS_LITTLE_ENDIAN) + return 2 + } + }, + { + name: 'Int32', + size: 4, + read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Uint32', + size: 4, + read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Int64', + size: 8, + read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigInt64(s, a, IS_LITTLE_ENDIAN) + return 8 + } + }, + { + name: 'Uint64', + size: 8, + read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigUint64(s, a, IS_LITTLE_ENDIAN) + return 8 + } + }, + { + name: 'Float', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Float32', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Double', + size: 8, + read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat64(s, a, IS_LITTLE_ENDIAN) + return 8 + } + }, + { + name: 'String', + size: 4, + read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), + write: (v, s, a) => { + let size = a.length + v.setUint32(s, size, true) + for (let i = 0, s2 = s + 4; i < size; i++) { + v.setUint8(s2 + i, a[i], true) + } + return size + 4 + } } - } ] let typeIndex = [], - typeSize = [] + typeSize = [] let readFunc = [], - writeFunc = [] + writeFunc = [] for (let i = 0; i < basicTypes.length; i++) { - let ti = basicTypes[i] - typeIndex[ti.name] = i - typeSize[i] = ti.size - readFunc[i] = ti.read - writeFunc[i] = ti.write + let ti = basicTypes[i] + typeIndex[ti.name] = i + typeSize[i] = ti.size + readFunc[i] = ti.read + writeFunc[i] = ti.write } const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE] @@ -155,104 +155,104 @@ const DYN_READ = readFunc[DYN_TYPE] const DYN_WRITE = writeFunc[DYN_TYPE] function parseType(typeStr, includeMessages) { - let a = typeStr.split('['), - name = a[0].trim() - - let size, - isComplex = false - - let type = typeIndex[name] - - if (type !== undefined) { - size = typeSize[type] - } else if (includeMessages && includeMessages[name]) { - type = includeMessages[name] - size = type.size - isComplex = true - } else { - throw new Error(`Unknown type: ${name}, if is complex type you must define before the struct. `) - } - - let length = parseInt(a[1]) - - return { - typeIndex: type, - typeSize: size, - length: isNaN(length) ? 0 : length, - isArray: a.length === 2, - isComplex: isComplex - } + let a = typeStr.split('['), + name = a[0].trim() + + let size, + isComplex = false + + let type = typeIndex[name] + + if (type !== undefined) { + size = typeSize[type] + } else if (includeMessages && includeMessages[name]) { + type = includeMessages[name] + size = type.size + isComplex = true + } else { + throw new Error(`Unknown type: ${name}, if is complex type you must define before the struct. `) + } + + let length = parseInt(a[1]) + + return { + typeIndex: type, + typeSize: size, + length: isNaN(length) ? 0 : length, + isArray: a.length === 2, + isComplex: isComplex + } } /** * class Struct */ export class Struct { - constructor(schema, includeMessages) { - this._id = 0 - this._size = 0 - this._fields = null - this._schema = null - - this._includeMessages = includeMessages - - this.set(schema) - } - - get schema() { - return this._schema - } - - get id() { - return this._id - } - - get size() { - return this._size - } - - get fields() { - return this._fields - } - - set(schema) { - if (schema) { - this._id = schema.id || 0 - this._size = 0 - this._fields = new Array(schema.fields.length) - this._schema = schema - this._init() + constructor(schema, includeMessages) { + this._id = 0 + this._size = 0 + this._fields = null + this._schema = null + + this._includeMessages = includeMessages + + this.set(schema) } - } - _init() { - let schemaFields = this._schema.fields + get schema() { + return this._schema + } - let offset = 0 + get id() { + return this._id + } - for (let i = 0, len = schemaFields.length; i < len; i++) { - let si = schemaFields[i], - tp = parseType(si.type, this._includeMessages) + get size() { + return this._size + } - this._fields[i] = { - name: si.name, - type: si.type, - _offset: offset, - _prop: tp - } + get fields() { + return this._fields + } - if (tp.isArray) { - if (tp.length === 0) { - offset += DYN_TYPE_SIZE - } else { - offset += tp.typeSize * tp.length + set(schema) { + if (schema) { + this._id = schema.id || 0 + this._size = 0 + this._fields = new Array(schema.fields.length) + this._schema = schema + this._init() } - } else { - offset += tp.typeSize - } } - this._size = offset - } + _init() { + let schemaFields = this._schema.fields + + let offset = 0 + + for (let i = 0, len = schemaFields.length; i < len; i++) { + let si = schemaFields[i], + tp = parseType(si.type, this._includeMessages) + + this._fields[i] = { + name: si.name, + type: si.type, + _offset: offset, + _prop: tp + } + + if (tp.isArray) { + if (tp.length === 0) { + offset += DYN_TYPE_SIZE + } else { + offset += tp.typeSize * tp.length + } + } else { + offset += tp.typeSize + } + } + + this._size = offset + } } // uint32 seq; //!< Sequence number @@ -261,312 +261,335 @@ export class Struct { // uint8 msg_id; //!< Message type ID export const HEADER_STRUCT = new Struct({ - fields: [ - { name: 'seq', type: 'Uint32' }, - { name: 'cls', type: 'Uint8' }, - { name: 'msg_id', type: 'Uint8' }, - { name: 'size', type: 'Uint32' } - ] + fields: [ + { name: 'seq', type: 'Uint32' }, + { name: 'cls', type: 'Uint8' }, + { name: 'msg_id', type: 'Uint8' }, + { name: 'size', type: 'Uint32' } + ] }) /** * class Buffer */ export class Buffer { - constructor(arrayBuffer) { - this._dataView = new DataView(arrayBuffer) - this._dynamicOffset = 0 - } - - // TODO: перенести в модуль messages - // а модуль messages генерализировать - static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { - let res = [] - let buf = new Buffer(data) - let cur = 0 - while (cur < buf.size) { - let h = buf.deserialize(headerStruct, cur), - m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__) - m.__MSG_ID__ = h.msg_id - cur += h.__SIZE__ + m.__SIZE__ - res.push(m) + constructor(arrayBuffer) { + this._dataView = new DataView(arrayBuffer) + this._dynamicOffset = 0 } - return res - } - - static mergeArrayBuffers(tArrs, type = Uint8Array) { - const ret = new type(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)) - let off = 0 - tArrs.forEach((tArr) => { - ret.set(new type(tArr), off) - off += tArr.byteLength - }) - return ret - } - - static appendBuffer(buffer1, buffer2) { - var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength) - tmp.set(new Uint8Array(buffer1), 0) - tmp.set(new Uint8Array(buffer2), buffer1.byteLength) - return tmp.buffer - } - - static calcSize(fields, includeMessages) { - let size = 0 - - for (let i = 0, len = fields.length; i < len; i++) { - let fi = fields[i], - tp = (fi._prop = parseType(fi.type, includeMessages)) - - if (tp.isArray) { - if (tp.isComplex) { - if (tp.length === 0) { - size += DYN_TYPE_SIZE - } - for (let i = 0; i < fi.value.length; i++) { - let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages) - size += Buffer.calcSize(arr, includeMessages) - } - } else { - let arrayLength = 0 - - // Dynamic size array - if (tp.length === 0) { - arrayLength = fi.value.length - size += tp.typeSize * arrayLength + DYN_TYPE_SIZE // for dynamic array length descriptor - } else { - // static size array - arrayLength = tp.length - size += tp.typeSize * arrayLength - } - - if (tp.typeIndex === typeIndex.String) { - fi._bytes = [] - for (let i = 0; i < arrayLength; i++) { - let b = encodeUTF8(fi.value[i] || '') - fi._bytes.push(b) - size += b.length - } - } - } - } else if (tp.typeIndex === typeIndex.String) { - fi._bytes = encodeUTF8(fi.value || '') - size += tp.typeSize + fi._bytes.length - } else { - if (tp.isComplex) { - size += Buffer.calcSize(fi.value, includeMessages) - } else { - size += tp.typeSize - } - } - } - - return size - } - - static createValueArray(schemaFields, obj, includeMessages) { - const len = schemaFields.length - - let arr = new Array(len) - - for (let k = 0; k < len; k++) { - let sk = schemaFields[k], - type = sk.type - if (includeMessages && includeMessages[type]) { - arr[k] = { - value: Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), - type: type + // TODO: перенести в модуль messages + // а модуль messages генерализировать + static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { + let res = [] + let buf = new Buffer(data) + let cur = 0 + while (cur < buf.size) { + let h = buf.deserialize(headerStruct, cur), + m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__) + m.__MSG_ID__ = h.msg_id + cur += h.__SIZE__ + m.__SIZE__ + res.push(m) } - } else { - arr[k] = { value: obj[sk.name], type: type } - } + return res } - return arr - } - - static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { - let arr = Buffer.createValueArray(struct.fields, obj, includeMessages) - - let messageSize = Buffer.calcSize(arr, includeMessages) - - let headerBuf = Buffer.serializeObj( - headerStruct.fields, - { - seq: obj.seq, - size: messageSize, - cls: obj.cls, - msg_id: struct.id - }, - includeMessages - ) - - return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)) - } - - static serializeObj(schemaFields, obj, includeMessages) { - let arr = Buffer.createValueArray(schemaFields, obj, includeMessages) - - return Buffer.serialize(arr, includeMessages) - } - - static writeDataView(fields, dataView, includeMessages, offset = 0) { - for (let i = 0, len = fields.length; i < len; i++) { - let fi = fields[i], - p = fi._prop + static mergeArrayBuffers(tArrs, type = Uint8Array) { + const ret = new type(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)) + let off = 0 + tArrs.forEach((tArr) => { + ret.set(new type(tArr), off) + off += tArr.byteLength + }) + return ret + } - if (p.isArray) { - let arrayLength = p.length + static appendBuffer(buffer1, buffer2) { + var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength) + tmp.set(new Uint8Array(buffer1), 0) + tmp.set(new Uint8Array(buffer2), buffer1.byteLength) + return tmp.buffer + } - // Setting array size value for dynamic array size - if (arrayLength === 0) { - arrayLength = fi.value.length - offset += DYN_WRITE(dataView, offset, fi.value.length) + static calcSize(fields, includeMessages) { + let size = 0 + + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + tp = (fi._prop = parseType(fi.type, includeMessages)) + + if (tp.isArray) { + if (tp.isComplex) { + if (tp.length === 0) { + size += DYN_TYPE_SIZE + } + for (let i = 0; i < fi.value.length; i++) { + let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages) + size += Buffer.calcSize(arr, includeMessages) + } + } else { + let arrayLength = 0 + + // Dynamic size array + if (tp.length === 0) { + arrayLength = fi.value.length + size += tp.typeSize * arrayLength + DYN_TYPE_SIZE // for dynamic array length descriptor + } else { + // static size array + arrayLength = tp.length + size += tp.typeSize * arrayLength + } + + if (tp.typeIndex === typeIndex.String) { + fi._bytes = [] + for (let i = 0; i < arrayLength; i++) { + let b = encodeUTF8(fi.value[i] || '') + fi._bytes.push(b) + size += b.length + } + } + } + } else if (tp.typeIndex === typeIndex.String) { + fi._bytes = encodeUTF8(fi.value || '') + size += tp.typeSize + fi._bytes.length + } else { + if (tp.isComplex) { + size += Buffer.calcSize(fi.value, includeMessages) + } else { + size += tp.typeSize + } + } } - // Write array - for (let j = 0; j < arrayLength; j++) { - let val = (fi._bytes && fi._bytes[j]) || fi.value[j] - if (p.isComplex) { - let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages) - let size = Buffer.calcSize(valArr, includeMessages) - Buffer.writeDataView(valArr, dataView, includeMessages, offset) - offset += size - } else { - offset += writeFunc[p.typeIndex](dataView, offset, val) - } - } - } else { - if (p.isComplex) { - let size = Buffer.calcSize(fi.value, includeMessages) - Buffer.writeDataView(fi.value, dataView, includeMessages, offset) - offset += size - } else { - let val = fi._bytes || fi.value - offset += writeFunc[p.typeIndex](dataView, offset, val) - } - } + return size } - return offset - } + static createValueArray(schemaFields, obj, includeMessages) { + const len = schemaFields.length - static serialize(fields, includeMessages) { - let allSize = Buffer.calcSize(fields, includeMessages) + let arr = new Array(len) - let arrayBuffer = new ArrayBuffer(allSize), - dv = new DataView(arrayBuffer) + for (let k = 0; k < len; k++) { + let sk = schemaFields[k], + type = sk.type - Buffer.writeDataView(fields, dv, includeMessages) + if (includeMessages && includeMessages[type]) { + arr[k] = { + value: Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), + type: type + } + } else { + arr[k] = { value: obj[sk.name], type: type } + } + } - return arrayBuffer - } + return arr + } - get size() { - return this._dataView.buffer.byteLength - } + static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { + let arr = Buffer.createValueArray(struct.fields, obj, includeMessages) - get dataView() { - return this._dataView - } + let messageSize = Buffer.calcSize(arr, includeMessages) - set(arrayBuffer) { - this._dataView = null - this._dataView = new DataView(arrayBuffer) - } + let headerBuf = Buffer.serializeObj( + headerStruct.fields, + { + seq: obj.seq, + size: messageSize, + cls: obj.cls, + msg_id: struct.id + }, + includeMessages + ) - deserialize(struct, offset = 0, sizeOffset = 0) { - this._dynamicOffset = 0 - let res = this.__deserialize__(struct, offset, sizeOffset) - res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset - return res - } + return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)) + } - __deserialize__(struct, offset, sizeOffset) { - this._includeMessages = struct._includeMessages + static serializeObj(schemaFields, obj, includeMessages) { + let arr = Buffer.createValueArray(schemaFields, obj, includeMessages) - let fields = struct.fields, - dv = this._dataView, - res = {} + return Buffer.serialize(arr, includeMessages) + } - let currOffset = 0 + static writeDataView(fields, dataView, includeMessages, offset = 0) { + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + p = fi._prop + + if (p.isArray) { + let arrayLength = p.length + + // Setting array size value for dynamic array size + if (arrayLength === 0) { + arrayLength = fi.value.length + offset += DYN_WRITE(dataView, offset, fi.value.length) + } + + // Write array + for (let j = 0; j < arrayLength; j++) { + let val = (fi._bytes && fi._bytes[j]) || fi.value[j] + if (p.isComplex) { + let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages) + let size = Buffer.calcSize(valArr, includeMessages) + Buffer.writeDataView(valArr, dataView, includeMessages, offset) + offset += size + } else { + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } else { + if (p.isComplex) { + let size = Buffer.calcSize(fi.value, includeMessages) + Buffer.writeDataView(fi.value, dataView, includeMessages, offset) + offset += size + } else { + let val = fi._bytes || fi.value + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } - for (let f = 0, len = fields.length; f < len; f++) { - let fi = fields[f], - p = fi._prop + return offset + } - currOffset = offset + fi._offset + static serialize(fields, includeMessages) { + let allSize = Buffer.calcSize(fields, includeMessages) - if (p.isArray) { - if (p.length === 0) { - // - // Dynamic size array - // + let arrayBuffer = new ArrayBuffer(allSize), + dv = new DataView(arrayBuffer) - let length = DYN_READ(dv, currOffset + this._dynamicOffset) + Buffer.writeDataView(fields, dv, includeMessages) - res[fi.name] = new Array(length) + return arrayBuffer + } - let currOffset_dyn = DYN_TYPE_SIZE + currOffset + get size() { + return this._dataView.buffer.byteLength + } - if (p.typeIndex === typeIndex.String) { - for (let j = 0; j < length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize) - this._dynamicOffset += dv.getUint32(currOffset_dyn + this._dynamicOffset + j * p.typeSize, true) - } - } else { - if (p.isComplex) { - for (let j = 0; j < length; j++) { - res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset_dyn + j * p.typeSize, sizeOffset) - } - } else { - for (let j = 0; j < length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize) - } - } - } + get dataView() { + return this._dataView + } - this._dynamicOffset += length * p.typeSize - } else { - // - //Static size array - // + set(arrayBuffer) { + this._dataView = null + this._dataView = new DataView(arrayBuffer) + } - res[fi.name] = new Array(p.length) + deserialize(struct, offset = 0, sizeOffset = 0) { + this._dynamicOffset = 0 + let res = this.__deserialize__(struct, offset, sizeOffset) + res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset + return res + } - if (p.typeIndex === typeIndex.String) { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize) - this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true) - } - } else { - if (p.isComplex) { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset + j * p.typeSize, sizeOffset) - } + __deserialize__(struct, offset, sizeOffset) { + this._includeMessages = struct._includeMessages + + let fields = struct.fields, + dv = this._dataView, + res = {} + + let currOffset = 0 + + for (let f = 0, len = fields.length; f < len; f++) { + let fi = fields[f], + p = fi._prop + + currOffset = offset + fi._offset + + if (p.isArray) { + if (p.length === 0) { + // + // Dynamic size array + // + + let length = DYN_READ(dv, currOffset + this._dynamicOffset) + + res[fi.name] = new Array(length) + + let currOffset_dyn = DYN_TYPE_SIZE + currOffset + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32( + currOffset_dyn + this._dynamicOffset + j * p.typeSize, + true + ) + } + } else { + if (p.isComplex) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = this.__deserialize__( + p.typeIndex, + currOffset_dyn + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + } + } + } + + this._dynamicOffset += length * p.typeSize + } else { + // + //Static size array + // + + res[fi.name] = new Array(p.length) + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true) + } + } else { + if (p.isComplex) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = this.__deserialize__( + p.typeIndex, + currOffset + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + } + } + } + } } else { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize) - } + if (p.isComplex) { + res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset) + } else { + res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset) + + if (p.typeIndex === typeIndex.String) { + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true) + } + } } - } } - } else { - if (p.isComplex) { - res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset) - } else { - res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset) - if (p.typeIndex === typeIndex.String) { - this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true) - } - } - } + return res } - - return res - } } /** @@ -575,37 +598,37 @@ export class Buffer { * @param {*} headerSchema - message header schema */ export function initializeMessages(messagesJson, headerSchema) { - let res = { - __id__: [], - __name__: [], - HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT - } - - for (let m of getKeysWithSortById(messagesJson)) { - let name = m.trim(), - messageObj = messagesJson[m], - msg = 'MSG_' + name.toUpperCase(), - id = messageObj.id - - if (!res.__id__[id]) { - let msg_struct = new Struct(messageObj, res) - - res.__id__[id] = msg_struct - res.__name__[id] = m.trim() - res[msg] = msg_struct - res[name] = msg_struct - } else { - console.warn(`Warning: message ${id} ${msg} already exists.`) + let res = { + __id__: [], + __name__: [], + HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT } - } - return res + for (let m of getKeysWithSortById(messagesJson)) { + let name = m.trim(), + messageObj = messagesJson[m], + msg = 'MSG_' + name.toUpperCase(), + id = messageObj.id + + if (!res.__id__[id]) { + let msg_struct = new Struct(messageObj, res) + + res.__id__[id] = msg_struct + res.__name__[id] = m.trim() + res[msg] = msg_struct + res[name] = msg_struct + } else { + console.warn(`Warning: message ${id} ${msg} already exists.`) + } + } + + return res } const getKeysWithSortById = (obj) => { - let keys = Object.keys(obj) - keys.sort((a, b) => { - return obj[a].id - obj[b].id - }) - return keys + let keys = Object.keys(obj) + keys.sort((a, b) => { + return obj[a].id - obj[b].id + }) + return keys } diff --git a/port/js/src/utf8.js b/port/js/src/utf8.js index 2171234..e37c8bc 100644 --- a/port/js/src/utf8.js +++ b/port/js/src/utf8.js @@ -5,59 +5,63 @@ // Marshals a string to an Uint8Array. export function encodeUTF8(s) { - var i = 0, - bytes = new Uint8Array(s.length * 4) - for (var ci = 0; ci !== s.length; ci++) { - var c = s.charCodeAt(ci) - if (c < 128) { - bytes[i++] = c - continue + var i = 0, + bytes = new Uint8Array(s.length * 4) + for (var ci = 0; ci !== s.length; ci++) { + var c = s.charCodeAt(ci) + if (c < 128) { + bytes[i++] = c + continue + } + if (c < 2048) { + bytes[i++] = (c >> 6) | 192 + } else { + if (c > 0xd7ff && c < 0xdc00) { + if (++ci >= s.length) throw new Error('UTF-8 encode: incomplete surrogate pair') + var c2 = s.charCodeAt(ci) + if (c2 < 0xdc00 || c2 > 0xdfff) + throw new Error( + 'UTF-8 encode: second surrogate character 0x' + + c2.toString(16) + + ' at index ' + + ci + + ' out of range' + ) + c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff) + bytes[i++] = (c >> 18) | 240 + bytes[i++] = ((c >> 12) & 63) | 128 + } else bytes[i++] = (c >> 12) | 224 + bytes[i++] = ((c >> 6) & 63) | 128 + } + bytes[i++] = (c & 63) | 128 } - if (c < 2048) { - bytes[i++] = (c >> 6) | 192 - } else { - if (c > 0xd7ff && c < 0xdc00) { - if (++ci >= s.length) throw new Error('UTF-8 encode: incomplete surrogate pair') - var c2 = s.charCodeAt(ci) - if (c2 < 0xdc00 || c2 > 0xdfff) - throw new Error( - 'UTF-8 encode: second surrogate character 0x' + c2.toString(16) + ' at index ' + ci + ' out of range' - ) - c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff) - bytes[i++] = (c >> 18) | 240 - bytes[i++] = ((c >> 12) & 63) | 128 - } else bytes[i++] = (c >> 12) | 224 - bytes[i++] = ((c >> 6) & 63) | 128 - } - bytes[i++] = (c & 63) | 128 - } - return bytes.subarray(0, i) + return bytes.subarray(0, i) } // Unmarshals a string from an Uint8Array. export function decodeUTF8(bytes) { - var i = 0, - s = '' - while (i < bytes.length) { - var c = bytes[i++] - if (c > 127) { - if (c > 191 && c < 224) { - if (i >= bytes.length) throw new Error('UTF-8 decode: incomplete 2-byte sequence') - c = ((c & 31) << 6) | (bytes[i++] & 63) - } else if (c > 223 && c < 240) { - if (i + 1 >= bytes.length) throw new Error('UTF-8 decode: incomplete 3-byte sequence') - c = ((c & 15) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) - } else if (c > 239 && c < 248) { - if (i + 2 >= bytes.length) throw new Error('UTF-8 decode: incomplete 4-byte sequence') - c = ((c & 7) << 18) | ((bytes[i++] & 63) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) - } else throw new Error('UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1)) + var i = 0, + s = '' + while (i < bytes.length) { + var c = bytes[i++] + if (c > 127) { + if (c > 191 && c < 224) { + if (i >= bytes.length) throw new Error('UTF-8 decode: incomplete 2-byte sequence') + c = ((c & 31) << 6) | (bytes[i++] & 63) + } else if (c > 223 && c < 240) { + if (i + 1 >= bytes.length) throw new Error('UTF-8 decode: incomplete 3-byte sequence') + c = ((c & 15) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) + } else if (c > 239 && c < 248) { + if (i + 2 >= bytes.length) throw new Error('UTF-8 decode: incomplete 4-byte sequence') + c = ((c & 7) << 18) | ((bytes[i++] & 63) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) + } else throw new Error('UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1)) + } + if (c <= 0xffff) s += String.fromCharCode(c) + else if (c <= 0x10ffff) { + c -= 0x10000 + s += String.fromCharCode((c >> 10) | 0xd800) + s += String.fromCharCode((c & 0x3ff) | 0xdc00) + } else throw new Error('UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach') } - if (c <= 0xffff) s += String.fromCharCode(c) - else if (c <= 0x10ffff) { - c -= 0x10000 - s += String.fromCharCode((c >> 10) | 0xd800) - s += String.fromCharCode((c & 0x3ff) | 0xdc00) - } else throw new Error('UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach') - } - return s + return s } diff --git a/port/js/tests/messgen.test.js b/port/js/tests/messgen.test.js index 2a497d7..7041f10 100644 --- a/port/js/tests/messgen.test.js +++ b/port/js/tests/messgen.test.js @@ -3,473 +3,473 @@ import { Buffer, Struct, HEADER_STRUCT, initializeMessages } from '../src/messgen.js' describe('Serialization deserialization tests', () => { - it('Basic types', () => { - let srcStruct = new Struct({ - id: 2, - fields: [ - { name: 'type_Int8', type: 'Int8' }, - { name: 'type_Uint8', type: 'Uint8' }, - { name: 'type_Int16', type: 'Int16' }, - { name: 'type_Uint16', type: 'Uint16' }, - { name: 'type_Int32', type: 'Int32' }, - { name: 'type_Uint32', type: 'Uint32' }, - { name: 'type_Int64', type: 'Int64' }, - { name: 'type_Uint64', type: 'Uint64' }, - { name: 'type_String', type: 'String' }, - { name: 'type_Double', type: 'Double' }, - { name: 'type_Char', type: 'Char' } - ] + it('Basic types', () => { + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: 'Int8' }, + { name: 'type_Uint8', type: 'Uint8' }, + { name: 'type_Int16', type: 'Int16' }, + { name: 'type_Uint16', type: 'Uint16' }, + { name: 'type_Int32', type: 'Int32' }, + { name: 'type_Uint32', type: 'Uint32' }, + { name: 'type_Int64', type: 'Int64' }, + { name: 'type_Uint64', type: 'Uint64' }, + { name: 'type_String', type: 'String' }, + { name: 'type_Double', type: 'Double' }, + { name: 'type_Char', type: 'Char' } + ] + }) + + let srcData = { + type_Int8: 8, + type_Uint8: 8, + type_Int16: 8, + type_Uint16: 8, + type_Int32: 8, + type_Uint32: 8, + type_Int64: BigInt(8), + type_Uint64: BigInt(8), + type_String: 'This is test string', + type_Double: -Math.PI, + type_Char: 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + + let res = new Buffer(b).deserialize(srcStruct) + + expect(res).toEqual(srcData) }) - let srcData = { - type_Int8: 8, - type_Uint8: 8, - type_Int16: 8, - type_Uint16: 8, - type_Int32: 8, - type_Uint32: 8, - type_Int64: BigInt(8), - type_Uint64: BigInt(8), - type_String: 'This is test string', - type_Double: -Math.PI, - type_Char: 'A' - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) - - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) - - let res = new Buffer(b).deserialize(srcStruct) - - expect(res).toEqual(srcData) - }) - - it('Basic types fixed array size', () => { - const ARRAY_SIZE = 100 - - let srcStruct = new Struct({ - id: 2, - fields: [ - { name: 'type_Int8', type: `Int8[${ARRAY_SIZE}]` }, - { name: 'type_Uint8', type: `Uint8[${ARRAY_SIZE}]` }, - { name: 'type_Int16', type: `Int16[${ARRAY_SIZE}]` }, - { name: 'type_Uint16', type: `Uint16[${ARRAY_SIZE}]` }, - { name: 'type_Int32', type: `Int32[${ARRAY_SIZE}]` }, - { name: 'type_Uint32', type: `Uint32[${ARRAY_SIZE}]` }, - { name: 'type_Int64', type: `Int64[${ARRAY_SIZE}]` }, - { name: 'type_Uint64', type: `Uint64[${ARRAY_SIZE}]` }, - { name: 'type_String', type: `String[${ARRAY_SIZE}]` }, - { name: 'type_Double', type: `Double[${ARRAY_SIZE}]` }, - { name: 'type_Char', type: `Char[${ARRAY_SIZE}]` } - ] + it('Basic types fixed array size', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[${ARRAY_SIZE}]` }, + { name: 'type_Uint8', type: `Uint8[${ARRAY_SIZE}]` }, + { name: 'type_Int16', type: `Int16[${ARRAY_SIZE}]` }, + { name: 'type_Uint16', type: `Uint16[${ARRAY_SIZE}]` }, + { name: 'type_Int32', type: `Int32[${ARRAY_SIZE}]` }, + { name: 'type_Uint32', type: `Uint32[${ARRAY_SIZE}]` }, + { name: 'type_Int64', type: `Int64[${ARRAY_SIZE}]` }, + { name: 'type_Uint64', type: `Uint64[${ARRAY_SIZE}]` }, + { name: 'type_String', type: `String[${ARRAY_SIZE}]` }, + { name: 'type_Double', type: `Double[${ARRAY_SIZE}]` }, + { name: 'type_Char', type: `Char[${ARRAY_SIZE}]` } + ] + }) + + let srcData = { + type_Int8: new Array(ARRAY_SIZE), + type_Uint8: new Array(ARRAY_SIZE), + type_Int16: new Array(ARRAY_SIZE), + type_Uint16: new Array(ARRAY_SIZE), + type_Int32: new Array(ARRAY_SIZE), + type_Uint32: new Array(ARRAY_SIZE), + type_Int64: new Array(ARRAY_SIZE), + type_Uint64: new Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 + srcData.type_Char[i] = 'a' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + + let res = new Buffer(b).deserialize(srcStruct) + + expect(res).toEqual(srcData) }) - let srcData = { - type_Int8: new Array(ARRAY_SIZE), - type_Uint8: new Array(ARRAY_SIZE), - type_Int16: new Array(ARRAY_SIZE), - type_Uint16: new Array(ARRAY_SIZE), - type_Int32: new Array(ARRAY_SIZE), - type_Uint32: new Array(ARRAY_SIZE), - type_Int64: new Array(ARRAY_SIZE), - type_Uint64: new Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - } - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i - srcData.type_Uint8[i] = i - srcData.type_Int16[i] = i - srcData.type_Uint16[i] = i - srcData.type_Int32[i] = i - srcData.type_Uint32[i] = i - srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) - srcData.type_Uint64[i] = BigInt(i) - srcData.type_String[i] = 'string-' + i - srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 - srcData.type_Char[i] = 'a' - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) - - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) - - let res = new Buffer(b).deserialize(srcStruct) - - expect(res).toEqual(srcData) - }) - - it('Basic types dynamic array size', () => { - const ARRAY_SIZE = 100 - - let srcStruct = new Struct({ - id: 2, - fields: [ - { name: 'type_Int8', type: `Int8[]` }, - { name: 'type_Uint8', type: `Uint8[]` }, - { name: 'type_Int16', type: `Int16[]` }, - { name: 'type_Uint16', type: `Uint16[]` }, - { name: 'type_Int32', type: `Int32[]` }, - { name: 'type_Uint32', type: `Uint32[]` }, - { name: 'type_Int64', type: `Int64[]` }, - { name: 'type_Uint64', type: `Uint64[]` }, - { name: 'type_String', type: `String[]` }, - { name: 'type_Double', type: `Double[]` }, - { name: 'type_Char', type: `Char[]` } - ] + it('Basic types dynamic array size', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[]` }, + { name: 'type_Uint8', type: `Uint8[]` }, + { name: 'type_Int16', type: `Int16[]` }, + { name: 'type_Uint16', type: `Uint16[]` }, + { name: 'type_Int32', type: `Int32[]` }, + { name: 'type_Uint32', type: `Uint32[]` }, + { name: 'type_Int64', type: `Int64[]` }, + { name: 'type_Uint64', type: `Uint64[]` }, + { name: 'type_String', type: `String[]` }, + { name: 'type_Double', type: `Double[]` }, + { name: 'type_Char', type: `Char[]` } + ] + }) + + let srcData = { + type_Int8: new Array(ARRAY_SIZE), + type_Uint8: new Array(ARRAY_SIZE), + type_Int16: new Array(ARRAY_SIZE), + type_Uint16: new Array(ARRAY_SIZE), + type_Int32: new Array(ARRAY_SIZE), + type_Uint32: new Array(ARRAY_SIZE), + type_Int64: new Array(ARRAY_SIZE), + type_Uint64: new Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 + srcData.type_Char[i] = 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + + let res = new Buffer(b).deserialize(srcStruct) + + expect(res).toEqual(srcData) }) - let srcData = { - type_Int8: new Array(ARRAY_SIZE), - type_Uint8: new Array(ARRAY_SIZE), - type_Int16: new Array(ARRAY_SIZE), - type_Uint16: new Array(ARRAY_SIZE), - type_Int32: new Array(ARRAY_SIZE), - type_Uint32: new Array(ARRAY_SIZE), - type_Int64: new Array(ARRAY_SIZE), - type_Uint64: new Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - } - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i - srcData.type_Uint8[i] = i - srcData.type_Int16[i] = i - srcData.type_Uint16[i] = i - srcData.type_Int32[i] = i - srcData.type_Uint32[i] = i - srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) - srcData.type_Uint64[i] = BigInt(i) - srcData.type_String[i] = 'string-' + i - srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 - srcData.type_Char[i] = 'A' - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) - - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) - - let res = new Buffer(b).deserialize(srcStruct) - - expect(res).toEqual(srcData) - }) - - it('Basic message with header', () => { - let srcStruct = new Struct({ - id: 2, - fields: [ - { name: 'type_Int8', type: 'Int8' }, - { name: 'type_Uint8', type: 'Uint8' }, - { name: 'type_Int16', type: 'Int16' }, - { name: 'type_Uint16', type: 'Uint16' }, - { name: 'type_Int32', type: 'Int32' }, - { name: 'type_Uint32', type: 'Uint32' }, - { name: 'type_Int64', type: 'Int64' }, - { name: 'type_Uint64', type: 'Uint64' }, - { name: 'type_String', type: 'String' }, - { name: 'type_Double', type: 'Double' }, - { name: 'type_Char', type: 'Char' } - ] + it('Basic message with header', () => { + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: 'Int8' }, + { name: 'type_Uint8', type: 'Uint8' }, + { name: 'type_Int16', type: 'Int16' }, + { name: 'type_Uint16', type: 'Uint16' }, + { name: 'type_Int32', type: 'Int32' }, + { name: 'type_Uint32', type: 'Uint32' }, + { name: 'type_Int64', type: 'Int64' }, + { name: 'type_Uint64', type: 'Uint64' }, + { name: 'type_String', type: 'String' }, + { name: 'type_Double', type: 'Double' }, + { name: 'type_Char', type: 'Char' } + ] + }) + + let srcData = { + type_Int8: 8, + type_Uint8: 8, + type_Int16: -16, + type_Uint16: 16, + type_Int32: -32, + type_Uint32: 32, + type_Int64: BigInt(-64), + type_Uint64: BigInt(64), + type_String: 'This is test string', + type_Double: Math.PI, + type_Char: 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeMessage(srcStruct, srcData) + + let buf = new Buffer(b) + let headerRes = buf.deserialize(HEADER_STRUCT, 0) + let res = buf.deserialize(srcStruct, headerRes.__SIZE__) + + expect(res).toEqual(srcData) }) - let srcData = { - type_Int8: 8, - type_Uint8: 8, - type_Int16: -16, - type_Uint16: 16, - type_Int32: -32, - type_Uint32: 32, - type_Int64: BigInt(-64), - type_Uint64: BigInt(64), - type_String: 'This is test string', - type_Double: Math.PI, - type_Char: 'A' - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) - - let b = Buffer.serializeMessage(srcStruct, srcData) - - let buf = new Buffer(b) - let headerRes = buf.deserialize(HEADER_STRUCT, 0) - let res = buf.deserialize(srcStruct, headerRes.__SIZE__) - - expect(res).toEqual(srcData) - }) - - it('Basic types fixed array size with header', () => { - const ARRAY_SIZE = 100 - - let srcStruct = new Struct({ - id: 2, - fields: [ - { name: 'type_Int8', type: `Int8[${ARRAY_SIZE}]` }, - { name: 'type_Uint8', type: `Uint8[${ARRAY_SIZE}]` }, - { name: 'type_Int16', type: `Int16[${ARRAY_SIZE}]` }, - { name: 'type_Uint16', type: `Uint16[${ARRAY_SIZE}]` }, - { name: 'type_Int32', type: `Int32[${ARRAY_SIZE}]` }, - { name: 'type_Uint32', type: `Uint32[${ARRAY_SIZE}]` }, - { name: 'type_Int64', type: `Int64[${ARRAY_SIZE}]` }, - { name: 'type_Uint64', type: `Uint64[${ARRAY_SIZE}]` }, - { name: 'type_String', type: `String[${ARRAY_SIZE}]` }, - { name: 'type_Double', type: `Double[${ARRAY_SIZE}]` }, - { name: 'type_Char', type: `Char[${ARRAY_SIZE}]` } - ] + it('Basic types fixed array size with header', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[${ARRAY_SIZE}]` }, + { name: 'type_Uint8', type: `Uint8[${ARRAY_SIZE}]` }, + { name: 'type_Int16', type: `Int16[${ARRAY_SIZE}]` }, + { name: 'type_Uint16', type: `Uint16[${ARRAY_SIZE}]` }, + { name: 'type_Int32', type: `Int32[${ARRAY_SIZE}]` }, + { name: 'type_Uint32', type: `Uint32[${ARRAY_SIZE}]` }, + { name: 'type_Int64', type: `Int64[${ARRAY_SIZE}]` }, + { name: 'type_Uint64', type: `Uint64[${ARRAY_SIZE}]` }, + { name: 'type_String', type: `String[${ARRAY_SIZE}]` }, + { name: 'type_Double', type: `Double[${ARRAY_SIZE}]` }, + { name: 'type_Char', type: `Char[${ARRAY_SIZE}]` } + ] + }) + + let srcData = { + type_Int8: new Array(ARRAY_SIZE), + type_Uint8: new Array(ARRAY_SIZE), + type_Int16: new Array(ARRAY_SIZE), + type_Uint16: new Array(ARRAY_SIZE), + type_Int32: new Array(ARRAY_SIZE), + type_Uint32: new Array(ARRAY_SIZE), + type_Int64: new Array(ARRAY_SIZE), + type_Uint64: new Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = i * 12.45 + srcData.type_Char[i] = 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeMessage(srcStruct, srcData) + + let buf = new Buffer(b) + let headerRes = buf.deserialize(HEADER_STRUCT, 0) + let res = buf.deserialize(srcStruct, headerRes.__SIZE__) + + expect(res).toEqual(srcData) }) - let srcData = { - type_Int8: new Array(ARRAY_SIZE), - type_Uint8: new Array(ARRAY_SIZE), - type_Int16: new Array(ARRAY_SIZE), - type_Uint16: new Array(ARRAY_SIZE), - type_Int32: new Array(ARRAY_SIZE), - type_Uint32: new Array(ARRAY_SIZE), - type_Int64: new Array(ARRAY_SIZE), - type_Uint64: new Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - } - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i - srcData.type_Uint8[i] = i - srcData.type_Int16[i] = i - srcData.type_Uint16[i] = i - srcData.type_Int32[i] = i - srcData.type_Uint32[i] = i - srcData.type_Int64[i] = BigInt(i) - srcData.type_Uint64[i] = BigInt(i) - srcData.type_String[i] = 'string-' + i - srcData.type_Double[i] = i * 12.45 - srcData.type_Char[i] = 'A' - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) - - let b = Buffer.serializeMessage(srcStruct, srcData) - - let buf = new Buffer(b) - let headerRes = buf.deserialize(HEADER_STRUCT, 0) - let res = buf.deserialize(srcStruct, headerRes.__SIZE__) - - expect(res).toEqual(srcData) - }) - - it('Basic types dynamic array size with header', () => { - const ARRAY_SIZE = 100 - - let srcStruct = new Struct({ - id: 2, - fields: [ - { name: 'type_Int8', type: `Int8[]` }, - { name: 'type_Uint8', type: `Uint8[]` }, - { name: 'type_Int16', type: `Int16[]` }, - { name: 'type_Uint16', type: `Uint16[]` }, - { name: 'type_Int32', type: `Int32[]` }, - { name: 'type_Uint32', type: `Uint32[]` }, - { name: 'type_Int64', type: `Int64[]` }, - { name: 'type_Uint64', type: `Uint64[]` }, - { name: 'type_String', type: `String[]` }, - { name: 'type_Double', type: `Double[]` }, - { name: 'type_Char', type: `Char[]` } - ] + it('Basic types dynamic array size with header', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[]` }, + { name: 'type_Uint8', type: `Uint8[]` }, + { name: 'type_Int16', type: `Int16[]` }, + { name: 'type_Uint16', type: `Uint16[]` }, + { name: 'type_Int32', type: `Int32[]` }, + { name: 'type_Uint32', type: `Uint32[]` }, + { name: 'type_Int64', type: `Int64[]` }, + { name: 'type_Uint64', type: `Uint64[]` }, + { name: 'type_String', type: `String[]` }, + { name: 'type_Double', type: `Double[]` }, + { name: 'type_Char', type: `Char[]` } + ] + }) + + let srcData = { + type_Int8: new Array(ARRAY_SIZE), + type_Uint8: new Array(ARRAY_SIZE), + type_Int16: new Array(ARRAY_SIZE), + type_Uint16: new Array(ARRAY_SIZE), + type_Int32: new Array(ARRAY_SIZE), + type_Uint32: new Array(ARRAY_SIZE), + type_Int64: new Array(ARRAY_SIZE), + type_Uint64: new Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = i * 12.45 + srcData.type_Char[i] = 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeMessage(srcStruct, srcData) + + let buf = new Buffer(b) + let headerRes = buf.deserialize(HEADER_STRUCT, 0) + let res = buf.deserialize(srcStruct, headerRes.__SIZE__) + + expect(res).toEqual(srcData) }) - let srcData = { - type_Int8: new Array(ARRAY_SIZE), - type_Uint8: new Array(ARRAY_SIZE), - type_Int16: new Array(ARRAY_SIZE), - type_Uint16: new Array(ARRAY_SIZE), - type_Int32: new Array(ARRAY_SIZE), - type_Uint32: new Array(ARRAY_SIZE), - type_Int64: new Array(ARRAY_SIZE), - type_Uint64: new Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - } - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i - srcData.type_Uint8[i] = i - srcData.type_Int16[i] = i - srcData.type_Uint16[i] = i - srcData.type_Int32[i] = i - srcData.type_Uint32[i] = i - srcData.type_Int64[i] = BigInt(i) - srcData.type_Uint64[i] = BigInt(i) - srcData.type_String[i] = 'string-' + i - srcData.type_Double[i] = i * 12.45 - srcData.type_Char[i] = 'A' - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) - - let b = Buffer.serializeMessage(srcStruct, srcData) - - let buf = new Buffer(b) - let headerRes = buf.deserialize(HEADER_STRUCT, 0) - let res = buf.deserialize(srcStruct, headerRes.__SIZE__) - - expect(res).toEqual(srcData) - }) - - it('Complex type with dynamic array size', () => { - let schema = { - MyYZ: { - id: 100, - fields: [ - { name: 'y', type: 'Int8' }, - { name: 'z', type: 'Int16' }, - { name: 's', type: 'String[]' } - ] - }, - Coords: { - id: 111, - fields: [ - { name: 'x', type: 'Int16' }, - { name: 'yz', type: 'MyYZ' } - ] - }, - Param: { - id: 112, - fields: [ - { name: 'coords', type: 'Coords[]' }, - { name: 'xxx', type: 'Uint8' } - ] - } - } - - let includeMsg = initializeMessages(schema) - - let srcStruct = new Struct( - { - id: 2, - fields: [ - { name: 'a', type: 'Int8' }, - { name: 'param', type: 'Param' } - ] - }, - includeMsg - ) - - let srcData = { - a: 32, - param: { - coords: [ - { - x: 5, - yz: { - y: 1, - z: 200, - s: ['aaaaa', 'xxxx'] + it('Complex type with dynamic array size', () => { + let schema = { + MyYZ: { + id: 100, + fields: [ + { name: 'y', type: 'Int8' }, + { name: 'z', type: 'Int16' }, + { name: 's', type: 'String[]' } + ] + }, + Coords: { + id: 111, + fields: [ + { name: 'x', type: 'Int16' }, + { name: 'yz', type: 'MyYZ' } + ] + }, + Param: { + id: 112, + fields: [ + { name: 'coords', type: 'Coords[]' }, + { name: 'xxx', type: 'Uint8' } + ] } - }, - { - x: 10, - yz: { - y: 4, - z: 800, - s: ['dddddd'] + } + + let includeMsg = initializeMessages(schema) + + let srcStruct = new Struct( + { + id: 2, + fields: [ + { name: 'a', type: 'Int8' }, + { name: 'param', type: 'Param' } + ] + }, + includeMsg + ) + + let srcData = { + a: 32, + param: { + coords: [ + { + x: 5, + yz: { + y: 1, + z: 200, + s: ['aaaaa', 'xxxx'] + } + }, + { + x: 10, + yz: { + y: 4, + z: 800, + s: ['dddddd'] + } + }, + { + x: 999, + yz: { + y: 5, + z: 1400, + s: ['e'] + } + } + ], + xxx: 16 } - }, - { - x: 999, - yz: { - y: 5, - z: 1400, - s: ['e'] + } + + let valArr = Buffer.createValueArray(srcStruct.fields, srcData, includeMsg) + srcData.__SIZE__ = Buffer.calcSize(valArr, includeMsg) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData, includeMsg) + + let res = new Buffer(b, includeMsg).deserialize(srcStruct) + + expect(res).toEqual(srcData) + }) + + it('Error if wrong order of complex type', () => { + // wrong order + let schema = { + First: { + id: 1, + fields: [{ name: 'x', type: 'Second' }] + }, + Second: { + id: 2, + fields: [{ name: 'xxx', type: 'Uint8' }] } - } - ], - xxx: 16 - } - } - - let valArr = Buffer.createValueArray(srcStruct.fields, srcData, includeMsg) - srcData.__SIZE__ = Buffer.calcSize(valArr, includeMsg) - - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData, includeMsg) - - let res = new Buffer(b, includeMsg).deserialize(srcStruct) - - expect(res).toEqual(srcData) - }) - - it('Error if wrong order of complex type', () => { - // wrong order - let schema = { - First: { - id: 1, - fields: [{ name: 'x', type: 'Second' }] - }, - Second: { - id: 2, - fields: [{ name: 'xxx', type: 'Uint8' }] - } - } - - expect(() => { - initializeMessages(schema) - }).toThrow('Unknown type') - - // missed type - let schema1 = { - First: { - id: 1, - fields: [{ name: 'x', type: 'Second' }] - } - } - - expect(() => { - initializeMessages(schema1) - }).toThrow('Unknown type') - - // correct location - let schema2 = { - First: { - id: 1, - fields: [{ name: 'x', type: 'Uint8' }] - }, - Second: { - id: 2, - fields: [{ name: 'xxx', type: 'First' }] - } - } - - expect(() => { - initializeMessages(schema2) - }).not.toThrow('Unknown type') - - // change order - let schema3 = { - Second: { - id: 2, - fields: [{ name: 'xxx', type: 'First' }] - }, - First: { - id: 1, - fields: [{ name: 'x', type: 'Uint8' }] - } - } - - expect(() => { - initializeMessages(schema3) - }).not.toThrow('Unknown type') - }) - - it('TODO: compose tests for not equal size arrays messages', () => { - expect(true).toBe(true) - }) + } + + expect(() => { + initializeMessages(schema) + }).toThrow('Unknown type') + + // missed type + let schema1 = { + First: { + id: 1, + fields: [{ name: 'x', type: 'Second' }] + } + } + + expect(() => { + initializeMessages(schema1) + }).toThrow('Unknown type') + + // correct location + let schema2 = { + First: { + id: 1, + fields: [{ name: 'x', type: 'Uint8' }] + }, + Second: { + id: 2, + fields: [{ name: 'xxx', type: 'First' }] + } + } + + expect(() => { + initializeMessages(schema2) + }).not.toThrow('Unknown type') + + // change order + let schema3 = { + Second: { + id: 2, + fields: [{ name: 'xxx', type: 'First' }] + }, + First: { + id: 1, + fields: [{ name: 'x', type: 'Uint8' }] + } + } + + expect(() => { + initializeMessages(schema3) + }).not.toThrow('Unknown type') + }) + + it('TODO: compose tests for not equal size arrays messages', () => { + expect(true).toBe(true) + }) }) diff --git a/port/js/tests/utf8.test.js b/port/js/tests/utf8.test.js index 420b555..ea231d4 100644 --- a/port/js/tests/utf8.test.js +++ b/port/js/tests/utf8.test.js @@ -3,10 +3,10 @@ import { encodeUTF8, decodeUTF8 } from '../src/utf8.js' describe('UTF8 function test', () => { - it('Encoding decoding test', () => { - let testStr = '✈✈✈ Hello world! ✈✈✈' - let byteArr = encodeUTF8(testStr) - let dstStr = decodeUTF8(byteArr) - expect(testStr).toBe(dstStr) - }) + it('Encoding decoding test', () => { + let testStr = '✈✈✈ Hello world! ✈✈✈' + let byteArr = encodeUTF8(testStr) + let dstStr = decodeUTF8(byteArr) + expect(testStr).toBe(dstStr) + }) }) From 04e4c45d935e798ee5a118eb4ad0453040b913a8 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Fri, 1 Sep 2023 15:40:44 +0400 Subject: [PATCH 06/23] prettier --- port/js/src/messgen.js | 1064 ++++++++++++++++----------------- port/js/tests/messgen.test.js | 254 ++++---- 2 files changed, 659 insertions(+), 659 deletions(-) diff --git a/port/js/src/messgen.js b/port/js/src/messgen.js index fffb206..b944058 100644 --- a/port/js/src/messgen.js +++ b/port/js/src/messgen.js @@ -12,155 +12,155 @@ const DYNAMIC_SIZE_TYPE = 'Uint32' * Write function returns type byte size. */ const basicTypes = [ - { - name: 'Char', - size: 1, - read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), - write: (v, s, a) => { - v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN) - return 1 + { + name: 'Char', + size: 1, + read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), + write: (v, s, a) => { + v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Array }, - typedArray: Array - }, - { - name: 'Int8', - size: 1, - read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setInt8(s, a, IS_LITTLE_ENDIAN) - return 1 + { + name: 'Int8', + size: 1, + read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt8(s, a, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Int8Array }, - typedArray: Int8Array - }, - { - name: 'Uint8', - size: 1, - read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setUint8(s, a, IS_LITTLE_ENDIAN) - return 1 + { + name: 'Uint8', + size: 1, + read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint8(s, a, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Uint8Array }, - typedArray: Uint8Array - }, - { - name: 'Int16', - size: 2, - read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setInt16(s, a, IS_LITTLE_ENDIAN) - return 2 + { + name: 'Int16', + size: 2, + read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt16(s, a, IS_LITTLE_ENDIAN) + return 2 + }, + typedArray: Int16Array }, - typedArray: Int16Array - }, - { - name: 'Uint16', - size: 2, - read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setUint16(s, a, IS_LITTLE_ENDIAN) - return 2 + { + name: 'Uint16', + size: 2, + read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint16(s, a, IS_LITTLE_ENDIAN) + return 2 + }, + typedArray: Uint16Array }, - typedArray: Uint16Array - }, - { - name: 'Int32', - size: 4, - read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setInt32(s, a, IS_LITTLE_ENDIAN) - return 4 + { + name: 'Int32', + size: 4, + read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Int32Array }, - typedArray: Int32Array - }, - { - name: 'Uint32', - size: 4, - read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setUint32(s, a, IS_LITTLE_ENDIAN) - return 4 + { + name: 'Uint32', + size: 4, + read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Uint32Array }, - typedArray: Uint32Array - }, - { - name: 'Int64', - size: 8, - read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setBigInt64(s, a, IS_LITTLE_ENDIAN) - return 8 + { + name: 'Int64', + size: 8, + read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigInt64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: BigInt64Array }, - typedArray: BigInt64Array - }, - { - name: 'Uint64', - size: 8, - read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setBigUint64(s, a, IS_LITTLE_ENDIAN) - return 8 + { + name: 'Uint64', + size: 8, + read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigUint64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: BigUint64Array }, - typedArray: BigUint64Array - }, - { - name: 'Float', - size: 4, - read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setFloat32(s, a, IS_LITTLE_ENDIAN) - return 4 - } - }, - { - name: 'Float32', - size: 4, - read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setFloat32(s, a, IS_LITTLE_ENDIAN) - return 4 + { + name: 'Float', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + } }, - typedArray: Float32Array - }, - { - name: 'Double', - size: 8, - read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { - v.setFloat64(s, a, IS_LITTLE_ENDIAN) - return 8 + { + name: 'Float32', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Float32Array }, - typedArray: Float64Array - }, - { - name: 'String', - size: 4, - read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), - write: (v, s, a) => { - let size = a.length - v.setUint32(s, size, true) - for (let i = 0, s2 = s + 4; i < size; i++) { - v.setUint8(s2 + i, a[i], true) - } - return size + 4 + { + name: 'Double', + size: 8, + read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: Float64Array }, - typedArray: Array - } + { + name: 'String', + size: 4, + read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), + write: (v, s, a) => { + let size = a.length + v.setUint32(s, size, true) + for (let i = 0, s2 = s + 4; i < size; i++) { + v.setUint8(s2 + i, a[i], true) + } + return size + 4 + }, + typedArray: Array + } ] let typeIndex = [], - typeSize = [] + typeSize = [] let readFunc = [], - writeFunc = [], - typedArray = [] + writeFunc = [], + typedArray = [] for (let i = 0; i < basicTypes.length; i++) { - let ti = basicTypes[i] - typeIndex[ti.name] = i - typeSize[i] = ti.size - readFunc[i] = ti.read - writeFunc[i] = ti.write - typedArray[i] = ti.typedArray + let ti = basicTypes[i] + typeIndex[ti.name] = i + typeSize[i] = ti.size + readFunc[i] = ti.read + writeFunc[i] = ti.write + typedArray[i] = ti.typedArray } const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE] @@ -169,105 +169,105 @@ const DYN_READ = readFunc[DYN_TYPE] const DYN_WRITE = writeFunc[DYN_TYPE] function parseType(typeStr, includeMessages) { - let a = typeStr.split('['), - name = a[0].trim() - - let size, - isComplex = false - - let type = typeIndex[name] - - if (type !== undefined) { - size = typeSize[type] - } else if (includeMessages && includeMessages[name]) { - type = includeMessages[name] - size = type.size - isComplex = true - } else { - throw new Error(`Unknown type: ${ name }, if is complex type you must define before the struct. `) - } - - let length = parseInt(a[1]) - - return { - typeIndex: type, - typeSize: size, - length: isNaN(length) ? 0 : length, - isArray: a.length === 2, - isComplex: isComplex - } + let a = typeStr.split('['), + name = a[0].trim() + + let size, + isComplex = false + + let type = typeIndex[name] + + if (type !== undefined) { + size = typeSize[type] + } else if (includeMessages && includeMessages[name]) { + type = includeMessages[name] + size = type.size + isComplex = true + } else { + throw new Error(`Unknown type: ${name}, if is complex type you must define before the struct. `) + } + + let length = parseInt(a[1]) + + return { + typeIndex: type, + typeSize: size, + length: isNaN(length) ? 0 : length, + isArray: a.length === 2, + isComplex: isComplex + } } /** * class Struct */ export class Struct { - constructor(schema, includeMessages) { - this._id = 0 - this._size = 0 - this._fields = null - this._schema = null - - this._includeMessages = includeMessages - - this.set(schema) - } - - get schema() { - return this._schema - } - - get id() { - return this._id - } - - get size() { - return this._size - } - - get fields() { - return this._fields - } - - set(schema) { - if (schema) { - this._id = schema.id || 0 - this._size = 0 - this._fields = new Array(schema.fields.length) - this._schema = schema - this._init() + constructor(schema, includeMessages) { + this._id = 0 + this._size = 0 + this._fields = null + this._schema = null + + this._includeMessages = includeMessages + + this.set(schema) } - } - _init() { - let schemaFields = this._schema.fields + get schema() { + return this._schema + } - let offset = 0 + get id() { + return this._id + } - for (let i = 0, len = schemaFields.length; i < len; i++) { - let si = schemaFields[i], - tp = parseType(si.type, this._includeMessages) + get size() { + return this._size + } - this._fields[i] = { - name: si.name, - type: si.type, - _offset: offset, - _prop: tp - } + get fields() { + return this._fields + } - if (tp.isArray) { - if (tp.length === 0) { - offset += DYN_TYPE_SIZE - } else { - offset += tp.typeSize * tp.length + set(schema) { + if (schema) { + this._id = schema.id || 0 + this._size = 0 + this._fields = new Array(schema.fields.length) + this._schema = schema + this._init() } - } else { - offset += tp.typeSize - } } - this._size = offset - } + _init() { + let schemaFields = this._schema.fields + + let offset = 0 + + for (let i = 0, len = schemaFields.length; i < len; i++) { + let si = schemaFields[i], + tp = parseType(si.type, this._includeMessages) + + this._fields[i] = { + name: si.name, + type: si.type, + _offset: offset, + _prop: tp + } + + if (tp.isArray) { + if (tp.length === 0) { + offset += DYN_TYPE_SIZE + } else { + offset += tp.typeSize * tp.length + } + } else { + offset += tp.typeSize + } + } + + this._size = offset + } } // uint32 seq; //!< Sequence number @@ -276,339 +276,339 @@ export class Struct { // uint8 msg_id; //!< Message type ID export const HEADER_STRUCT = new Struct({ - fields: [ - { name: 'seq', type: 'Uint32' }, - { name: 'cls', type: 'Uint8' }, - { name: 'msg_id', type: 'Uint8' }, - { name: 'size', type: 'Uint32' } - ] + fields: [ + { name: 'seq', type: 'Uint32' }, + { name: 'cls', type: 'Uint8' }, + { name: 'msg_id', type: 'Uint8' }, + { name: 'size', type: 'Uint32' } + ] }) /** * class Buffer */ export class Buffer { - _useTypedArray = false - - constructor(arrayBuffer, useTypedArray = false) { - this._dataView = new DataView(arrayBuffer) - this._dynamicOffset = 0 - this._useTypedArray = useTypedArray - } - - // TODO: перенести в модуль messages - // а модуль messages генерализировать - static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { - let res = [] - let buf = new Buffer(data) - let cur = 0 - while (cur < buf.size) { - let h = buf.deserialize(headerStruct, cur), - m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__) - m.__MSG_ID__ = h.msg_id - cur += h.__SIZE__ + m.__SIZE__ - res.push(m) - } - return res - } - - static mergeArrayBuffers(tArrs, type = Uint8Array) { - const ret = new type(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)) - let off = 0 - tArrs.forEach((tArr) => { - ret.set(new type(tArr), off) - off += tArr.byteLength - }) - return ret - } - - static appendBuffer(buffer1, buffer2) { - var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength) - tmp.set(new Uint8Array(buffer1), 0) - tmp.set(new Uint8Array(buffer2), buffer1.byteLength) - return tmp.buffer - } - - static calcSize(fields, includeMessages) { - let size = 0 - - for (let i = 0, len = fields.length; i < len; i++) { - let fi = fields[i], - tp = (fi._prop = parseType(fi.type, includeMessages)) - - if (tp.isArray) { - if (tp.isComplex) { - if (tp.length === 0) { - size += DYN_TYPE_SIZE - } - for (let i = 0; i < fi.value.length; i++) { - let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages) - size += Buffer.calcSize(arr, includeMessages) - } - } else { - let arrayLength = 0 - - // Dynamic size array - if (tp.length === 0) { - arrayLength = fi.value.length - size += tp.typeSize * arrayLength + DYN_TYPE_SIZE // for dynamic array length descriptor - } else { - // static size array - arrayLength = tp.length - size += tp.typeSize * arrayLength - } - - if (tp.typeIndex === typeIndex.String) { - fi._bytes = [] - for (let i = 0; i < arrayLength; i++) { - let b = encodeUTF8(fi.value[i] || '') - fi._bytes.push(b) - size += b.length - } - } - } - } else if (tp.typeIndex === typeIndex.String) { - fi._bytes = encodeUTF8(fi.value || '') - size += tp.typeSize + fi._bytes.length - } else { - if (tp.isComplex) { - size += Buffer.calcSize(fi.value, includeMessages) - } else { - size += tp.typeSize - } - } - } - - return size - } + _useTypedArray = false - static createValueArray(schemaFields, obj, includeMessages) { - const len = schemaFields.length - - let arr = new Array(len) - - for (let k = 0; k < len; k++) { - let sk = schemaFields[k], - type = sk.type + constructor(arrayBuffer, useTypedArray = false) { + this._dataView = new DataView(arrayBuffer) + this._dynamicOffset = 0 + this._useTypedArray = useTypedArray + } - if (includeMessages && includeMessages[type]) { - arr[k] = { - value: Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), - type: type + // TODO: перенести в модуль messages + // а модуль messages генерализировать + static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { + let res = [] + let buf = new Buffer(data) + let cur = 0 + while (cur < buf.size) { + let h = buf.deserialize(headerStruct, cur), + m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__) + m.__MSG_ID__ = h.msg_id + cur += h.__SIZE__ + m.__SIZE__ + res.push(m) } - } else { - arr[k] = { value: obj[sk.name], type: type } - } + return res } - return arr - } - - static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { - let arr = Buffer.createValueArray(struct.fields, obj, includeMessages) - - let messageSize = Buffer.calcSize(arr, includeMessages) + static mergeArrayBuffers(tArrs, type = Uint8Array) { + const ret = new type(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)) + let off = 0 + tArrs.forEach((tArr) => { + ret.set(new type(tArr), off) + off += tArr.byteLength + }) + return ret + } - let headerBuf = Buffer.serializeObj( - headerStruct.fields, - { - seq: obj.seq, - size: messageSize, - cls: obj.cls, - msg_id: struct.id - }, - includeMessages - ) + static appendBuffer(buffer1, buffer2) { + var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength) + tmp.set(new Uint8Array(buffer1), 0) + tmp.set(new Uint8Array(buffer2), buffer1.byteLength) + return tmp.buffer + } - return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)) - } + static calcSize(fields, includeMessages) { + let size = 0 + + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + tp = (fi._prop = parseType(fi.type, includeMessages)) + + if (tp.isArray) { + if (tp.isComplex) { + if (tp.length === 0) { + size += DYN_TYPE_SIZE + } + for (let i = 0; i < fi.value.length; i++) { + let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages) + size += Buffer.calcSize(arr, includeMessages) + } + } else { + let arrayLength = 0 + + // Dynamic size array + if (tp.length === 0) { + arrayLength = fi.value.length + size += tp.typeSize * arrayLength + DYN_TYPE_SIZE // for dynamic array length descriptor + } else { + // static size array + arrayLength = tp.length + size += tp.typeSize * arrayLength + } + + if (tp.typeIndex === typeIndex.String) { + fi._bytes = [] + for (let i = 0; i < arrayLength; i++) { + let b = encodeUTF8(fi.value[i] || '') + fi._bytes.push(b) + size += b.length + } + } + } + } else if (tp.typeIndex === typeIndex.String) { + fi._bytes = encodeUTF8(fi.value || '') + size += tp.typeSize + fi._bytes.length + } else { + if (tp.isComplex) { + size += Buffer.calcSize(fi.value, includeMessages) + } else { + size += tp.typeSize + } + } + } - static serializeObj(schemaFields, obj, includeMessages) { - let arr = Buffer.createValueArray(schemaFields, obj, includeMessages) + return size + } - return Buffer.serialize(arr, includeMessages) - } + static createValueArray(schemaFields, obj, includeMessages) { + const len = schemaFields.length - static writeDataView(fields, dataView, includeMessages, offset = 0) { - for (let i = 0, len = fields.length; i < len; i++) { - let fi = fields[i], - p = fi._prop + let arr = new Array(len) - if (p.isArray) { - let arrayLength = p.length + for (let k = 0; k < len; k++) { + let sk = schemaFields[k], + type = sk.type - // Setting array size value for dynamic array size - if (arrayLength === 0) { - arrayLength = fi.value.length - offset += DYN_WRITE(dataView, offset, fi.value.length) + if (includeMessages && includeMessages[type]) { + arr[k] = { + value: Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), + type: type + } + } else { + arr[k] = { value: obj[sk.name], type: type } + } } - // Write array - for (let j = 0; j < arrayLength; j++) { - let val = (fi._bytes && fi._bytes[j]) || fi.value[j] - if (p.isComplex) { - let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages) - let size = Buffer.calcSize(valArr, includeMessages) - Buffer.writeDataView(valArr, dataView, includeMessages, offset) - offset += size - } else { - offset += writeFunc[p.typeIndex](dataView, offset, val) - } - } - } else { - if (p.isComplex) { - let size = Buffer.calcSize(fi.value, includeMessages) - Buffer.writeDataView(fi.value, dataView, includeMessages, offset) - offset += size - } else { - let val = fi._bytes || fi.value - offset += writeFunc[p.typeIndex](dataView, offset, val) - } - } + return arr } - return offset - } + static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { + let arr = Buffer.createValueArray(struct.fields, obj, includeMessages) - static serialize(fields, includeMessages) { - let allSize = Buffer.calcSize(fields, includeMessages) + let messageSize = Buffer.calcSize(arr, includeMessages) - let arrayBuffer = new ArrayBuffer(allSize), - dv = new DataView(arrayBuffer) + let headerBuf = Buffer.serializeObj( + headerStruct.fields, + { + seq: obj.seq, + size: messageSize, + cls: obj.cls, + msg_id: struct.id + }, + includeMessages + ) - Buffer.writeDataView(fields, dv, includeMessages) - - return arrayBuffer - } - - get size() { - return this._dataView.buffer.byteLength - } - - get dataView() { - return this._dataView - } + return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)) + } - set(arrayBuffer) { - this._dataView = null - this._dataView = new DataView(arrayBuffer) - } + static serializeObj(schemaFields, obj, includeMessages) { + let arr = Buffer.createValueArray(schemaFields, obj, includeMessages) - deserialize(struct, offset = 0, sizeOffset = 0) { - this._dynamicOffset = 0 - let res = this.__deserialize__(struct, offset, sizeOffset) - res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset - return res - } + return Buffer.serialize(arr, includeMessages) + } - __deserialize__(struct, offset, sizeOffset) { - this._includeMessages = struct._includeMessages + static writeDataView(fields, dataView, includeMessages, offset = 0) { + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + p = fi._prop + + if (p.isArray) { + let arrayLength = p.length + + // Setting array size value for dynamic array size + if (arrayLength === 0) { + arrayLength = fi.value.length + offset += DYN_WRITE(dataView, offset, fi.value.length) + } + + // Write array + for (let j = 0; j < arrayLength; j++) { + let val = (fi._bytes && fi._bytes[j]) || fi.value[j] + if (p.isComplex) { + let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages) + let size = Buffer.calcSize(valArr, includeMessages) + Buffer.writeDataView(valArr, dataView, includeMessages, offset) + offset += size + } else { + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } else { + if (p.isComplex) { + let size = Buffer.calcSize(fi.value, includeMessages) + Buffer.writeDataView(fi.value, dataView, includeMessages, offset) + offset += size + } else { + let val = fi._bytes || fi.value + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } - let fields = struct.fields, - dv = this._dataView, - res = {} + return offset + } - let currOffset = 0 + static serialize(fields, includeMessages) { + let allSize = Buffer.calcSize(fields, includeMessages) - for (let f = 0, len = fields.length; f < len; f++) { - let fi = fields[f], - p = fi._prop + let arrayBuffer = new ArrayBuffer(allSize), + dv = new DataView(arrayBuffer) - currOffset = offset + fi._offset - const ArrayType = this._useTypedArray ? typedArray[p.typeIndex] ?? Array : Array + Buffer.writeDataView(fields, dv, includeMessages) - if (p.isArray) { - if (p.length === 0) { - // - // Dynamic size array - // + return arrayBuffer + } - let length = DYN_READ(dv, currOffset + this._dynamicOffset) + get size() { + return this._dataView.buffer.byteLength + } - res[fi.name] = new ArrayType(length) + get dataView() { + return this._dataView + } - let currOffset_dyn = DYN_TYPE_SIZE + currOffset + set(arrayBuffer) { + this._dataView = null + this._dataView = new DataView(arrayBuffer) + } - if (p.typeIndex === typeIndex.String) { - for (let j = 0; j < length; j++) { - res[fi.name][j] = readFunc[p.typeIndex]( - dv, - currOffset_dyn + this._dynamicOffset + j * p.typeSize - ) - this._dynamicOffset += dv.getUint32( - currOffset_dyn + this._dynamicOffset + j * p.typeSize, - true - ) - } - } else { - if (p.isComplex) { - for (let j = 0; j < length; j++) { - res[fi.name][j] = this.__deserialize__( - p.typeIndex, - currOffset_dyn + j * p.typeSize, - sizeOffset - ) - } - } else { - for (let j = 0; j < length; j++) { - res[fi.name][j] = readFunc[p.typeIndex]( - dv, - currOffset_dyn + this._dynamicOffset + j * p.typeSize - ) - } - } - } + deserialize(struct, offset = 0, sizeOffset = 0) { + this._dynamicOffset = 0 + let res = this.__deserialize__(struct, offset, sizeOffset) + res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset + return res + } - this._dynamicOffset += length * p.typeSize - } else { - // - //Static size array - // - - res[fi.name] = new ArrayType(p.length) - - if (p.typeIndex === typeIndex.String) { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = readFunc[p.typeIndex]( - dv, - currOffset + this._dynamicOffset + j * p.typeSize - ) - this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true) - } - } else { - if (p.isComplex) { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = this.__deserialize__( - p.typeIndex, - currOffset + j * p.typeSize, - sizeOffset - ) - } + __deserialize__(struct, offset, sizeOffset) { + this._includeMessages = struct._includeMessages + + let fields = struct.fields, + dv = this._dataView, + res = {} + + let currOffset = 0 + + for (let f = 0, len = fields.length; f < len; f++) { + let fi = fields[f], + p = fi._prop + + currOffset = offset + fi._offset + const ArrayType = this._useTypedArray ? typedArray[p.typeIndex] ?? Array : Array + + if (p.isArray) { + if (p.length === 0) { + // + // Dynamic size array + // + + let length = DYN_READ(dv, currOffset + this._dynamicOffset) + + res[fi.name] = new ArrayType(length) + + let currOffset_dyn = DYN_TYPE_SIZE + currOffset + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32( + currOffset_dyn + this._dynamicOffset + j * p.typeSize, + true + ) + } + } else { + if (p.isComplex) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = this.__deserialize__( + p.typeIndex, + currOffset_dyn + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + } + } + } + + this._dynamicOffset += length * p.typeSize + } else { + // + //Static size array + // + + res[fi.name] = new ArrayType(p.length) + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true) + } + } else { + if (p.isComplex) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = this.__deserialize__( + p.typeIndex, + currOffset + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + } + } + } + } } else { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = readFunc[p.typeIndex]( - dv, - currOffset + this._dynamicOffset + j * p.typeSize - ) - } + if (p.isComplex) { + res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset) + } else { + res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset) + + if (p.typeIndex === typeIndex.String) { + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true) + } + } } - } } - } else { - if (p.isComplex) { - res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset) - } else { - res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset) - if (p.typeIndex === typeIndex.String) { - this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true) - } - } - } + return res } - - return res - } } /** @@ -617,37 +617,37 @@ export class Buffer { * @param {*} headerSchema - message header schema */ export function initializeMessages(messagesJson, headerSchema) { - let res = { - __id__: [], - __name__: [], - HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT - } - - for (let m of getKeysWithSortById(messagesJson)) { - let name = m.trim(), - messageObj = messagesJson[m], - msg = 'MSG_' + name.toUpperCase(), - id = messageObj.id - - if (!res.__id__[id]) { - let msg_struct = new Struct(messageObj, res) - - res.__id__[id] = msg_struct - res.__name__[id] = m.trim() - res[msg] = msg_struct - res[name] = msg_struct - } else { - console.warn(`Warning: message ${ id } ${ msg } already exists.`) + let res = { + __id__: [], + __name__: [], + HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT } - } - return res + for (let m of getKeysWithSortById(messagesJson)) { + let name = m.trim(), + messageObj = messagesJson[m], + msg = 'MSG_' + name.toUpperCase(), + id = messageObj.id + + if (!res.__id__[id]) { + let msg_struct = new Struct(messageObj, res) + + res.__id__[id] = msg_struct + res.__name__[id] = m.trim() + res[msg] = msg_struct + res[name] = msg_struct + } else { + console.warn(`Warning: message ${id} ${msg} already exists.`) + } + } + + return res } const getKeysWithSortById = (obj) => { - let keys = Object.keys(obj) - keys.sort((a, b) => { - return obj[a].id - obj[b].id - }) - return keys + let keys = Object.keys(obj) + keys.sort((a, b) => { + return obj[a].id - obj[b].id + }) + return keys } diff --git a/port/js/tests/messgen.test.js b/port/js/tests/messgen.test.js index e1da388..bb72feb 100644 --- a/port/js/tests/messgen.test.js +++ b/port/js/tests/messgen.test.js @@ -162,138 +162,138 @@ describe('Serialization deserialization tests', () => { }) it('Basic types fixed typed array size', () => { - const ARRAY_SIZE = 100 - - let srcStruct = new Struct({ - id: 2, - fields: [ - { name: 'type_Int8', type: `Int8[${ARRAY_SIZE}]` }, - { name: 'type_Uint8', type: `Uint8[${ARRAY_SIZE}]` }, - { name: 'type_Int16', type: `Int16[${ARRAY_SIZE}]` }, - { name: 'type_Uint16', type: `Uint16[${ARRAY_SIZE}]` }, - { name: 'type_Int32', type: `Int32[${ARRAY_SIZE}]` }, - { name: 'type_Uint32', type: `Uint32[${ARRAY_SIZE}]` }, - { name: 'type_Int64', type: `Int64[${ARRAY_SIZE}]` }, - { name: 'type_Uint64', type: `Uint64[${ARRAY_SIZE}]` }, - { name: 'type_String', type: `String[${ARRAY_SIZE}]` }, - { name: 'type_Double', type: `Double[${ARRAY_SIZE}]` }, - { name: 'type_Char', type: `Char[${ARRAY_SIZE}]` } - ] - }) + const ARRAY_SIZE = 100 - let srcData = { - type_Int8: new Int8Array(ARRAY_SIZE), - type_Uint8: new Uint8Array(ARRAY_SIZE), - type_Int16: new Int16Array(ARRAY_SIZE), - type_Uint16: new Uint16Array(ARRAY_SIZE), - type_Int32: new Int32Array(ARRAY_SIZE), - type_Uint32: new Uint32Array(ARRAY_SIZE), - type_Int64: new BigInt64Array(ARRAY_SIZE), - type_Uint64: new BigUint64Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Float64Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - } - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i - srcData.type_Uint8[i] = i - srcData.type_Int16[i] = i - srcData.type_Uint16[i] = i - srcData.type_Int32[i] = i - srcData.type_Uint32[i] = i - srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) - srcData.type_Uint64[i] = BigInt(i) - srcData.type_String[i] = 'string-' + i - srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 - srcData.type_Char[i] = 'a' - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) - - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) - let res = new Buffer(b, true).deserialize(srcStruct) - - expect(res).toEqual(srcData) - }) - - it('Basic types dynamic typed array size', () => { - const ARRAY_SIZE = 100 - - let srcStruct = new Struct({ - id: 2, - fields: [ - { name: 'type_Int8', type: `Int8[]` }, - { name: 'type_Uint8', type: `Uint8[]` }, - { name: 'type_Int16', type: `Int16[]` }, - { name: 'type_Uint16', type: `Uint16[]` }, - { name: 'type_Int32', type: `Int32[]` }, - { name: 'type_Uint32', type: `Uint32[]` }, - { name: 'type_Int64', type: `Int64[]` }, - { name: 'type_Uint64', type: `Uint64[]` }, - { name: 'type_String', type: `String[]` }, - { name: 'type_Double', type: `Double[]` }, - { name: 'type_Char', type: `Char[]` } - ] + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[${ARRAY_SIZE}]` }, + { name: 'type_Uint8', type: `Uint8[${ARRAY_SIZE}]` }, + { name: 'type_Int16', type: `Int16[${ARRAY_SIZE}]` }, + { name: 'type_Uint16', type: `Uint16[${ARRAY_SIZE}]` }, + { name: 'type_Int32', type: `Int32[${ARRAY_SIZE}]` }, + { name: 'type_Uint32', type: `Uint32[${ARRAY_SIZE}]` }, + { name: 'type_Int64', type: `Int64[${ARRAY_SIZE}]` }, + { name: 'type_Uint64', type: `Uint64[${ARRAY_SIZE}]` }, + { name: 'type_String', type: `String[${ARRAY_SIZE}]` }, + { name: 'type_Double', type: `Double[${ARRAY_SIZE}]` }, + { name: 'type_Char', type: `Char[${ARRAY_SIZE}]` } + ] + }) + + let srcData = { + type_Int8: new Int8Array(ARRAY_SIZE), + type_Uint8: new Uint8Array(ARRAY_SIZE), + type_Int16: new Int16Array(ARRAY_SIZE), + type_Uint16: new Uint16Array(ARRAY_SIZE), + type_Int32: new Int32Array(ARRAY_SIZE), + type_Uint32: new Uint32Array(ARRAY_SIZE), + type_Int64: new BigInt64Array(ARRAY_SIZE), + type_Uint64: new BigUint64Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Float64Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 + srcData.type_Char[i] = 'a' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + let res = new Buffer(b, true).deserialize(srcStruct) + + expect(res).toEqual(srcData) }) - let srcData = { - type_Int8: new Int8Array(ARRAY_SIZE), - type_Uint8: new Uint8Array(ARRAY_SIZE), - type_Int16: new Int16Array(ARRAY_SIZE), - type_Uint16: new Uint16Array(ARRAY_SIZE), - type_Int32: new Int32Array(ARRAY_SIZE), - type_Uint32: new Uint32Array(ARRAY_SIZE), - type_Int64: new BigInt64Array(ARRAY_SIZE), - type_Uint64: new BigUint64Array(ARRAY_SIZE), - type_String: new Array(ARRAY_SIZE), - type_Double: new Float64Array(ARRAY_SIZE), - type_Char: new Array(ARRAY_SIZE) - } - - for (let i = 0; i < ARRAY_SIZE; i++) { - srcData.type_Int8[i] = i - srcData.type_Uint8[i] = i - srcData.type_Int16[i] = i - srcData.type_Uint16[i] = i - srcData.type_Int32[i] = i - srcData.type_Uint32[i] = i - srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) - srcData.type_Uint64[i] = BigInt(i) - srcData.type_String[i] = 'string-' + i - srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 - srcData.type_Char[i] = 'A' - } - - //Testing proper size of the message - srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) - - let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) - - let res = new Buffer(b, true).deserialize(srcStruct) - - expect(res).toEqual(srcData) - }) - - it('Basic message with header', () => { - let srcStruct = new Struct({ - id: 2, - fields: [ - { name: 'type_Int8', type: 'Int8' }, - { name: 'type_Uint8', type: 'Uint8' }, - { name: 'type_Int16', type: 'Int16' }, - { name: 'type_Uint16', type: 'Uint16' }, - { name: 'type_Int32', type: 'Int32' }, - { name: 'type_Uint32', type: 'Uint32' }, - { name: 'type_Int64', type: 'Int64' }, - { name: 'type_Uint64', type: 'Uint64' }, - { name: 'type_String', type: 'String' }, - { name: 'type_Double', type: 'Double' }, - { name: 'type_Char', type: 'Char' } - ] + it('Basic types dynamic typed array size', () => { + const ARRAY_SIZE = 100 + + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: `Int8[]` }, + { name: 'type_Uint8', type: `Uint8[]` }, + { name: 'type_Int16', type: `Int16[]` }, + { name: 'type_Uint16', type: `Uint16[]` }, + { name: 'type_Int32', type: `Int32[]` }, + { name: 'type_Uint32', type: `Uint32[]` }, + { name: 'type_Int64', type: `Int64[]` }, + { name: 'type_Uint64', type: `Uint64[]` }, + { name: 'type_String', type: `String[]` }, + { name: 'type_Double', type: `Double[]` }, + { name: 'type_Char', type: `Char[]` } + ] + }) + + let srcData = { + type_Int8: new Int8Array(ARRAY_SIZE), + type_Uint8: new Uint8Array(ARRAY_SIZE), + type_Int16: new Int16Array(ARRAY_SIZE), + type_Uint16: new Uint16Array(ARRAY_SIZE), + type_Int32: new Int32Array(ARRAY_SIZE), + type_Uint32: new Uint32Array(ARRAY_SIZE), + type_Int64: new BigInt64Array(ARRAY_SIZE), + type_Uint64: new BigUint64Array(ARRAY_SIZE), + type_String: new Array(ARRAY_SIZE), + type_Double: new Float64Array(ARRAY_SIZE), + type_Char: new Array(ARRAY_SIZE) + } + + for (let i = 0; i < ARRAY_SIZE; i++) { + srcData.type_Int8[i] = i + srcData.type_Uint8[i] = i + srcData.type_Int16[i] = i + srcData.type_Uint16[i] = i + srcData.type_Int32[i] = i + srcData.type_Uint32[i] = i + srcData.type_Int64[i] = BigInt(-ARRAY_SIZE + i) + srcData.type_Uint64[i] = BigInt(i) + srcData.type_String[i] = 'string-' + i + srcData.type_Double[i] = (-ARRAY_SIZE + i) / 3.0 + srcData.type_Char[i] = 'A' + } + + //Testing proper size of the message + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)) + + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData) + + let res = new Buffer(b, true).deserialize(srcStruct) + + expect(res).toEqual(srcData) }) + it('Basic message with header', () => { + let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: 'Int8' }, + { name: 'type_Uint8', type: 'Uint8' }, + { name: 'type_Int16', type: 'Int16' }, + { name: 'type_Uint16', type: 'Uint16' }, + { name: 'type_Int32', type: 'Int32' }, + { name: 'type_Uint32', type: 'Uint32' }, + { name: 'type_Int64', type: 'Int64' }, + { name: 'type_Uint64', type: 'Uint64' }, + { name: 'type_String', type: 'String' }, + { name: 'type_Double', type: 'Double' }, + { name: 'type_Char', type: 'Char' } + ] + }) + let srcData = { type_Int8: 8, type_Uint8: 8, From 66a340f644017c76e472612e755a421c8f314b59 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Fri, 1 Sep 2023 15:41:31 +0400 Subject: [PATCH 07/23] Ignore compiled TypeScript file Added tests/js/MessgenHelper.ts in .gitignore file to prevent tracking the compiled TypeScript file. This ensures the repository only tracks original source files and not the files generated after compilation. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7784f5b..b9553e3 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ tests/cpp/messgen tests/js/tmp tests/js/coverage tests/js/messgen +tests/js/MessgenHelper.ts From 1d56012d49c6479b674e2b900b8c1b7d575d55ff Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Fri, 1 Sep 2023 17:04:03 +0400 Subject: [PATCH 08/23] Add support for typed arrays in TypeScript code generation --- .run/generate-ts .run.xml | 24 ++++++++++++++ .run/generate-ts-with-typed-array.run.xml | 24 ++++++++++++++ README.md | 7 ++++ messgen/ts_generator.py | 27 +++++++++++++--- .../messgen_test/typed_array_message.yaml | 32 +++++++++++++++++++ 5 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 .run/generate-ts .run.xml create mode 100644 .run/generate-ts-with-typed-array.run.xml create mode 100644 tests/messages/messgen/messgen_test/typed_array_message.yaml diff --git a/.run/generate-ts .run.xml b/.run/generate-ts .run.xml new file mode 100644 index 0000000..6db3003 --- /dev/null +++ b/.run/generate-ts .run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/generate-ts-with-typed-array.run.xml b/.run/generate-ts-with-typed-array.run.xml new file mode 100644 index 0000000..7b5fcd0 --- /dev/null +++ b/.run/generate-ts-with-typed-array.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/README.md b/README.md index fdbae6a..990f0a4 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,13 @@ The types of these messages for TS can be generated as follows: python3 generate.py -b ./base_dir -m my_vendor/my_protocol -l ts -o out/ts ``` +if it is necessary to generate typed arrays for TS, it is necessary to pass the flag `-D typed_arrays=true`: +``` +python3 generate.py -b ./base_dir -m my_vendor/my_protocol -l ts -o out/ts -D typed_arrays=true +``` + + + #### MD Example for protocol documentation generation: diff --git a/messgen/ts_generator.py b/messgen/ts_generator.py index 1e06207..92a2c21 100644 --- a/messgen/ts_generator.py +++ b/messgen/ts_generator.py @@ -14,13 +14,27 @@ "float32": "number", "float64": "bigint", "string": "string", +} +ts_types_array = { + "int8": "Int8Array", + "uint8": "Uint8Array", + "int16": "Int16Array", + "uint16": "Uint16Array", + "int32": "Int32Array", + "uint32": "Uint32Array", + "int64": "BigInt64Array", + "uint64": "BigUint64Array", + "float32": "Float32Array", + "float64": "Float64Array", } + def to_camelcase(str): return ''.join(x for x in str.title().replace('_', '') if not x.isspace()) -def format_type(f): + +def format_type(f, use_typed_arrays=False): t = ts_types_map.get(f["type"], f["type"]) f_type = t[0].lower() + t[1:] @@ -29,10 +43,15 @@ def format_type(f): f_type = din_type + "Message" if (f["is_array"]): - f_type += "[]" + tArray = ts_types_array.get(f["type"]) + if (tArray is not None and use_typed_arrays): + f_type = tArray + else: + f_type = f_type + "[]" return f_type + class TsGenerator: PROTO_TYPE_VAR_TYPE = "uint8" @@ -40,7 +59,7 @@ def __init__(self, modules_map, data_types_map, module_sep, variables): self.MODULE_SEP = module_sep self._modules_map = modules_map self._data_types_map = data_types_map - + self._variables = variables def generate(self, out_dir): imports = [] @@ -80,7 +99,7 @@ def generate_interface(self, msg): fields_p = [] for f in msg["fields"]: f_name = f["name"] - f_type = format_type(f) + f_type = format_type(f, self._variables.get('typed_arrays','false') == 'true') if f.get("descr") is not None: fields_p.append(' /** %s */' % str(f.get("descr"))) fields_p.append(' %s: %s' % (f_name, f_type)) diff --git a/tests/messages/messgen/messgen_test/typed_array_message.yaml b/tests/messages/messgen/messgen_test/typed_array_message.yaml new file mode 100644 index 0000000..15ee1e6 --- /dev/null +++ b/tests/messages/messgen/messgen_test/typed_array_message.yaml @@ -0,0 +1,32 @@ +id: 15 +fields: + - name: type_Int8 + type: int8[100] + + - name: type_Uint8 + type: uint8[100] + + - name: type_Int16 + type: int16[100] + + - name: type_Uint16 + type: uint16[100] + + - name: type_Int32 + type: int32[100] + + - name: type_Uint32 + type: uint32[100] + + - name: type_Int64 + type: int64[100] + + - name: type_Uint64 + type: uint64[100] + + - name: type_String + type: string[100] + + + - name: type_Char + type: char From f80cb88cebacce0e350d039d15774fe1e38fedad Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Mon, 4 Sep 2023 12:12:31 +0400 Subject: [PATCH 09/23] fix: Array of strings is not supported in C++ generator --- .../messgen/messgen_test/typed_array_dynamic_message.yaml | 4 ---- tests/messages/messgen/messgen_test/typed_array_message.yaml | 3 --- 2 files changed, 7 deletions(-) diff --git a/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml b/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml index 1a1561c..1f1728a 100644 --- a/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml +++ b/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml @@ -24,9 +24,5 @@ fields: - name: type_Uint64 type: uint64[] - - name: type_String - type: string[] - - - name: type_Char type: char diff --git a/tests/messages/messgen/messgen_test/typed_array_message.yaml b/tests/messages/messgen/messgen_test/typed_array_message.yaml index 15ee1e6..5305358 100644 --- a/tests/messages/messgen/messgen_test/typed_array_message.yaml +++ b/tests/messages/messgen/messgen_test/typed_array_message.yaml @@ -24,9 +24,6 @@ fields: - name: type_Uint64 type: uint64[100] - - name: type_String - type: string[100] - - name: type_Char type: char From b02c88db50ebcca795e9df8670650b4005c4782b Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Mon, 4 Sep 2023 15:14:19 +0400 Subject: [PATCH 10/23] Remove specific run configurations from project --- .gitignore | 1 + .run/generate-ts .run.xml | 24 ----------------------- .run/generate-ts-with-typed-array.run.xml | 24 ----------------------- 3 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 .run/generate-ts .run.xml delete mode 100644 .run/generate-ts-with-typed-array.run.xml diff --git a/.gitignore b/.gitignore index b9553e3..8ff021b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # IntelliJ project files .idea +.run # Build files *.pyc diff --git a/.run/generate-ts .run.xml b/.run/generate-ts .run.xml deleted file mode 100644 index 6db3003..0000000 --- a/.run/generate-ts .run.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.run/generate-ts-with-typed-array.run.xml b/.run/generate-ts-with-typed-array.run.xml deleted file mode 100644 index 7b5fcd0..0000000 --- a/.run/generate-ts-with-typed-array.run.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - \ No newline at end of file From 1fb8aba57bf84d3c3893f1ecb8c50b9b81bc68ec Mon Sep 17 00:00:00 2001 From: Yuriy Kamnev Date: Tue, 31 Oct 2023 10:45:47 +0000 Subject: [PATCH 11/23] cpp-generator: ensure that all parsed string_views are initialized with valid pointer to empty string --- messgen/cpp_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messgen/cpp_generator.py b/messgen/cpp_generator.py index 1e3f5b3..b45725c 100644 --- a/messgen/cpp_generator.py +++ b/messgen/cpp_generator.py @@ -690,7 +690,7 @@ def generate_parse_method(self, message): "" ]) self.continue_block("else") - self.append(set_var(field["name"], "{}")) + self.append(set_var(field["name"], "\"\"")) self.stop_block() else: parse_call = "parse_result = %s.parse_msg(%s, len, %s);" % (field["name"], "ptr", INPUT_ALLOC_NAME) From f1977ad79991e81b590ba2ac0ec93a40b3d88c7c Mon Sep 17 00:00:00 2001 From: Roman Strakhov Date: Fri, 8 Dec 2023 22:39:55 +0400 Subject: [PATCH 12/23] Make robust version hash generator. Sort module, discard comments and names --- messgen/version_protocol.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/messgen/version_protocol.py b/messgen/version_protocol.py index 72dfa20..7bc364b 100644 --- a/messgen/version_protocol.py +++ b/messgen/version_protocol.py @@ -1,12 +1,30 @@ import hashlib - +import json class VersionProtocol: def __init__(self, module): self._module = module + # Returns true for key-value pairs that should not affect proto version hash + def should_discard(self, key, value): + return (key in ['descr', 'name']) and isinstance(value, str) + + # Recursively sort the dictionary by keys, excluding certain keys, and return its sorted JSON representation. + def _sorted_purified_dict(self, obj): + if isinstance(obj, dict): + return {k: self._sorted_purified_dict(obj[k]) for k in sorted(obj) if not self.should_discard(k, obj[k])} + elif isinstance(obj, list): + return sorted([self._sorted_purified_dict(x) for x in obj], key=lambda x: json.dumps(x)) + else: + return obj def generate(self): - result = hashlib.md5(str(self._module).encode()) + # Sort the module dictionary recursively, excluding certain keys + sorted_module = self._sorted_purified_dict(self._module) + + # Convert the sorted dictionary to a JSON string and encode it + encoded_module = json.dumps(sorted_module, separators=(',', ':')).encode() + # Create the hash and return the first 6 characters + result = hashlib.md5(encoded_module) return result.hexdigest()[0:6] From 28c7c7102781a95ee2b616d89c1964023f0b65d2 Mon Sep 17 00:00:00 2001 From: Roman Strakhov Date: Mon, 11 Dec 2023 14:50:30 +0400 Subject: [PATCH 13/23] revert protocol version generator --- messgen/version_protocol.py | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/messgen/version_protocol.py b/messgen/version_protocol.py index 7bc364b..72dfa20 100644 --- a/messgen/version_protocol.py +++ b/messgen/version_protocol.py @@ -1,30 +1,12 @@ import hashlib -import json + class VersionProtocol: def __init__(self, module): self._module = module - # Returns true for key-value pairs that should not affect proto version hash - def should_discard(self, key, value): - return (key in ['descr', 'name']) and isinstance(value, str) - - # Recursively sort the dictionary by keys, excluding certain keys, and return its sorted JSON representation. - def _sorted_purified_dict(self, obj): - if isinstance(obj, dict): - return {k: self._sorted_purified_dict(obj[k]) for k in sorted(obj) if not self.should_discard(k, obj[k])} - elif isinstance(obj, list): - return sorted([self._sorted_purified_dict(x) for x in obj], key=lambda x: json.dumps(x)) - else: - return obj def generate(self): - # Sort the module dictionary recursively, excluding certain keys - sorted_module = self._sorted_purified_dict(self._module) - - # Convert the sorted dictionary to a JSON string and encode it - encoded_module = json.dumps(sorted_module, separators=(',', ':')).encode() + result = hashlib.md5(str(self._module).encode()) - # Create the hash and return the first 6 characters - result = hashlib.md5(encoded_module) return result.hexdigest()[0:6] From f69c68073e06b21aa59804013310e90131310b9f Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Wed, 27 Mar 2024 18:40:25 +0400 Subject: [PATCH 14/23] Remove rollup.config.js and add benchmarking scripts --- port/js/benchmarks/fromEntries.benchmark.js | 61 + port/js/benchmarks/serializeObj.benchmark.js | 50 + .../src-variant/messgen-fromEntries.js | 657 ++ port/js/benchmarks/src-variant/messgen-old.js | 653 ++ port/js/benchmarks/src-variant/utf8.js | 67 + port/js/benchmarks/utils/logBench.js | 25 + port/js/package-lock.json | 7161 ++++------------- port/js/package.json | 16 +- port/js/rollup.config.js | 20 - port/js/vite.config.js | 32 + 10 files changed, 3011 insertions(+), 5731 deletions(-) create mode 100644 port/js/benchmarks/fromEntries.benchmark.js create mode 100644 port/js/benchmarks/serializeObj.benchmark.js create mode 100644 port/js/benchmarks/src-variant/messgen-fromEntries.js create mode 100644 port/js/benchmarks/src-variant/messgen-old.js create mode 100644 port/js/benchmarks/src-variant/utf8.js create mode 100644 port/js/benchmarks/utils/logBench.js delete mode 100644 port/js/rollup.config.js create mode 100644 port/js/vite.config.js diff --git a/port/js/benchmarks/fromEntries.benchmark.js b/port/js/benchmarks/fromEntries.benchmark.js new file mode 100644 index 0000000..b2aab11 --- /dev/null +++ b/port/js/benchmarks/fromEntries.benchmark.js @@ -0,0 +1,61 @@ +import { bench } from 'vitest' + +import {Struct} from '../src/messgen.js'; +import {Buffer} from './src-variant/messgen-old.js'; +import { Buffer as BufferFormEntries} from './src-variant/messgen-fromEntries.js'; + +import { bench, describe } from 'vitest' + +let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: 'Int8' }, + { name: 'type_Uint8', type: 'Uint8' }, + { name: 'type_Int16', type: 'Int16' }, + { name: 'type_Uint16', type: 'Uint16' }, + { name: 'type_Int32', type: 'Int32' }, + { name: 'type_Uint32', type: 'Uint32' }, + { name: 'type_Int64', type: 'Int64' }, + { name: 'type_Uint64', type: 'Uint64' }, + { name: 'type_String', type: 'String' }, + { name: 'type_Double', type: 'Double' }, + { name: 'type_Char', type: 'Char' } + ] +}); + +let srcData = { + type_Int8: 8, + type_Uint8: 8, + type_Int16: 8, + type_Uint16: 8, + type_Int32: 8, + type_Uint32: 8, + type_Int64: BigInt(8), + type_Uint64: BigInt(8), + type_String: 'This is test string', + type_Double: -Math.PI, + type_Char: 'A' +}; +srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); +let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); + + + +describe('Object.fromEntries vs mutation Object ', () => { + + beforeEach(() => { + srcData = { + ...srcData, + type_Int32: srcData.type_Int32 + 1, + }; + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); + b = Buffer.serializeObj(srcStruct.schema.fields, srcData); + }) + bench('Object.fromEntries', () => { + let res = new BufferFormEntries(b).deserialize(srcStruct); + }) + bench('mutation Object', () => { + let res = new Buffer(b).deserialize(srcStruct); + }) + +}) diff --git a/port/js/benchmarks/serializeObj.benchmark.js b/port/js/benchmarks/serializeObj.benchmark.js new file mode 100644 index 0000000..7bc40b8 --- /dev/null +++ b/port/js/benchmarks/serializeObj.benchmark.js @@ -0,0 +1,50 @@ +import {Buffer, Struct} from '../src/messgen.js'; +import { bench, describe } from 'vitest' + +let srcStruct = new Struct({ + id: 2, + fields: [ + { name: 'type_Int8', type: 'Int8' }, + { name: 'type_Uint8', type: 'Uint8' }, + { name: 'type_Int16', type: 'Int16' }, + { name: 'type_Uint16', type: 'Uint16' }, + { name: 'type_Int32', type: 'Int32' }, + { name: 'type_Uint32', type: 'Uint32' }, + { name: 'type_Int64', type: 'Int64' }, + { name: 'type_Uint64', type: 'Uint64' }, + { name: 'type_String', type: 'String' }, + { name: 'type_Double', type: 'Double' }, + { name: 'type_Char', type: 'Char' } + ] +}); + +let srcData = { + type_Int8: 8, + type_Uint8: 8, + type_Int16: 8, + type_Uint16: 8, + type_Int32: 8, + type_Uint32: 8, + type_Int64: BigInt(8), + type_Uint64: BigInt(8), + type_String: 'This is test string', + type_Double: -Math.PI, + type_Char: 'A' +}; +srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); +let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); + +describe('Buffer Operations', () => { + bench('calculate size', () => { + srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); + }, { time: 1000 }) + + bench('serialize object', () => { + let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); + }, { time: 1000 }) + + bench('deserialize object', () => { + let res = new Buffer(b).deserialize(srcStruct); + }, { time: 1000 }) +}) + diff --git a/port/js/benchmarks/src-variant/messgen-fromEntries.js b/port/js/benchmarks/src-variant/messgen-fromEntries.js new file mode 100644 index 0000000..16041a1 --- /dev/null +++ b/port/js/benchmarks/src-variant/messgen-fromEntries.js @@ -0,0 +1,657 @@ +'use strict' + +import { encodeUTF8, decodeUTF8 } from './utf8.js' + +const IS_LITTLE_ENDIAN = true + +const DYNAMIC_SIZE_TYPE = 'Uint32' + +/** + * + * Read function returns value from byte array. + * Write function returns type byte size. + */ +const basicTypes = [ + { + name: 'Char', + size: 1, + read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), + write: (v, s, a) => { + v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Array + }, + { + name: 'Int8', + size: 1, + read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt8(s, a, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Int8Array + }, + { + name: 'Uint8', + size: 1, + read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint8(s, a, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Uint8Array + }, + { + name: 'Int16', + size: 2, + read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt16(s, a, IS_LITTLE_ENDIAN) + return 2 + }, + typedArray: Int16Array + }, + { + name: 'Uint16', + size: 2, + read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint16(s, a, IS_LITTLE_ENDIAN) + return 2 + }, + typedArray: Uint16Array + }, + { + name: 'Int32', + size: 4, + read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Int32Array + }, + { + name: 'Uint32', + size: 4, + read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Uint32Array + }, + { + name: 'Int64', + size: 8, + read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigInt64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: BigInt64Array + }, + { + name: 'Uint64', + size: 8, + read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigUint64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: BigUint64Array + }, + { + name: 'Float', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Float32', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Float32Array + }, + { + name: 'Double', + size: 8, + read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: Float64Array + }, + { + name: 'String', + size: 4, + read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), + write: (v, s, a) => { + let size = a.length + v.setUint32(s, size, true) + for (let i = 0, s2 = s + 4; i < size; i++) { + v.setUint8(s2 + i, a[i], true) + } + return size + 4 + }, + typedArray: Array + } +] + +let typeIndex = [], + typeSize = [] + +let readFunc = [], + writeFunc = [], + typedArray = [] + +for (let i = 0; i < basicTypes.length; i++) { + let ti = basicTypes[i] + typeIndex[ti.name] = i + typeSize[i] = ti.size + readFunc[i] = ti.read + writeFunc[i] = ti.write + typedArray[i] = ti.typedArray +} + +const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE] +const DYN_TYPE_SIZE = typeSize[DYN_TYPE] +const DYN_READ = readFunc[DYN_TYPE] +const DYN_WRITE = writeFunc[DYN_TYPE] + +function parseType(typeStr, includeMessages) { + let a = typeStr.split('['), + name = a[0].trim() + + let size, + isComplex = false + + let type = typeIndex[name] + + if (type !== undefined) { + size = typeSize[type] + } else if (includeMessages && includeMessages[name]) { + type = includeMessages[name] + size = type.size + isComplex = true + } else { + throw new Error(`Unknown type: ${name}, if is complex type you must define before the struct. `) + } + + let length = parseInt(a[1]) + + return { + typeIndex: type, + typeSize: size, + length: isNaN(length) ? 0 : length, + isArray: a.length === 2, + isComplex: isComplex + } +} + +/** + * class Struct + */ +export class Struct { + constructor(schema, includeMessages) { + this._id = 0 + this._size = 0 + this._fields = null + this._schema = null + + this._includeMessages = includeMessages + + this.set(schema) + } + + get schema() { + return this._schema + } + + get id() { + return this._id + } + + get size() { + return this._size + } + + get fields() { + return this._fields + } + + set(schema) { + if (schema) { + this._id = schema.id || 0 + this._size = 0 + this._fields = new Array(schema.fields.length) + this._schema = schema + this._init() + } + } + + _init() { + let schemaFields = this._schema.fields + + let offset = 0 + + for (let i = 0, len = schemaFields.length; i < len; i++) { + let si = schemaFields[i], + tp = parseType(si.type, this._includeMessages) + + this._fields[i] = { + name: si.name, + type: si.type, + _offset: offset, + _prop: tp + } + + if (tp.isArray) { + if (tp.length === 0) { + offset += DYN_TYPE_SIZE + } else { + offset += tp.typeSize * tp.length + } + } else { + offset += tp.typeSize + } + } + + this._size = offset + } +} + +// uint32 seq; //!< Sequence number +// uint16 size; //!< Message payload size +// uint8 cls; //!< Message class +// uint8 msg_id; //!< Message type ID + +export const HEADER_STRUCT = new Struct({ + fields: [ + { name: 'seq', type: 'Uint32' }, + { name: 'cls', type: 'Uint8' }, + { name: 'msg_id', type: 'Uint8' }, + { name: 'size', type: 'Uint32' } + ] +}) + +/** + * class Buffer + */ +export class Buffer { + _useTypedArray = false + + constructor(arrayBuffer, useTypedArray = false) { + this._dataView = new DataView(arrayBuffer) + this._dynamicOffset = 0 + this._useTypedArray = useTypedArray + } + + // TODO: перенести в модуль messages + // а модуль messages генерализировать + static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { + let res = [] + let buf = new Buffer(data) + let cur = 0 + while (cur < buf.size) { + let h = buf.deserialize(headerStruct, cur), + m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__) + m.__MSG_ID__ = h.msg_id + cur += h.__SIZE__ + m.__SIZE__ + res.push(m) + } + return res + } + + static mergeArrayBuffers(tArrs, type = Uint8Array) { + const ret = new type(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)) + let off = 0 + tArrs.forEach((tArr) => { + ret.set(new type(tArr), off) + off += tArr.byteLength + }) + return ret + } + + static appendBuffer(buffer1, buffer2) { + var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength) + tmp.set(new Uint8Array(buffer1), 0) + tmp.set(new Uint8Array(buffer2), buffer1.byteLength) + return tmp.buffer + } + + static calcSize(fields, includeMessages) { + let size = 0 + + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + tp = (fi._prop = parseType(fi.type, includeMessages)) + + if (tp.isArray) { + if (tp.isComplex) { + if (tp.length === 0) { + size += DYN_TYPE_SIZE + } + for (let i = 0; i < fi.value.length; i++) { + let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages) + size += Buffer.calcSize(arr, includeMessages) + } + } else { + let arrayLength = 0 + + // Dynamic size array + if (tp.length === 0) { + arrayLength = fi.value.length + size += tp.typeSize * arrayLength + DYN_TYPE_SIZE // for dynamic array length descriptor + } else { + // static size array + arrayLength = tp.length + size += tp.typeSize * arrayLength + } + + if (tp.typeIndex === typeIndex.String) { + fi._bytes = [] + for (let i = 0; i < arrayLength; i++) { + let b = encodeUTF8(fi.value[i] || '') + fi._bytes.push(b) + size += b.length + } + } + } + } else if (tp.typeIndex === typeIndex.String) { + fi._bytes = encodeUTF8(fi.value || '') + size += tp.typeSize + fi._bytes.length + } else { + if (tp.isComplex) { + size += Buffer.calcSize(fi.value, includeMessages) + } else { + size += tp.typeSize + } + } + } + + return size + } + + static createValueArray(schemaFields, obj, includeMessages) { + const len = schemaFields.length + + let arr = new Array(len) + + for (let k = 0; k < len; k++) { + let sk = schemaFields[k], + type = sk.type + + if (includeMessages && includeMessages[type]) { + arr[k] = { + value: Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), + type: type + } + } else { + arr[k] = { value: obj[sk.name], type: type } + } + } + + return arr + } + + static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { + let arr = Buffer.createValueArray(struct.fields, obj, includeMessages) + + let messageSize = Buffer.calcSize(arr, includeMessages) + + let headerBuf = Buffer.serializeObj( + headerStruct.fields, + { + seq: obj.seq, + size: messageSize, + cls: obj.cls, + msg_id: struct.id + }, + includeMessages + ) + + return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)) + } + + static serializeObj(schemaFields, obj, includeMessages) { + let arr = Buffer.createValueArray(schemaFields, obj, includeMessages) + + return Buffer.serialize(arr, includeMessages) + } + + static writeDataView(fields, dataView, includeMessages, offset = 0) { + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + p = fi._prop + + if (p.isArray) { + let arrayLength = p.length + + // Setting array size value for dynamic array size + if (arrayLength === 0) { + arrayLength = fi.value.length + offset += DYN_WRITE(dataView, offset, fi.value.length) + } + + // Write array + for (let j = 0; j < arrayLength; j++) { + let val = (fi._bytes && fi._bytes[j]) || fi.value[j] + if (p.isComplex) { + let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages) + let size = Buffer.calcSize(valArr, includeMessages) + Buffer.writeDataView(valArr, dataView, includeMessages, offset) + offset += size + } else { + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } else { + if (p.isComplex) { + let size = Buffer.calcSize(fi.value, includeMessages) + Buffer.writeDataView(fi.value, dataView, includeMessages, offset) + offset += size + } else { + let val = fi._bytes || fi.value + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } + + return offset + } + + static serialize(fields, includeMessages) { + let allSize = Buffer.calcSize(fields, includeMessages) + + let arrayBuffer = new ArrayBuffer(allSize), + dv = new DataView(arrayBuffer) + + Buffer.writeDataView(fields, dv, includeMessages) + + return arrayBuffer + } + + get size() { + return this._dataView.buffer.byteLength + } + + get dataView() { + return this._dataView + } + + set(arrayBuffer) { + this._dataView = null + this._dataView = new DataView(arrayBuffer) + } + + deserialize(struct, offset = 0, sizeOffset = 0) { + this._dynamicOffset = 0 + let res = this.__deserialize__(struct, offset, sizeOffset) + res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset + return res + } + + __deserialize__(struct, offset, sizeOffset) { + this._includeMessages = struct._includeMessages + + let fields = struct.fields, + dv = this._dataView, + resEntries = []; + + + let currOffset = 0 + + for (let f = 0, len = fields.length; f < len; f++) { + let fi = fields[f], + p = fi._prop + + currOffset = offset + fi._offset + const ArrayType = this._useTypedArray ? typedArray[p.typeIndex] ?? Array : Array + + if (p.isArray) { + if (p.length === 0) { + // + // Dynamic size array + // + + let length = DYN_READ(dv, currOffset + this._dynamicOffset) + + + let value = new ArrayType(length) + resEntries.push([fi.name, value]) + + let currOffset_dyn = DYN_TYPE_SIZE + currOffset + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < length; j++) { + value[j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32( + currOffset_dyn + this._dynamicOffset + j * p.typeSize, + true + ) + } + } else { + if (p.isComplex) { + for (let j = 0; j < length; j++) { + value[j] = this.__deserialize__( + p.typeIndex, + currOffset_dyn + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < length; j++) { + value[j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + } + } + } + + this._dynamicOffset += length * p.typeSize + } else { + // + //Static size array + // + let value = new ArrayType(p.length) + resEntries.push([fi.name, value]) + + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < p.length; j++) { + value[j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true) + } + } else { + if (p.isComplex) { + for (let j = 0; j < p.length; j++) { + value[j] = this.__deserialize__( + p.typeIndex, + currOffset + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < p.length; j++) { + value[j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + } + } + } + } + } else { + if (p.isComplex) { + resEntries.push([fi.name, this.__deserialize__(p.typeIndex, currOffset, sizeOffset)]) + } else { + resEntries.push([fi.name, readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset)]) + + if (p.typeIndex === typeIndex.String) { + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true) + } + } + } + } + + return Object.fromEntries(resEntries); + } +} + +/** + * Creates message struct namespace + * @param {*} messagesJson - Array of messages schemas + * @param {*} headerSchema - message header schema + */ +export function initializeMessages(messagesJson, headerSchema) { + let res = { + __id__: [], + __name__: [], + HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT + } + + for (let m of getKeysWithSortById(messagesJson)) { + let name = m.trim(), + messageObj = messagesJson[m], + msg = 'MSG_' + name.toUpperCase(), + id = messageObj.id + + if (!res.__id__[id]) { + let msg_struct = new Struct(messageObj, res) + + res.__id__[id] = msg_struct + res.__name__[id] = m.trim() + res[msg] = msg_struct + res[name] = msg_struct + } else { + console.warn(`Warning: message ${id} ${msg} already exists.`) + } + } + + return res +} + +const getKeysWithSortById = (obj) => { + let keys = Object.keys(obj) + keys.sort((a, b) => { + return obj[a].id - obj[b].id + }) + return keys +} diff --git a/port/js/benchmarks/src-variant/messgen-old.js b/port/js/benchmarks/src-variant/messgen-old.js new file mode 100644 index 0000000..b944058 --- /dev/null +++ b/port/js/benchmarks/src-variant/messgen-old.js @@ -0,0 +1,653 @@ +'use strict' + +import { encodeUTF8, decodeUTF8 } from './utf8.js' + +const IS_LITTLE_ENDIAN = true + +const DYNAMIC_SIZE_TYPE = 'Uint32' + +/** + * + * Read function returns value from byte array. + * Write function returns type byte size. + */ +const basicTypes = [ + { + name: 'Char', + size: 1, + read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), + write: (v, s, a) => { + v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Array + }, + { + name: 'Int8', + size: 1, + read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt8(s, a, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Int8Array + }, + { + name: 'Uint8', + size: 1, + read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint8(s, a, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Uint8Array + }, + { + name: 'Int16', + size: 2, + read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt16(s, a, IS_LITTLE_ENDIAN) + return 2 + }, + typedArray: Int16Array + }, + { + name: 'Uint16', + size: 2, + read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint16(s, a, IS_LITTLE_ENDIAN) + return 2 + }, + typedArray: Uint16Array + }, + { + name: 'Int32', + size: 4, + read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Int32Array + }, + { + name: 'Uint32', + size: 4, + read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Uint32Array + }, + { + name: 'Int64', + size: 8, + read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigInt64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: BigInt64Array + }, + { + name: 'Uint64', + size: 8, + read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigUint64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: BigUint64Array + }, + { + name: 'Float', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Float32', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Float32Array + }, + { + name: 'Double', + size: 8, + read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: Float64Array + }, + { + name: 'String', + size: 4, + read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), + write: (v, s, a) => { + let size = a.length + v.setUint32(s, size, true) + for (let i = 0, s2 = s + 4; i < size; i++) { + v.setUint8(s2 + i, a[i], true) + } + return size + 4 + }, + typedArray: Array + } +] + +let typeIndex = [], + typeSize = [] + +let readFunc = [], + writeFunc = [], + typedArray = [] + +for (let i = 0; i < basicTypes.length; i++) { + let ti = basicTypes[i] + typeIndex[ti.name] = i + typeSize[i] = ti.size + readFunc[i] = ti.read + writeFunc[i] = ti.write + typedArray[i] = ti.typedArray +} + +const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE] +const DYN_TYPE_SIZE = typeSize[DYN_TYPE] +const DYN_READ = readFunc[DYN_TYPE] +const DYN_WRITE = writeFunc[DYN_TYPE] + +function parseType(typeStr, includeMessages) { + let a = typeStr.split('['), + name = a[0].trim() + + let size, + isComplex = false + + let type = typeIndex[name] + + if (type !== undefined) { + size = typeSize[type] + } else if (includeMessages && includeMessages[name]) { + type = includeMessages[name] + size = type.size + isComplex = true + } else { + throw new Error(`Unknown type: ${name}, if is complex type you must define before the struct. `) + } + + let length = parseInt(a[1]) + + return { + typeIndex: type, + typeSize: size, + length: isNaN(length) ? 0 : length, + isArray: a.length === 2, + isComplex: isComplex + } +} + +/** + * class Struct + */ +export class Struct { + constructor(schema, includeMessages) { + this._id = 0 + this._size = 0 + this._fields = null + this._schema = null + + this._includeMessages = includeMessages + + this.set(schema) + } + + get schema() { + return this._schema + } + + get id() { + return this._id + } + + get size() { + return this._size + } + + get fields() { + return this._fields + } + + set(schema) { + if (schema) { + this._id = schema.id || 0 + this._size = 0 + this._fields = new Array(schema.fields.length) + this._schema = schema + this._init() + } + } + + _init() { + let schemaFields = this._schema.fields + + let offset = 0 + + for (let i = 0, len = schemaFields.length; i < len; i++) { + let si = schemaFields[i], + tp = parseType(si.type, this._includeMessages) + + this._fields[i] = { + name: si.name, + type: si.type, + _offset: offset, + _prop: tp + } + + if (tp.isArray) { + if (tp.length === 0) { + offset += DYN_TYPE_SIZE + } else { + offset += tp.typeSize * tp.length + } + } else { + offset += tp.typeSize + } + } + + this._size = offset + } +} + +// uint32 seq; //!< Sequence number +// uint16 size; //!< Message payload size +// uint8 cls; //!< Message class +// uint8 msg_id; //!< Message type ID + +export const HEADER_STRUCT = new Struct({ + fields: [ + { name: 'seq', type: 'Uint32' }, + { name: 'cls', type: 'Uint8' }, + { name: 'msg_id', type: 'Uint8' }, + { name: 'size', type: 'Uint32' } + ] +}) + +/** + * class Buffer + */ +export class Buffer { + _useTypedArray = false + + constructor(arrayBuffer, useTypedArray = false) { + this._dataView = new DataView(arrayBuffer) + this._dynamicOffset = 0 + this._useTypedArray = useTypedArray + } + + // TODO: перенести в модуль messages + // а модуль messages генерализировать + static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { + let res = [] + let buf = new Buffer(data) + let cur = 0 + while (cur < buf.size) { + let h = buf.deserialize(headerStruct, cur), + m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__) + m.__MSG_ID__ = h.msg_id + cur += h.__SIZE__ + m.__SIZE__ + res.push(m) + } + return res + } + + static mergeArrayBuffers(tArrs, type = Uint8Array) { + const ret = new type(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)) + let off = 0 + tArrs.forEach((tArr) => { + ret.set(new type(tArr), off) + off += tArr.byteLength + }) + return ret + } + + static appendBuffer(buffer1, buffer2) { + var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength) + tmp.set(new Uint8Array(buffer1), 0) + tmp.set(new Uint8Array(buffer2), buffer1.byteLength) + return tmp.buffer + } + + static calcSize(fields, includeMessages) { + let size = 0 + + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + tp = (fi._prop = parseType(fi.type, includeMessages)) + + if (tp.isArray) { + if (tp.isComplex) { + if (tp.length === 0) { + size += DYN_TYPE_SIZE + } + for (let i = 0; i < fi.value.length; i++) { + let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages) + size += Buffer.calcSize(arr, includeMessages) + } + } else { + let arrayLength = 0 + + // Dynamic size array + if (tp.length === 0) { + arrayLength = fi.value.length + size += tp.typeSize * arrayLength + DYN_TYPE_SIZE // for dynamic array length descriptor + } else { + // static size array + arrayLength = tp.length + size += tp.typeSize * arrayLength + } + + if (tp.typeIndex === typeIndex.String) { + fi._bytes = [] + for (let i = 0; i < arrayLength; i++) { + let b = encodeUTF8(fi.value[i] || '') + fi._bytes.push(b) + size += b.length + } + } + } + } else if (tp.typeIndex === typeIndex.String) { + fi._bytes = encodeUTF8(fi.value || '') + size += tp.typeSize + fi._bytes.length + } else { + if (tp.isComplex) { + size += Buffer.calcSize(fi.value, includeMessages) + } else { + size += tp.typeSize + } + } + } + + return size + } + + static createValueArray(schemaFields, obj, includeMessages) { + const len = schemaFields.length + + let arr = new Array(len) + + for (let k = 0; k < len; k++) { + let sk = schemaFields[k], + type = sk.type + + if (includeMessages && includeMessages[type]) { + arr[k] = { + value: Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), + type: type + } + } else { + arr[k] = { value: obj[sk.name], type: type } + } + } + + return arr + } + + static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { + let arr = Buffer.createValueArray(struct.fields, obj, includeMessages) + + let messageSize = Buffer.calcSize(arr, includeMessages) + + let headerBuf = Buffer.serializeObj( + headerStruct.fields, + { + seq: obj.seq, + size: messageSize, + cls: obj.cls, + msg_id: struct.id + }, + includeMessages + ) + + return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)) + } + + static serializeObj(schemaFields, obj, includeMessages) { + let arr = Buffer.createValueArray(schemaFields, obj, includeMessages) + + return Buffer.serialize(arr, includeMessages) + } + + static writeDataView(fields, dataView, includeMessages, offset = 0) { + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + p = fi._prop + + if (p.isArray) { + let arrayLength = p.length + + // Setting array size value for dynamic array size + if (arrayLength === 0) { + arrayLength = fi.value.length + offset += DYN_WRITE(dataView, offset, fi.value.length) + } + + // Write array + for (let j = 0; j < arrayLength; j++) { + let val = (fi._bytes && fi._bytes[j]) || fi.value[j] + if (p.isComplex) { + let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages) + let size = Buffer.calcSize(valArr, includeMessages) + Buffer.writeDataView(valArr, dataView, includeMessages, offset) + offset += size + } else { + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } else { + if (p.isComplex) { + let size = Buffer.calcSize(fi.value, includeMessages) + Buffer.writeDataView(fi.value, dataView, includeMessages, offset) + offset += size + } else { + let val = fi._bytes || fi.value + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } + + return offset + } + + static serialize(fields, includeMessages) { + let allSize = Buffer.calcSize(fields, includeMessages) + + let arrayBuffer = new ArrayBuffer(allSize), + dv = new DataView(arrayBuffer) + + Buffer.writeDataView(fields, dv, includeMessages) + + return arrayBuffer + } + + get size() { + return this._dataView.buffer.byteLength + } + + get dataView() { + return this._dataView + } + + set(arrayBuffer) { + this._dataView = null + this._dataView = new DataView(arrayBuffer) + } + + deserialize(struct, offset = 0, sizeOffset = 0) { + this._dynamicOffset = 0 + let res = this.__deserialize__(struct, offset, sizeOffset) + res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset + return res + } + + __deserialize__(struct, offset, sizeOffset) { + this._includeMessages = struct._includeMessages + + let fields = struct.fields, + dv = this._dataView, + res = {} + + let currOffset = 0 + + for (let f = 0, len = fields.length; f < len; f++) { + let fi = fields[f], + p = fi._prop + + currOffset = offset + fi._offset + const ArrayType = this._useTypedArray ? typedArray[p.typeIndex] ?? Array : Array + + if (p.isArray) { + if (p.length === 0) { + // + // Dynamic size array + // + + let length = DYN_READ(dv, currOffset + this._dynamicOffset) + + res[fi.name] = new ArrayType(length) + + let currOffset_dyn = DYN_TYPE_SIZE + currOffset + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32( + currOffset_dyn + this._dynamicOffset + j * p.typeSize, + true + ) + } + } else { + if (p.isComplex) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = this.__deserialize__( + p.typeIndex, + currOffset_dyn + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + } + } + } + + this._dynamicOffset += length * p.typeSize + } else { + // + //Static size array + // + + res[fi.name] = new ArrayType(p.length) + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true) + } + } else { + if (p.isComplex) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = this.__deserialize__( + p.typeIndex, + currOffset + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + } + } + } + } + } else { + if (p.isComplex) { + res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset) + } else { + res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset) + + if (p.typeIndex === typeIndex.String) { + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true) + } + } + } + } + + return res + } +} + +/** + * Creates message struct namespace + * @param {*} messagesJson - Array of messages schemas + * @param {*} headerSchema - message header schema + */ +export function initializeMessages(messagesJson, headerSchema) { + let res = { + __id__: [], + __name__: [], + HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT + } + + for (let m of getKeysWithSortById(messagesJson)) { + let name = m.trim(), + messageObj = messagesJson[m], + msg = 'MSG_' + name.toUpperCase(), + id = messageObj.id + + if (!res.__id__[id]) { + let msg_struct = new Struct(messageObj, res) + + res.__id__[id] = msg_struct + res.__name__[id] = m.trim() + res[msg] = msg_struct + res[name] = msg_struct + } else { + console.warn(`Warning: message ${id} ${msg} already exists.`) + } + } + + return res +} + +const getKeysWithSortById = (obj) => { + let keys = Object.keys(obj) + keys.sort((a, b) => { + return obj[a].id - obj[b].id + }) + return keys +} diff --git a/port/js/benchmarks/src-variant/utf8.js b/port/js/benchmarks/src-variant/utf8.js new file mode 100644 index 0000000..e37c8bc --- /dev/null +++ b/port/js/benchmarks/src-variant/utf8.js @@ -0,0 +1,67 @@ +'use strict' + +// This is free and unencumbered software released into the public domain. +// https://gist.github.com/pascaldekloe + +// Marshals a string to an Uint8Array. +export function encodeUTF8(s) { + var i = 0, + bytes = new Uint8Array(s.length * 4) + for (var ci = 0; ci !== s.length; ci++) { + var c = s.charCodeAt(ci) + if (c < 128) { + bytes[i++] = c + continue + } + if (c < 2048) { + bytes[i++] = (c >> 6) | 192 + } else { + if (c > 0xd7ff && c < 0xdc00) { + if (++ci >= s.length) throw new Error('UTF-8 encode: incomplete surrogate pair') + var c2 = s.charCodeAt(ci) + if (c2 < 0xdc00 || c2 > 0xdfff) + throw new Error( + 'UTF-8 encode: second surrogate character 0x' + + c2.toString(16) + + ' at index ' + + ci + + ' out of range' + ) + c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff) + bytes[i++] = (c >> 18) | 240 + bytes[i++] = ((c >> 12) & 63) | 128 + } else bytes[i++] = (c >> 12) | 224 + bytes[i++] = ((c >> 6) & 63) | 128 + } + bytes[i++] = (c & 63) | 128 + } + return bytes.subarray(0, i) +} + +// Unmarshals a string from an Uint8Array. +export function decodeUTF8(bytes) { + var i = 0, + s = '' + while (i < bytes.length) { + var c = bytes[i++] + if (c > 127) { + if (c > 191 && c < 224) { + if (i >= bytes.length) throw new Error('UTF-8 decode: incomplete 2-byte sequence') + c = ((c & 31) << 6) | (bytes[i++] & 63) + } else if (c > 223 && c < 240) { + if (i + 1 >= bytes.length) throw new Error('UTF-8 decode: incomplete 3-byte sequence') + c = ((c & 15) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) + } else if (c > 239 && c < 248) { + if (i + 2 >= bytes.length) throw new Error('UTF-8 decode: incomplete 4-byte sequence') + c = ((c & 7) << 18) | ((bytes[i++] & 63) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) + } else throw new Error('UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1)) + } + if (c <= 0xffff) s += String.fromCharCode(c) + else if (c <= 0x10ffff) { + c -= 0x10000 + s += String.fromCharCode((c >> 10) | 0xd800) + s += String.fromCharCode((c & 0x3ff) | 0xdc00) + } else throw new Error('UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach') + } + return s +} diff --git a/port/js/benchmarks/utils/logBench.js b/port/js/benchmarks/utils/logBench.js new file mode 100644 index 0000000..adeb69b --- /dev/null +++ b/port/js/benchmarks/utils/logBench.js @@ -0,0 +1,25 @@ +const round = (number, precision) => { + const pow = Math.pow(10, precision) + return Math.round(number * pow) / pow +}; + +export function logBench(bench, isMs = false) { + const min = bench.results.reduce((acc, cur) => Math.min(acc, cur?.mean ?? Infinity), Infinity) * 1000 * 1000 + + console.table( + bench.table().map((row) => { + if (row) { + // @ts-ignore + row['diff from min %'] = -round((Number(row['Average Time (ns)']) / min - 1) * 100, 1) + if (isMs) { + // @ts-ignore + row['Average Time (ms)'] = round(row['Average Time (ns)'] / 1000 / 1000) + // @ts-ignore + delete row['Average Time (ns)'] + } + } + return row + }) + ) + console.log(bench.results) +} diff --git a/port/js/package-lock.json b/port/js/package-lock.json index 574b2f7..2d81def 100644 --- a/port/js/package-lock.json +++ b/port/js/package-lock.json @@ -9,5628 +9,1359 @@ "version": "1.0.0", "license": "ISC", "devDependencies": { - "@babel/preset-env": "^7.22.14", "@rollup/plugin-terser": "^0.4.3", - "@types/jest": "^29.5.4", - "jest": "^29.6.4", "prettier": "3.0.3", - "rollup": "^3.28.1" + "rollup": "^3.28.1", + "tinybench": "^2.6.0", + "unplugin-auto-import": "^0.17.5", + "vite": "^5.2.6", + "vitest": "^1.4.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "node_modules/@antfu/utils": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.7.tgz", + "integrity": "sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==", "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/core": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", - "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=12" } }, - "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.10", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", - "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.10" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz", - "integrity": "sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==", + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=12" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=12" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=12" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=12" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=12" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" - }, - "engines": { - "node": ">=6.9.0" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/@babel/helpers": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", - "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" - }, - "engines": { - "node": ">=6.9.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "node_modules/@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, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "node_modules/@babel/parser": { - "version": "7.22.14", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.14.tgz", - "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", + "node_modules/@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, - "bin": { - "parser": "bin/babel-parser.js" - }, "engines": { - "node": ">=6.0.0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "node_modules/@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, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "node_modules/@rollup/plugin-terser": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", + "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" }, "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "rollup": "^2.x || ^3.x" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz", - "integrity": "sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", - "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", - "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz", - "integrity": "sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz", - "integrity": "sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz", - "integrity": "sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.22.14", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.14.tgz", - "integrity": "sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.11", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.10", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.6", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.10", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.5", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.11", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.11", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.12", - "@babel/plugin-transform-parameters": "^7.22.5", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.11", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", - "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.11", - "@babel/types": "^7.22.11", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", - "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", - "dev": true, - "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.6.4", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", - "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", - "dev": true, - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.x || ^3.x" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", - "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.6.4", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/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 - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "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 - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001525", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", - "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/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, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/core-js-compat": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/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, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.6.4", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", - "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.6.4", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.6.4" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.6.3", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", - "dev": true, - "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", - "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.6.4", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", - "dev": true, - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, - "engines": { - "node": ">=7.0.0" + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz", + "integrity": "sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.1.tgz", + "integrity": "sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.1.tgz", + "integrity": "sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.1.tgz", + "integrity": "sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.1.tgz", + "integrity": "sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw==", + "cpu": [ + "arm" + ], "dev": true, - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.1.tgz", + "integrity": "sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.1.tgz", + "integrity": "sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.6.4", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.1.tgz", + "integrity": "sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.1.tgz", + "integrity": "sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.1.tgz", + "integrity": "sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.1.tgz", + "integrity": "sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.1.tgz", + "integrity": "sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.1.tgz", + "integrity": "sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.1.tgz", + "integrity": "sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@types/node": { + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", "dev": true, - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@vitest/expect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz", + "integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "node_modules/@vitest/runner": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz", + "integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "@vitest/utils": "1.4.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@vitest/snapshot": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz", + "integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz", + "integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==", + "dev": true, + "dependencies": { + "tinyspy": "^2.2.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@vitest/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "node_modules/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, - "dependencies": { - "@jest/test-result": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.6.3", - "string-length": "^4.0.1" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "*" } }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/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 + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "balanced-match": "^1.0.0" } }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/buffer-from": { + "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 }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "dependencies": { - "@types/node": "*", - "jest-util": "^29.6.3", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "get-func-name": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.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" }, "engines": { - "node": ">=10" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/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==", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 8" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "type-detect": "^4.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { + "node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/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==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "dependencies": { - "yallist": "^3.0.2" + "@types/estree": "^1.0.0" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { - "semver": "^7.5.3" + "@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" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.6.0" } }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "reusify": "^1.0.4" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "dependencies": { - "tmpl": "1.0.5" + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=8.6" + "node": ">= 6" } }, - "node_modules/mimic-fn": { + "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, "dependencies": { - "brace-expansion": "^1.1.7" + "is-extglob": "^2.1.1" }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/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 - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, - "node_modules/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==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "wrappy": "1" + "get-func-name": "^2.0.1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/mlly": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", + "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/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 + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5645,12 +1376,21 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -5669,25 +1409,43 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", "dev": true, - "engines": { - "node": ">= 6" + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" } }, - "node_modules/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==", + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "find-up": "^4.0.0" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14" } }, "node_modules/prettier": { @@ -5706,9 +1464,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -5731,32 +1489,23 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "node_modules/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, "funding": [ { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ] }, @@ -5775,133 +1524,28 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" + "node": ">=8.10.0" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "engines": { + "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/rollup": { "version": "3.28.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", @@ -5918,6 +1562,29 @@ "fsevents": "~2.3.2" } }, + "node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5938,14 +1605,11 @@ } ] }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true }, "node_modules/serialize-javascript": { "version": "6.0.1", @@ -5977,172 +1641,66 @@ "node": ">=8" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/smob": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/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, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true }, - "node_modules/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, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/strip-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", + "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "js-tokens": "^8.0.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/antfu" } }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", + "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", + "dev": true + }, "node_modules/terser": { "version": "5.19.3", "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", @@ -6171,33 +1729,28 @@ "source-map": "^0.6.0" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/tinybench": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", + "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.3.tgz", + "integrity": "sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==", "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, "engines": { - "node": ">=4" + "node": ">=14.0.0" } }, "node_modules/to-regex-range": { @@ -6221,248 +1774,448 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "node_modules/unimport": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.7.1.tgz", + "integrity": "sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "acorn": "^8.11.2", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "mlly": "^1.4.2", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "scule": "^1.1.1", + "strip-literal": "^1.3.0", + "unplugin": "^1.5.1" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/unimport/node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", "dev": true, "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "acorn": "^8.10.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "node_modules/unplugin": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.0.tgz", + "integrity": "sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==", "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "chokidar": "^3.6.0", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.1" + }, "engines": { - "node": ">=4" + "node": ">=14.0.0" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "node_modules/unplugin-auto-import": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.17.5.tgz", + "integrity": "sha512-fHNDkDSxv3PGagX1wmKBYBkgaM4AKAgZmdJw/bxjhNljx9KSXSgHpGfX0MwUrq9qw6q1bhHIZVWyOwoY2koo4w==", "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.7", + "@rollup/pluginutils": "^5.1.0", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "minimatch": "^9.0.3", + "unimport": "^3.7.1", + "unplugin": "^1.6.0" + }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } } }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "node_modules/vite": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", + "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "esbuild": "^0.20.1", + "postcss": "^8.4.36", + "rollup": "^4.13.0" }, "bin": { - "update-browserslist-db": "cli.js" + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "browserslist": ">= 4.21.0" + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "node_modules/vite-node": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", + "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=10.12.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "node_modules/vite/node_modules/rollup": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.1.tgz", + "integrity": "sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg==", "dev": true, "dependencies": { - "makeerror": "1.0.12" + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.1", + "@rollup/rollup-android-arm64": "4.13.1", + "@rollup/rollup-darwin-arm64": "4.13.1", + "@rollup/rollup-darwin-x64": "4.13.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.1", + "@rollup/rollup-linux-arm64-gnu": "4.13.1", + "@rollup/rollup-linux-arm64-musl": "4.13.1", + "@rollup/rollup-linux-riscv64-gnu": "4.13.1", + "@rollup/rollup-linux-s390x-gnu": "4.13.1", + "@rollup/rollup-linux-x64-gnu": "4.13.1", + "@rollup/rollup-linux-x64-musl": "4.13.1", + "@rollup/rollup-win32-arm64-msvc": "4.13.1", + "@rollup/rollup-win32-ia32-msvc": "4.13.1", + "@rollup/rollup-win32-x64-msvc": "4.13.1", + "fsevents": "~2.3.2" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" + "node_modules/vitest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz", + "integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==", + "dev": true, + "dependencies": { + "@vitest/expect": "1.4.0", + "@vitest/runner": "1.4.0", + "@vitest/snapshot": "1.4.0", + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.4.0", + "why-is-node-running": "^2.2.2" }, "bin": { - "node-which": "bin/node-which" + "vitest": "vitest.mjs" }, "engines": { - "node": ">= 8" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.4.0", + "@vitest/ui": "1.4.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "node_modules/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==", + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=16.17" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=16" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=16.17.0" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/vitest/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "mimic-fn": "^4.0.0" }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/vitest/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vitest/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/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, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", + "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } } } } diff --git a/port/js/package.json b/port/js/package.json index 75d9610..19d1c9c 100644 --- a/port/js/package.json +++ b/port/js/package.json @@ -3,23 +3,25 @@ "version": "1.0.0", "description": "", "main": "src/messgen.js", + "type": "module", "scripts": { - "build": "node_modules/.bin/rollup -c --bundleConfigAsCjs", - "test": "jest --coverage --coverageReporters json-summary", + "build": "vite build", + "test": "vitest", "prettier": "prettier --write \"src/**/*.js\" \"tests/**/*.js\" \"*.js\"", "gen-json": "python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l json -o ../../tests/js", "gen-ts": "npm run gen-json && python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l ts -o ../../tests/js", "gen-cpp": "python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l cpp -o ../../tests/js", - "gen-md": "python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l md -o ../../tests/js" + "gen-md": "python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l md -o ../../tests/js", + "benchmark": "vitest bench" }, "author": "", "license": "ISC", "devDependencies": { - "@babel/preset-env": "^7.22.14", "@rollup/plugin-terser": "^0.4.3", - "@types/jest": "^29.5.4", - "jest": "^29.6.4", "prettier": "3.0.3", - "rollup": "^3.28.1" + "rollup": "^3.28.1", + "tinybench": "^2.6.0", + "vite": "^5.2.6", + "vitest": "^1.4.0" } } diff --git a/port/js/rollup.config.js b/port/js/rollup.config.js deleted file mode 100644 index d3509d1..0000000 --- a/port/js/rollup.config.js +++ /dev/null @@ -1,20 +0,0 @@ -import terser from '@rollup/plugin-terser' -import pkg from './package.json' - -const OUTPUT_NAME = `dist/messgen` - -/** @type {import('rollup').RollupOptions} */ -const config = { - input: `src/messgen.js`, - output: [ - { - file: OUTPUT_NAME + '.js', - format: 'umd', - name: pkg.name, - sourcemap: false - } - ], - plugins: [terser()] -} - -export default config diff --git a/port/js/vite.config.js b/port/js/vite.config.js new file mode 100644 index 0000000..1682fc4 --- /dev/null +++ b/port/js/vite.config.js @@ -0,0 +1,32 @@ +import { defineConfig } from 'vite' +import pkg from './package.json' +import terser from '@rollup/plugin-terser' + +const OUTPUT_NAME = `dist/messgen` + +export default defineConfig({ + build: { + lib: { + entry: 'src/messgen.js', + name: pkg.name, + fileName: `messgen` + + }, + rollupOptions: { + output: { + format: 'umd', + name: pkg.name, + sourcemap: true + } + } + }, + test: { + globals: true, + }, + benchmark: { + globals: true, + }, + plugins: [ + + terser()] +}) From 2bd82100c64f8e9c3c63168fc49dd76fbdb43b9e Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Wed, 27 Mar 2024 18:56:12 +0400 Subject: [PATCH 15/23] Expand types in fromEntries benchmark --- port/js/benchmarks/fromEntries.benchmark.js | 28 ++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/port/js/benchmarks/fromEntries.benchmark.js b/port/js/benchmarks/fromEntries.benchmark.js index b2aab11..ee44681 100644 --- a/port/js/benchmarks/fromEntries.benchmark.js +++ b/port/js/benchmarks/fromEntries.benchmark.js @@ -19,7 +19,18 @@ let srcStruct = new Struct({ { name: 'type_Uint64', type: 'Uint64' }, { name: 'type_String', type: 'String' }, { name: 'type_Double', type: 'Double' }, - { name: 'type_Char', type: 'Char' } + { name: 'type_Char', type: 'Char' }, + { name: '_type_Int8', type: 'Int8' }, + { name: '_type_Uint8', type: 'Uint8' }, + { name: '_type_Int16', type: 'Int16' }, + { name: '_type_Uint16', type: 'Uint16' }, + { name: '_type_Int32', type: 'Int32' }, + { name: '_type_Uint32', type: 'Uint32' }, + { name: '_type_Int64', type: 'Int64' }, + { name: '_type_Uint64', type: 'Uint64' }, + { name: '_type_String', type: 'String' }, + { name: '_type_Double', type: 'Double' }, + { name: '_type_Char', type: 'Char' } ] }); @@ -34,14 +45,25 @@ let srcData = { type_Uint64: BigInt(8), type_String: 'This is test string', type_Double: -Math.PI, - type_Char: 'A' + type_Char: 'A', + _type_Int8: 8, + _type_Uint8: 8, + _type_Int16: 8, + _type_Uint16: 8, + _type_Int32: 8, + _type_Uint32: 8, + _type_Int64: BigInt(8), + _type_Uint64: BigInt(8), + _type_String: 'This is test string', + _type_Double: -Math.PI, + _type_Char: 'A' }; srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); -describe('Object.fromEntries vs mutation Object ', () => { +describe('Buffer(b).deserialize ', () => { beforeEach(() => { srcData = { From 38c8bc7fbcbba985be234b43537df705f49c4f77 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Thu, 28 Mar 2024 12:43:23 +0400 Subject: [PATCH 16/23] Optimize array creation and rename benchmark files --- .../{fromEntries.benchmark.js => fromEntries.bench.js} | 0 ...serializeObj.benchmark.js => serializeObj.bench.js} | 0 port/js/benchmarks/src-variant/messgen-fromEntries.js | 10 +++++----- 3 files changed, 5 insertions(+), 5 deletions(-) rename port/js/benchmarks/{fromEntries.benchmark.js => fromEntries.bench.js} (100%) rename port/js/benchmarks/{serializeObj.benchmark.js => serializeObj.bench.js} (100%) diff --git a/port/js/benchmarks/fromEntries.benchmark.js b/port/js/benchmarks/fromEntries.bench.js similarity index 100% rename from port/js/benchmarks/fromEntries.benchmark.js rename to port/js/benchmarks/fromEntries.bench.js diff --git a/port/js/benchmarks/serializeObj.benchmark.js b/port/js/benchmarks/serializeObj.bench.js similarity index 100% rename from port/js/benchmarks/serializeObj.benchmark.js rename to port/js/benchmarks/serializeObj.bench.js diff --git a/port/js/benchmarks/src-variant/messgen-fromEntries.js b/port/js/benchmarks/src-variant/messgen-fromEntries.js index 16041a1..2533526 100644 --- a/port/js/benchmarks/src-variant/messgen-fromEntries.js +++ b/port/js/benchmarks/src-variant/messgen-fromEntries.js @@ -506,7 +506,7 @@ export class Buffer { let fields = struct.fields, dv = this._dataView, - resEntries = []; + resEntries = new Array(struct.fields.length ); let currOffset = 0 @@ -528,7 +528,7 @@ export class Buffer { let value = new ArrayType(length) - resEntries.push([fi.name, value]) + resEntries[f]=([fi.name, value]) let currOffset_dyn = DYN_TYPE_SIZE + currOffset @@ -568,7 +568,7 @@ export class Buffer { //Static size array // let value = new ArrayType(p.length) - resEntries.push([fi.name, value]) + resEntries[f]=([fi.name, value]) if (p.typeIndex === typeIndex.String) { @@ -600,9 +600,9 @@ export class Buffer { } } else { if (p.isComplex) { - resEntries.push([fi.name, this.__deserialize__(p.typeIndex, currOffset, sizeOffset)]) + resEntries[f]=([fi.name, this.__deserialize__(p.typeIndex, currOffset, sizeOffset)]) } else { - resEntries.push([fi.name, readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset)]) + resEntries[f]=([fi.name, readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset)]) if (p.typeIndex === typeIndex.String) { this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true) From f73d89ae716f71d1e0eda46e0c74281b4d6df85b Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Thu, 28 Mar 2024 13:29:03 +0400 Subject: [PATCH 17/23] Add prebuild object variant for JS deserialization benchmark --- ....bench.js => deserialize-variant.bench.js} | 44 +- .../messgen-fromEntries.js | 2 +- .../messgen-old.js | 0 .../deserialize-variant/messgen-prebild.js | 676 ++++++++++++++++++ .../utf8.js | 0 5 files changed, 715 insertions(+), 7 deletions(-) rename port/js/benchmarks/{fromEntries.bench.js => deserialize-variant.bench.js} (59%) rename port/js/benchmarks/{src-variant => deserialize-variant}/messgen-fromEntries.js (99%) rename port/js/benchmarks/{src-variant => deserialize-variant}/messgen-old.js (100%) create mode 100644 port/js/benchmarks/deserialize-variant/messgen-prebild.js rename port/js/benchmarks/{src-variant => deserialize-variant}/utf8.js (100%) diff --git a/port/js/benchmarks/fromEntries.bench.js b/port/js/benchmarks/deserialize-variant.bench.js similarity index 59% rename from port/js/benchmarks/fromEntries.bench.js rename to port/js/benchmarks/deserialize-variant.bench.js index ee44681..f678a45 100644 --- a/port/js/benchmarks/fromEntries.bench.js +++ b/port/js/benchmarks/deserialize-variant.bench.js @@ -1,8 +1,9 @@ import { bench } from 'vitest' import {Struct} from '../src/messgen.js'; -import {Buffer} from './src-variant/messgen-old.js'; -import { Buffer as BufferFormEntries} from './src-variant/messgen-fromEntries.js'; +import {Buffer} from './deserialize-variant/messgen-old.js'; +import { Buffer as BufferFormEntries} from './deserialize-variant/messgen-fromEntries.js'; +import { Buffer as BufferPrebild, Struct as StructPrebild} from './deserialize-variant/messgen-prebild.js'; import { bench, describe } from 'vitest' @@ -34,6 +35,34 @@ let srcStruct = new Struct({ ] }); +let srcStructPrebild = new StructPrebild({ + id: 2, + fields: [ + { name: 'type_Int8', type: 'Int8' }, + { name: 'type_Uint8', type: 'Uint8' }, + { name: 'type_Int16', type: 'Int16' }, + { name: 'type_Uint16', type: 'Uint16' }, + { name: 'type_Int32', type: 'Int32' }, + { name: 'type_Uint32', type: 'Uint32' }, + { name: 'type_Int64', type: 'Int64' }, + { name: 'type_Uint64', type: 'Uint64' }, + { name: 'type_String', type: 'String' }, + { name: 'type_Double', type: 'Double' }, + { name: 'type_Char', type: 'Char' }, + { name: '_type_Int8', type: 'Int8' }, + { name: '_type_Uint8', type: 'Uint8' }, + { name: '_type_Int16', type: 'Int16' }, + { name: '_type_Uint16', type: 'Uint16' }, + { name: '_type_Int32', type: 'Int32' }, + { name: '_type_Uint32', type: 'Uint32' }, + { name: '_type_Int64', type: 'Int64' }, + { name: '_type_Uint64', type: 'Uint64' }, + { name: '_type_String', type: 'String' }, + { name: '_type_Double', type: 'Double' }, + { name: '_type_Char', type: 'Char' } + ] +}); + let srcData = { type_Int8: 8, type_Uint8: 8, @@ -41,8 +70,8 @@ let srcData = { type_Uint16: 8, type_Int32: 8, type_Uint32: 8, - type_Int64: BigInt(8), - type_Uint64: BigInt(8), + type_Int64: BigInt(8), + type_Uint64: BigInt(8), type_String: 'This is test string', type_Double: -Math.PI, type_Char: 'A', @@ -52,8 +81,8 @@ let srcData = { _type_Uint16: 8, _type_Int32: 8, _type_Uint32: 8, - _type_Int64: BigInt(8), - _type_Uint64: BigInt(8), + _type_Int64: BigInt(8), + _type_Uint64: BigInt(8), _type_String: 'This is test string', _type_Double: -Math.PI, _type_Char: 'A' @@ -76,6 +105,9 @@ describe('Buffer(b).deserialize ', () => { bench('Object.fromEntries', () => { let res = new BufferFormEntries(b).deserialize(srcStruct); }) + bench('preBuild object Object', () => { + let res = new BufferPrebild(b).deserialize(srcStructPrebild); + }) bench('mutation Object', () => { let res = new Buffer(b).deserialize(srcStruct); }) diff --git a/port/js/benchmarks/src-variant/messgen-fromEntries.js b/port/js/benchmarks/deserialize-variant/messgen-fromEntries.js similarity index 99% rename from port/js/benchmarks/src-variant/messgen-fromEntries.js rename to port/js/benchmarks/deserialize-variant/messgen-fromEntries.js index 2533526..a55e181 100644 --- a/port/js/benchmarks/src-variant/messgen-fromEntries.js +++ b/port/js/benchmarks/deserialize-variant/messgen-fromEntries.js @@ -506,7 +506,7 @@ export class Buffer { let fields = struct.fields, dv = this._dataView, - resEntries = new Array(struct.fields.length ); + resEntries = new Array(struct.fields.length ) let currOffset = 0 diff --git a/port/js/benchmarks/src-variant/messgen-old.js b/port/js/benchmarks/deserialize-variant/messgen-old.js similarity index 100% rename from port/js/benchmarks/src-variant/messgen-old.js rename to port/js/benchmarks/deserialize-variant/messgen-old.js diff --git a/port/js/benchmarks/deserialize-variant/messgen-prebild.js b/port/js/benchmarks/deserialize-variant/messgen-prebild.js new file mode 100644 index 0000000..e28a3c4 --- /dev/null +++ b/port/js/benchmarks/deserialize-variant/messgen-prebild.js @@ -0,0 +1,676 @@ +'use strict' + +import { encodeUTF8, decodeUTF8 } from './utf8.js' + +const IS_LITTLE_ENDIAN = true + +const DYNAMIC_SIZE_TYPE = 'Uint32' + +/** + * + * Read function returns value from byte array. + * Write function returns type byte size. + */ +const basicTypes = [ + { + name: 'Char', + size: 1, + read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), + write: (v, s, a) => { + v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Array, + default: '' + }, + { + name: 'Int8', + size: 1, + read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt8(s, a, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Int8Array, + default: new Int8Array([0])[0] + }, + { + name: 'Uint8', + size: 1, + read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint8(s, a, IS_LITTLE_ENDIAN) + return 1 + }, + typedArray: Uint8Array, + default: new Uint8Array([0])[0] + }, + { + name: 'Int16', + size: 2, + read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt16(s, a, IS_LITTLE_ENDIAN) + return 2 + }, + typedArray: Int16Array, + default: new Int16Array([0])[0] + }, + { + name: 'Uint16', + size: 2, + read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint16(s, a, IS_LITTLE_ENDIAN) + return 2 + }, + typedArray: Uint16Array, + default: new Uint16Array([0])[0] + }, + { + name: 'Int32', + size: 4, + read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Int32Array, + default: new Int32Array([0])[0] + }, + { + name: 'Uint32', + size: 4, + read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Uint32Array, + default: new Uint32Array([0])[0] + }, + { + name: 'Int64', + size: 8, + read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigInt64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: BigInt64Array, + default: 1n + }, + { + name: 'Uint64', + size: 8, + read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigUint64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: BigUint64Array, + default: 1n + }, + { + name: 'Float', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + } + }, + { + name: 'Float32', + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN) + return 4 + }, + typedArray: Float32Array, + default: new Float32Array([0])[0] + }, + { + name: 'Double', + size: 8, + read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat64(s, a, IS_LITTLE_ENDIAN) + return 8 + }, + typedArray: Float64Array, + default: new Float64Array([0])[0] + }, + { + name: 'String', + size: 4, + read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), + write: (v, s, a) => { + let size = a.length + v.setUint32(s, size, true) + for (let i = 0, s2 = s + 4; i < size; i++) { + v.setUint8(s2 + i, a[i], true) + } + return size + 4 + }, + typedArray: Array, + default: '' + } +] + +let typeIndex = [], + typeSize = [] + +let readFunc = [], + writeFunc = [], + typedArray = [] + +for (let i = 0; i < basicTypes.length; i++) { + let ti = basicTypes[i] + typeIndex[ti.name] = i + typeSize[i] = ti.size + readFunc[i] = ti.read + writeFunc[i] = ti.write + typedArray[i] = ti.typedArray +} + +const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE] +const DYN_TYPE_SIZE = typeSize[DYN_TYPE] +const DYN_READ = readFunc[DYN_TYPE] +const DYN_WRITE = writeFunc[DYN_TYPE] + +function parseType(typeStr, includeMessages) { + let a = typeStr.split('['), + name = a[0].trim() + + let size, + isComplex = false + + let type = typeIndex[name] + + if (type !== undefined) { + size = typeSize[type] + } else if (includeMessages && includeMessages[name]) { + type = includeMessages[name] + size = type.size + isComplex = true + } else { + throw new Error(`Unknown type: ${ name }, if is complex type you must define before the struct. `) + } + + let length = parseInt(a[1]) + + return { + typeIndex: type, + typeSize: size, + length: isNaN(length) ? 0 : length, + isArray: a.length === 2, + isComplex: isComplex + } +} + +/** + * class Struct + */ +export class Struct { + constructor(schema, includeMessages) { + this._id = 0 + this._size = 0 + this._fields = null + this._schema = null + this._default = null + + this._includeMessages = includeMessages + + this.set(schema) + } + + get schema() { + return this._schema + } + + get id() { + return this._id + } + + get size() { + return this._size + } + + get fields() { + return this._fields + } + + set(schema) { + if (schema) { + this._id = schema.id || 0 + this._size = 0 + this._fields = new Array(schema.fields.length) + this._schema = schema + this._init() + } + } + + _init() { + let schemaFields = this._schema.fields + + let offset = 0 + + for (let i = 0, len = schemaFields.length; i < len; i++) { + let si = schemaFields[i], + tp = parseType(si.type, this._includeMessages) + + this._fields[i] = { + name: si.name, + type: si.type, + _offset: offset, + _prop: tp + } + + if (tp.isArray) { + if (tp.length === 0) { + offset += DYN_TYPE_SIZE + } else { + offset += tp.typeSize * tp.length + } + } else { + offset += tp.typeSize + } + } + this._default = Object.fromEntries(this._fields.map((f) => { + let value + if (f._prop.isArray) { + let TypedArray = basicTypes[f._prop.typeIndex].typedArray + return [f.name, TypedArray(f._prop.length)] + } else if (f._prop.isComplex) { + return [f.name, null] + } else { + return [f.name, basicTypes[f._prop.typeIndex].default] + } + })) + this._size = offset + } +} + +// uint32 seq; //!< Sequence number +// uint16 size; //!< Message payload size +// uint8 cls; //!< Message class +// uint8 msg_id; //!< Message type ID + +export const HEADER_STRUCT = new Struct({ + fields: [ + { name: 'seq', type: 'Uint32' }, + { name: 'cls', type: 'Uint8' }, + { name: 'msg_id', type: 'Uint8' }, + { name: 'size', type: 'Uint32' } + ] +}) + +/** + * class Buffer + */ +export class Buffer { + _useTypedArray = false + + constructor(arrayBuffer, useTypedArray = false) { + this._dataView = new DataView(arrayBuffer) + this._dynamicOffset = 0 + this._useTypedArray = useTypedArray + } + + // TODO: перенести в модуль messages + // а модуль messages генерализировать + static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { + let res = [] + let buf = new Buffer(data) + let cur = 0 + while (cur < buf.size) { + let h = buf.deserialize(headerStruct, cur), + m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__) + m.__MSG_ID__ = h.msg_id + cur += h.__SIZE__ + m.__SIZE__ + res.push(m) + } + return res + } + + static mergeArrayBuffers(tArrs, type = Uint8Array) { + const ret = new type(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)) + let off = 0 + tArrs.forEach((tArr) => { + ret.set(new type(tArr), off) + off += tArr.byteLength + }) + return ret + } + + static appendBuffer(buffer1, buffer2) { + var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength) + tmp.set(new Uint8Array(buffer1), 0) + tmp.set(new Uint8Array(buffer2), buffer1.byteLength) + return tmp.buffer + } + + static calcSize(fields, includeMessages) { + let size = 0 + + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + tp = (fi._prop = parseType(fi.type, includeMessages)) + + if (tp.isArray) { + if (tp.isComplex) { + if (tp.length === 0) { + size += DYN_TYPE_SIZE + } + for (let i = 0; i < fi.value.length; i++) { + let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages) + size += Buffer.calcSize(arr, includeMessages) + } + } else { + let arrayLength = 0 + + // Dynamic size array + if (tp.length === 0) { + arrayLength = fi.value.length + size += tp.typeSize * arrayLength + DYN_TYPE_SIZE // for dynamic array length descriptor + } else { + // static size array + arrayLength = tp.length + size += tp.typeSize * arrayLength + } + + if (tp.typeIndex === typeIndex.String) { + fi._bytes = [] + for (let i = 0; i < arrayLength; i++) { + let b = encodeUTF8(fi.value[i] || '') + fi._bytes.push(b) + size += b.length + } + } + } + } else if (tp.typeIndex === typeIndex.String) { + fi._bytes = encodeUTF8(fi.value || '') + size += tp.typeSize + fi._bytes.length + } else { + if (tp.isComplex) { + size += Buffer.calcSize(fi.value, includeMessages) + } else { + size += tp.typeSize + } + } + } + + return size + } + + static createValueArray(schemaFields, obj, includeMessages) { + const len = schemaFields.length + + let arr = new Array(len) + + for (let k = 0; k < len; k++) { + let sk = schemaFields[k], + type = sk.type + + if (includeMessages && includeMessages[type]) { + arr[k] = { + value: Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), + type: type + } + } else { + arr[k] = { value: obj[sk.name], type: type } + } + } + + return arr + } + + static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { + let arr = Buffer.createValueArray(struct.fields, obj, includeMessages) + + let messageSize = Buffer.calcSize(arr, includeMessages) + + let headerBuf = Buffer.serializeObj( + headerStruct.fields, + { + seq: obj.seq, + size: messageSize, + cls: obj.cls, + msg_id: struct.id + }, + includeMessages + ) + + return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)) + } + + static serializeObj(schemaFields, obj, includeMessages) { + let arr = Buffer.createValueArray(schemaFields, obj, includeMessages) + + return Buffer.serialize(arr, includeMessages) + } + + static writeDataView(fields, dataView, includeMessages, offset = 0) { + for (let i = 0, len = fields.length; i < len; i++) { + let fi = fields[i], + p = fi._prop + + if (p.isArray) { + let arrayLength = p.length + + // Setting array size value for dynamic array size + if (arrayLength === 0) { + arrayLength = fi.value.length + offset += DYN_WRITE(dataView, offset, fi.value.length) + } + + // Write array + for (let j = 0; j < arrayLength; j++) { + let val = (fi._bytes && fi._bytes[j]) || fi.value[j] + if (p.isComplex) { + let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages) + let size = Buffer.calcSize(valArr, includeMessages) + Buffer.writeDataView(valArr, dataView, includeMessages, offset) + offset += size + } else { + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } else { + if (p.isComplex) { + let size = Buffer.calcSize(fi.value, includeMessages) + Buffer.writeDataView(fi.value, dataView, includeMessages, offset) + offset += size + } else { + let val = fi._bytes || fi.value + offset += writeFunc[p.typeIndex](dataView, offset, val) + } + } + } + + return offset + } + + static serialize(fields, includeMessages) { + let allSize = Buffer.calcSize(fields, includeMessages) + + let arrayBuffer = new ArrayBuffer(allSize), + dv = new DataView(arrayBuffer) + + Buffer.writeDataView(fields, dv, includeMessages) + + return arrayBuffer + } + + get size() { + return this._dataView.buffer.byteLength + } + + get dataView() { + return this._dataView + } + + set(arrayBuffer) { + this._dataView = null + this._dataView = new DataView(arrayBuffer) + } + + deserialize(struct, offset = 0, sizeOffset = 0) { + this._dynamicOffset = 0 + let res = this.__deserialize__(struct, offset, sizeOffset) + res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset + return res + } + + __deserialize__(struct, offset, sizeOffset) { + this._includeMessages = struct._includeMessages + + let fields = struct.fields, + dv = this._dataView, + res = Object.create(struct._default) + + let currOffset = 0 + + for (let f = 0, len = fields.length; f < len; f++) { + let fi = fields[f], + p = fi._prop + + currOffset = offset + fi._offset + const ArrayType = this._useTypedArray ? typedArray[p.typeIndex] ?? Array : Array + + if (p.isArray) { + if (p.length === 0) { + // + // Dynamic size array + // + + let length = DYN_READ(dv, currOffset + this._dynamicOffset) + + res[fi.name] = new ArrayType(length) + + let currOffset_dyn = DYN_TYPE_SIZE + currOffset + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32( + currOffset_dyn + this._dynamicOffset + j * p.typeSize, + true + ) + } + } else { + if (p.isComplex) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = this.__deserialize__( + p.typeIndex, + currOffset_dyn + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset_dyn + this._dynamicOffset + j * p.typeSize + ) + } + } + } + + this._dynamicOffset += length * p.typeSize + } else { + // + //Static size array + // + + res[fi.name] = new ArrayType(p.length) + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true) + } + } else { + if (p.isComplex) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = this.__deserialize__( + p.typeIndex, + currOffset + j * p.typeSize, + sizeOffset + ) + } + } else { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex]( + dv, + currOffset + this._dynamicOffset + j * p.typeSize + ) + } + } + } + } + } else { + if (p.isComplex) { + res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset) + } else { + res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset) + + if (p.typeIndex === typeIndex.String) { + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true) + } + } + } + } + + return res + } +} + +/** + * Creates message struct namespace + * @param {*} messagesJson - Array of messages schemas + * @param {*} headerSchema - message header schema + */ +export function initializeMessages(messagesJson, headerSchema) { + let res = { + __id__: [], + __name__: [], + HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT + } + + for (let m of getKeysWithSortById(messagesJson)) { + let name = m.trim(), + messageObj = messagesJson[m], + msg = 'MSG_' + name.toUpperCase(), + id = messageObj.id + + if (!res.__id__[id]) { + let msg_struct = new Struct(messageObj, res) + + res.__id__[id] = msg_struct + res.__name__[id] = m.trim() + res[msg] = msg_struct + res[name] = msg_struct + } else { + console.warn(`Warning: message ${ id } ${ msg } already exists.`) + } + } + + return res +} + +const getKeysWithSortById = (obj) => { + let keys = Object.keys(obj) + keys.sort((a, b) => { + return obj[a].id - obj[b].id + }) + return keys +} diff --git a/port/js/benchmarks/src-variant/utf8.js b/port/js/benchmarks/deserialize-variant/utf8.js similarity index 100% rename from port/js/benchmarks/src-variant/utf8.js rename to port/js/benchmarks/deserialize-variant/utf8.js From 8387f8cf9b993e98fae8405507fe090fb793b1e8 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Thu, 28 Mar 2024 13:32:29 +0400 Subject: [PATCH 18/23] Refactor code for benchmarking deserialization variants --- port/js/benchmarks/deserialize-variant.bench.js | 12 ++++++------ .../{messgen-prebild.js => messgen-pre-build.js} | 0 2 files changed, 6 insertions(+), 6 deletions(-) rename port/js/benchmarks/deserialize-variant/{messgen-prebild.js => messgen-pre-build.js} (100%) diff --git a/port/js/benchmarks/deserialize-variant.bench.js b/port/js/benchmarks/deserialize-variant.bench.js index f678a45..8a1bc3c 100644 --- a/port/js/benchmarks/deserialize-variant.bench.js +++ b/port/js/benchmarks/deserialize-variant.bench.js @@ -2,8 +2,8 @@ import { bench } from 'vitest' import {Struct} from '../src/messgen.js'; import {Buffer} from './deserialize-variant/messgen-old.js'; -import { Buffer as BufferFormEntries} from './deserialize-variant/messgen-fromEntries.js'; -import { Buffer as BufferPrebild, Struct as StructPrebild} from './deserialize-variant/messgen-prebild.js'; +import { Buffer as BufferFromEntries} from './deserialize-variant/messgen-fromEntries.js'; +import { Buffer as BufferPreBuild, Struct as StructPreBuild} from './deserialize-variant/messgen-pre-build.js'; import { bench, describe } from 'vitest' @@ -35,7 +35,7 @@ let srcStruct = new Struct({ ] }); -let srcStructPrebild = new StructPrebild({ +let srcStructPrebild = new StructPreBuild({ id: 2, fields: [ { name: 'type_Int8', type: 'Int8' }, @@ -103,10 +103,10 @@ describe('Buffer(b).deserialize ', () => { b = Buffer.serializeObj(srcStruct.schema.fields, srcData); }) bench('Object.fromEntries', () => { - let res = new BufferFormEntries(b).deserialize(srcStruct); + let res = new BufferFromEntries(b).deserialize(srcStruct); }) - bench('preBuild object Object', () => { - let res = new BufferPrebild(b).deserialize(srcStructPrebild); + bench('pre build object Object', () => { + let res = new BufferPreBuild(b).deserialize(srcStructPrebild); }) bench('mutation Object', () => { let res = new Buffer(b).deserialize(srcStruct); diff --git a/port/js/benchmarks/deserialize-variant/messgen-prebild.js b/port/js/benchmarks/deserialize-variant/messgen-pre-build.js similarity index 100% rename from port/js/benchmarks/deserialize-variant/messgen-prebild.js rename to port/js/benchmarks/deserialize-variant/messgen-pre-build.js From aca6f5d0fadec2e5416b42071b0016ac92aabeeb Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Mon, 15 Apr 2024 15:40:15 +0400 Subject: [PATCH 19/23] init js support for v1 --- .gitignore | 4 - README.md | 6 +- port/js/.gitignore | 5 +- port/js/package-lock.json | 665 +++++----------------------------- port/js/package.json | 20 +- port/js/src/messgen.d.ts | 6 +- port/js/src/messgen.js | 98 ++--- port/js/tests/messgen.test.js | 24 +- port/js/vite.config.js | 2 +- 9 files changed, 170 insertions(+), 660 deletions(-) diff --git a/.gitignore b/.gitignore index 8ff021b..5de5e55 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,3 @@ dump.txt tests/cpp/messgen .done.* -tests/js/tmp -tests/js/coverage -tests/js/messgen -tests/js/MessgenHelper.ts diff --git a/README.md b/README.md index 6e0264a..b3f9919 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Each protocol should be placed in directory `base_dir/protocol`. Message generator usage: ``` -python3 messgen.py --basedir --protocol --lang --outdir [--options key1=value1,key2=value2,...] +python3 messgen-generate.py --basedir --protocol --lang --outdir [--options key1=value1,key2=value2,...] ``` Generated messages placed in `out_dir` directory. @@ -51,7 +51,7 @@ Generated messages placed in `out_dir` directory. Example for C++ messages generation: ``` -python3 messgen.py --basedir ./base_dir --protocol my_namespace/my_protocol --lang cpp --outdir out/cpp --options cpp_standard=20 +python3 messgen-generate.py --basedir ./base_dir --protocol my_namespace/my_protocol --lang cpp --outdir out/cpp --options cpp_standard=20 ``` #### JSON @@ -59,7 +59,7 @@ python3 messgen.py --basedir ./base_dir --protocol my_namespace/my_protocol --la Example for JS messages generation: ``` -python3 messgen.py --basedir ./base_dir --protocol my_namespace/my_protocol --lang json --outdir out/json +python3 messgen-generate.py --basedir ./base_dir --protocol my_namespace/my_protocol --lang json --outdir out/json ``` This command will generate json schema containing full protocol description. diff --git a/port/js/.gitignore b/port/js/.gitignore index f26a9f2..891ef45 100644 --- a/port/js/.gitignore +++ b/port/js/.gitignore @@ -1,3 +1,6 @@ /dist /node_modules -/coverage \ No newline at end of file +/coverage + +/tests/another_proto/ +/tests/messgen/ diff --git a/port/js/package-lock.json b/port/js/package-lock.json index 2d81def..7fe0bce 100644 --- a/port/js/package-lock.json +++ b/port/js/package-lock.json @@ -9,22 +9,11 @@ "version": "1.0.0", "license": "ISC", "devDependencies": { - "@rollup/plugin-terser": "^0.4.3", - "prettier": "3.0.3", - "rollup": "^3.28.1", - "tinybench": "^2.6.0", - "unplugin-auto-import": "^0.17.5", - "vite": "^5.2.6", - "vitest": "^1.4.0" - } - }, - "node_modules/@antfu/utils": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.7.tgz", - "integrity": "sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/antfu" + "@rollup/plugin-terser": "^0.4.4", + "prettier": "3.2.5", + "tinybench": "^2.7.0", + "vite": "^5.2.8", + "vitest": "^1.5.0" } }, "node_modules/@esbuild/aix-ppc64": { @@ -465,45 +454,10 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@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, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@rollup/plugin-terser": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", - "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dev": true, "dependencies": { "serialize-javascript": "^6.0.1", @@ -514,7 +468,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^2.x || ^3.x" + "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -522,34 +476,6 @@ } } }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.13.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz", @@ -753,13 +679,13 @@ "peer": true }, "node_modules/@vitest/expect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz", - "integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.0.tgz", + "integrity": "sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==", "dev": true, "dependencies": { - "@vitest/spy": "1.4.0", - "@vitest/utils": "1.4.0", + "@vitest/spy": "1.5.0", + "@vitest/utils": "1.5.0", "chai": "^4.3.10" }, "funding": { @@ -767,12 +693,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz", - "integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.0.tgz", + "integrity": "sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==", "dev": true, "dependencies": { - "@vitest/utils": "1.4.0", + "@vitest/utils": "1.5.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -780,37 +706,10 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@vitest/snapshot": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz", - "integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.0.tgz", + "integrity": "sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -822,9 +721,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz", - "integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.0.tgz", + "integrity": "sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -834,9 +733,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz", - "integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.0.tgz", + "integrity": "sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -869,17 +768,16 @@ "node": ">=0.4.0" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/assertion-error": { @@ -891,45 +789,6 @@ "node": "*" } }, - "node_modules/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 - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -975,30 +834,6 @@ "node": "*" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1095,18 +930,6 @@ "@esbuild/win32-x64": "0.20.2" } }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -1116,43 +939,6 @@ "@types/estree": "^1.0.0" } }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@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" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1176,60 +962,6 @@ "node": "*" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1268,9 +1000,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "0.30.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", + "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -1285,43 +1017,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/mlly": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", @@ -1358,13 +1053,19 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/path-key": { @@ -1397,18 +1098,6 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/pkg-types": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", @@ -1449,9 +1138,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -1477,38 +1166,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1524,33 +1181,13 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rollup": { "version": "3.28.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", "dev": true, + "optional": true, + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -1562,29 +1199,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1605,12 +1219,6 @@ } ] }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true - }, "node_modules/serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", @@ -1730,9 +1338,9 @@ } }, "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.7.0.tgz", + "integrity": "sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==", "dev": true }, "node_modules/tinypool": { @@ -1753,18 +1361,6 @@ "node": ">=14.0.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -1780,96 +1376,14 @@ "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, - "node_modules/unimport": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.7.1.tgz", - "integrity": "sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "acorn": "^8.11.2", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "fast-glob": "^3.3.2", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "mlly": "^1.4.2", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "scule": "^1.1.1", - "strip-literal": "^1.3.0", - "unplugin": "^1.5.1" - } - }, - "node_modules/unimport/node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unplugin": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.0.tgz", - "integrity": "sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "chokidar": "^3.6.0", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.6.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/unplugin-auto-import": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.17.5.tgz", - "integrity": "sha512-fHNDkDSxv3PGagX1wmKBYBkgaM4AKAgZmdJw/bxjhNljx9KSXSgHpGfX0MwUrq9qw6q1bhHIZVWyOwoY2koo4w==", - "dev": true, - "dependencies": { - "@antfu/utils": "^0.7.7", - "@rollup/pluginutils": "^5.1.0", - "fast-glob": "^3.3.2", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "minimatch": "^9.0.3", - "unimport": "^3.7.1", - "unplugin": "^1.6.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@nuxt/kit": "^3.2.2", - "@vueuse/core": "*" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - }, - "@vueuse/core": { - "optional": true - } - } - }, "node_modules/vite": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", - "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", + "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", "dev": true, "dependencies": { "esbuild": "^0.20.1", - "postcss": "^8.4.36", + "postcss": "^8.4.38", "rollup": "^4.13.0" }, "bin": { @@ -1918,9 +1432,9 @@ } }, "node_modules/vite-node": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", - "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.0.tgz", + "integrity": "sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -1973,16 +1487,16 @@ } }, "node_modules/vitest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz", - "integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.0.tgz", + "integrity": "sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==", "dev": true, "dependencies": { - "@vitest/expect": "1.4.0", - "@vitest/runner": "1.4.0", - "@vitest/snapshot": "1.4.0", - "@vitest/spy": "1.4.0", - "@vitest/utils": "1.4.0", + "@vitest/expect": "1.5.0", + "@vitest/runner": "1.5.0", + "@vitest/snapshot": "1.5.0", + "@vitest/spy": "1.5.0", + "@vitest/utils": "1.5.0", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -1994,9 +1508,9 @@ "std-env": "^3.5.0", "strip-literal": "^2.0.0", "tinybench": "^2.5.1", - "tinypool": "^0.8.2", + "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.4.0", + "vite-node": "1.5.0", "why-is-node-running": "^2.2.2" }, "bin": { @@ -2011,8 +1525,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.4.0", - "@vitest/ui": "1.4.0", + "@vitest/browser": "1.5.0", + "@vitest/ui": "1.5.0", "happy-dom": "*", "jsdom": "*" }, @@ -2171,21 +1685,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", - "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", - "dev": true - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2216,6 +1715,18 @@ "engines": { "node": ">=8" } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/port/js/package.json b/port/js/package.json index 19d1c9c..a823265 100644 --- a/port/js/package.json +++ b/port/js/package.json @@ -8,20 +8,20 @@ "build": "vite build", "test": "vitest", "prettier": "prettier --write \"src/**/*.js\" \"tests/**/*.js\" \"*.js\"", - "gen-json": "python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l json -o ../../tests/js", - "gen-ts": "npm run gen-json && python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l ts -o ../../tests/js", - "gen-cpp": "python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l cpp -o ../../tests/js", - "gen-md": "python3 ../../generate.py -b ../../tests/messages -m messgen/messgen_test -l md -o ../../tests/js", + "gen": "python3 ../../messgen-generate.py --basedir ../../tests/messages --protocol messgen/test_proto --protocol messgen/messgen_test --protocol another_proto --outdir ./tests", + "gen-json": "npm run gen -- --lang json", + "gen-ts": "npm run gen-json && npm run gen -- --lang ts", + "gen-cpp": "npm run gen -- --lang cpp", + "gen-md": "npm run gen -- --lang md", "benchmark": "vitest bench" }, "author": "", "license": "ISC", "devDependencies": { - "@rollup/plugin-terser": "^0.4.3", - "prettier": "3.0.3", - "rollup": "^3.28.1", - "tinybench": "^2.6.0", - "vite": "^5.2.6", - "vitest": "^1.4.0" + "@rollup/plugin-terser": "^0.4.4", + "prettier": "3.2.5", + "tinybench": "^2.7.0", + "vite": "^5.2.8", + "vitest": "^1.5.0" } } diff --git a/port/js/src/messgen.d.ts b/port/js/src/messgen.d.ts index 9392289..e62569f 100644 --- a/port/js/src/messgen.d.ts +++ b/port/js/src/messgen.d.ts @@ -10,13 +10,13 @@ export type Schema = { export class Struct { - constructor(schema: Schema) {} + constructor(schema: Schema) get schema(): Schema get id(): number - get _size(): number + get size(): number get fields(): Field[] @@ -57,7 +57,7 @@ export class Buffer { static serialize(fields: Field[], includeMessages?: Messages) - get _size(): number + get size(): number get dataView(): DataView diff --git a/port/js/src/messgen.js b/port/js/src/messgen.js index f6dd544..36a188c 100644 --- a/port/js/src/messgen.js +++ b/port/js/src/messgen.js @@ -9,80 +9,80 @@ const DYNAMIC_SIZE_TYPE = "Uint32"; /** * * Read function returns value from byte array. - * Write function returns type byte _size. + * Write function returns type byte size. */ const basicTypes = [ { name: "Char", - _size: 1, + size: 1, read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), write: (v, s, a) => { v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN); return 1; } }, { name: "Int8", - _size: 1, + size: 1, read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setInt8(s, a, IS_LITTLE_ENDIAN); return 1; } }, { name: "Uint8", - _size: 1, + size: 1, read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setUint8(s, a, IS_LITTLE_ENDIAN); return 1; } }, { name: "Int16", - _size: 2, + size: 2, read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setInt16(s, a, IS_LITTLE_ENDIAN); return 2; } }, { name: "Uint16", - _size: 2, + size: 2, read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setUint16(s, a, IS_LITTLE_ENDIAN); return 2; } }, { name: "Int32", - _size: 4, + size: 4, read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setInt32(s, a, IS_LITTLE_ENDIAN); return 4; } }, { name: "Uint32", - _size: 4, + size: 4, read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setUint32(s, a, IS_LITTLE_ENDIAN); return 4; } }, { name: "Int64", - _size: 8, + size: 8, read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setBigInt64(s, a, IS_LITTLE_ENDIAN); return 8; } }, { name: "Uint64", - _size: 8, + size: 8, read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setBigUint64(s, a, IS_LITTLE_ENDIAN); return 8; } }, { name: "Float", - _size: 4, + size: 4, read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setFloat32(s, a, IS_LITTLE_ENDIAN); return 4; } }, { name: "Float32", - _size: 4, + size: 4, read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setFloat32(s, a, IS_LITTLE_ENDIAN); return 4; } }, { name: "Double", - _size: 8, + size: 8, read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { v.setFloat64(s, a, IS_LITTLE_ENDIAN); return 8; } }, { name: "String", - _size: 4, + size: 4, read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), write: (v, s, a) => { - let _size = a.length; - v.setUint32(s, _size, true); - for (let i = 0, s2 = s + 4; i < _size; i++) { + let size = a.length; + v.setUint32(s, size, true); + for (let i = 0, s2 = s + 4; i < size; i++) { v.setUint8(s2 + i, a[i], true); } - return _size + 4; + return size + 4; } } ]; @@ -96,7 +96,7 @@ let readFunc = [], for (let i = 0; i < basicTypes.length; i++) { let ti = basicTypes[i]; typeIndex[ti.name] = i; - typeSize[i] = ti._size; + typeSize[i] = ti.size; readFunc[i] = ti.read; writeFunc[i] = ti.write; } @@ -111,15 +111,15 @@ function parseType(typeStr, includeMessages) { let a = typeStr.split('['), name = a[0].trim(); - let _size, isComplex = false; + let size, isComplex = false; let type = typeIndex[name]; if (type != undefined) { - _size = typeSize[type]; + size = typeSize[type]; } else if (includeMessages && includeMessages[name]) { type = includeMessages[name]; - _size = type._size; + size = type.size; isComplex = true; } else { throw new Error(`Unknown type: ${ name }, if is complex type you must define before the struct. `); @@ -129,7 +129,7 @@ function parseType(typeStr, includeMessages) { return { typeIndex: type, - typeSize: _size, + typeSize: size, length: isNaN(length) ? 0 : length, isArray: a.length === 2, isComplex: isComplex @@ -159,7 +159,7 @@ export class Struct { return this._id; } - get _size() { + get size() { return this._size; } @@ -211,7 +211,7 @@ export class Struct { } // uint32 seq; //!< Sequence number -// uint16 _size; //!< Message payload _size +// uint16 size; //!< Message payload size // uint8 cls; //!< Message class // uint8 msg_id; //!< Message type ID @@ -220,7 +220,7 @@ export const HEADER_STRUCT = new Struct({ { 'name': "seq", 'type': "Uint32" }, { 'name': "cls", 'type': "Uint8" }, { 'name': "msg_id", 'type': "Uint8" }, - { 'name': "_size", 'type': "Uint32" } + { 'name': "size", 'type': "Uint32" } ] }); @@ -239,7 +239,7 @@ export class Buffer { let res = []; let buf = new Buffer(data); let cur = 0; - while (cur < buf._size) { + while (cur < buf.size) { let h = buf.deserialize(headerStruct, cur), m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__); m.__MSG_ID__ = h.msg_id; @@ -268,7 +268,7 @@ export class Buffer { static calcSize(fields, includeMessages) { - let _size = 0; + let size = 0; for (let i = 0, len = fields.length; i < len; i++) { @@ -279,24 +279,24 @@ export class Buffer { if (tp.isComplex) { if (tp.length === 0) { - _size += DYN_TYPE_SIZE; + size += DYN_TYPE_SIZE; } for (let i = 0; i < fi.value.length; i++) { let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages); - _size += Buffer.calcSize(arr, includeMessages); + size += Buffer.calcSize(arr, includeMessages); } } else { let arrayLength = 0; - // Dynamic _size array + // Dynamic size array if (tp.length === 0) { arrayLength = fi.value.length; - _size += tp.typeSize * arrayLength + DYN_TYPE_SIZE; // for dynamic array length descriptor + size += tp.typeSize * arrayLength + DYN_TYPE_SIZE; // for dynamic array length descriptor } else { - // static _size array + // static size array arrayLength = tp.length; - _size += tp.typeSize * arrayLength; + size += tp.typeSize * arrayLength; } if (tp.typeIndex === typeIndex.String) { @@ -304,25 +304,25 @@ export class Buffer { for (let i = 0; i < arrayLength; i++) { let b = encodeUTF8(fi.value[i] || ""); fi._bytes.push(b); - _size += b.length; + size += b.length; } } } } else if (tp.typeIndex === typeIndex.String) { fi._bytes = encodeUTF8(fi.value || ""); - _size += tp.typeSize + fi._bytes.length; + size += tp.typeSize + fi._bytes.length; } else { if (tp.isComplex) { - _size += Buffer.calcSize(fi.value, includeMessages); + size += Buffer.calcSize(fi.value, includeMessages); } else { - _size += tp.typeSize; + size += tp.typeSize; } } } - return _size; + return size; } static createValueArray(schemaFields, obj, includeMessages) { @@ -357,7 +357,7 @@ export class Buffer { let headerBuf = Buffer.serializeObj(headerStruct.fields, { seq: obj.seq, - _size: messageSize, + size: messageSize, cls: obj.cls, msg_id: struct.id }, @@ -384,7 +384,7 @@ export class Buffer { let arrayLength = p.length; - // Setting array _size value for dynamic array _size + // Setting array size value for dynamic array size if (arrayLength === 0) { arrayLength = fi.value.length; offset += DYN_WRITE(dataView, offset, fi.value.length); @@ -395,9 +395,9 @@ export class Buffer { let val = fi._bytes && fi._bytes[j] || fi.value[j]; if (p.isComplex) { let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages); - let _size = Buffer.calcSize(valArr, includeMessages); + let size = Buffer.calcSize(valArr, includeMessages); Buffer.writeDataView(valArr, dataView, includeMessages, offset); - offset += _size; + offset += size; } else { offset += writeFunc[p.typeIndex](dataView, offset, val); } @@ -406,9 +406,9 @@ export class Buffer { } else { if (p.isComplex) { - let _size = Buffer.calcSize(fi.value, includeMessages); + let size = Buffer.calcSize(fi.value, includeMessages); Buffer.writeDataView(fi.value, dataView, includeMessages, offset); - offset += _size; + offset += size; } else { let val = fi._bytes || fi.value; offset += writeFunc[p.typeIndex](dataView, offset, val); @@ -431,7 +431,7 @@ export class Buffer { return arrayBuffer; } - get _size() { + get size() { return this._dataView.buffer.byteLength; } @@ -447,7 +447,7 @@ export class Buffer { deserialize(struct, offset = 0, sizeOffset = 0) { this._dynamicOffset = 0; let res = this.__deserialize__(struct, offset, sizeOffset); - res.__SIZE__ = struct._size + this._dynamicOffset + sizeOffset; + res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset; return res; } @@ -473,7 +473,7 @@ export class Buffer { if (p.length === 0) { // - // Dynamic _size array + // Dynamic size array // let length = DYN_READ(dv, currOffset + this._dynamicOffset); @@ -504,7 +504,7 @@ export class Buffer { } else { // - //Static _size array + //Static size array // res[fi.name] = new Array(p.length); diff --git a/port/js/tests/messgen.test.js b/port/js/tests/messgen.test.js index 3430f01..02d6eeb 100644 --- a/port/js/tests/messgen.test.js +++ b/port/js/tests/messgen.test.js @@ -36,7 +36,7 @@ describe('Serialization deserialization tests', () => { type_Char: 'A' }; - //Testing proper _size of the message + //Testing proper size of the message srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); @@ -46,7 +46,7 @@ describe('Serialization deserialization tests', () => { expect(res).toEqual(srcData); }); - it('Basic types fixed array _size', () => { + it('Basic types fixed array size', () => { const ARRAY_SIZE = 100; @@ -95,7 +95,7 @@ describe('Serialization deserialization tests', () => { srcData.type_Char[i] = 'a'; } - //Testing proper _size of the message + //Testing proper size of the message srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); @@ -105,7 +105,7 @@ describe('Serialization deserialization tests', () => { expect(res).toEqual(srcData); }); - it('Basic types dynamic array _size', () => { + it('Basic types dynamic array size', () => { const ARRAY_SIZE = 100; @@ -154,7 +154,7 @@ describe('Serialization deserialization tests', () => { srcData.type_Char[i] = 'A'; } - //Testing proper _size of the message + //Testing proper size of the message srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); let b = Buffer.serializeObj(srcStruct.schema.fields, srcData); @@ -197,7 +197,7 @@ describe('Serialization deserialization tests', () => { type_Char: 'A' }; - //Testing proper _size of the message + //Testing proper size of the message srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); let b = Buffer.serializeMessage(srcStruct, srcData); @@ -209,7 +209,7 @@ describe('Serialization deserialization tests', () => { expect(res).toEqual(srcData); }); - it('Basic types fixed array _size with header', () => { + it('Basic types fixed array size with header', () => { const ARRAY_SIZE = 100; @@ -258,7 +258,7 @@ describe('Serialization deserialization tests', () => { srcData.type_Char[i] = 'A'; } - //Testing proper _size of the message + //Testing proper size of the message srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); let b = Buffer.serializeMessage(srcStruct, srcData); @@ -270,7 +270,7 @@ describe('Serialization deserialization tests', () => { expect(res).toEqual(srcData); }); - it('Basic types dynamic array _size with header', () => { + it('Basic types dynamic array size with header', () => { const ARRAY_SIZE = 100; @@ -319,7 +319,7 @@ describe('Serialization deserialization tests', () => { srcData.type_Char[i] = 'A'; } - //Testing proper _size of the message + //Testing proper size of the message srcData.__SIZE__ = Buffer.calcSize(Buffer.createValueArray(srcStruct.fields, srcData)); let b = Buffer.serializeMessage(srcStruct, srcData); @@ -331,7 +331,7 @@ describe('Serialization deserialization tests', () => { expect(res).toEqual(srcData); }); - it('Complex type with dynamic array _size', () => { + it('Complex type with dynamic array size', () => { let schema = { "MyYZ": { @@ -485,7 +485,7 @@ describe('Serialization deserialization tests', () => { }) - it('TODO: compose tests for not equal _size arrays messages', () => { + it('TODO: compose tests for not equal size arrays messages', () => { expect(true).toBe(true); }); }); diff --git a/port/js/vite.config.js b/port/js/vite.config.js index 1682fc4..00f2b32 100644 --- a/port/js/vite.config.js +++ b/port/js/vite.config.js @@ -1,4 +1,4 @@ -import { defineConfig } from 'vite' +import {defineConfig} from 'vite' import pkg from './package.json' import terser from '@rollup/plugin-terser' From d651b7e97cca6f47d1b114b522e05c66c9b1fc5a Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Mon, 15 Apr 2024 19:18:17 +0400 Subject: [PATCH 20/23] move to ts --- README.md | 6 +- .../benchmarks/deserialize-variant.bench.js | 2 +- port/js/benchmarks/serializeObj.bench.js | 3 +- port/js/package.json | 2 +- port/js/src/Buffer.ts | 338 ++++++++++ port/js/src/HEADER_STRUCT.ts | 12 + port/js/src/Struct.ts | 85 +++ port/js/src/constants.ts | 145 +++++ port/js/src/messgen.d.ts | 92 --- port/js/src/messgen.js | 593 ------------------ port/js/src/messgen.ts | 53 ++ port/js/src/parseType.ts | 44 ++ port/js/src/types.ts | 86 +++ port/js/src/utf8.js | 67 -- port/js/src/utf8.ts | 67 ++ port/js/tests/messgen.test.js | 5 +- port/js/tests/utf8.test.js | 2 +- port/js/vite.config.js | 2 +- 18 files changed, 843 insertions(+), 761 deletions(-) create mode 100644 port/js/src/Buffer.ts create mode 100644 port/js/src/HEADER_STRUCT.ts create mode 100644 port/js/src/Struct.ts create mode 100644 port/js/src/constants.ts delete mode 100644 port/js/src/messgen.d.ts delete mode 100644 port/js/src/messgen.js create mode 100644 port/js/src/messgen.ts create mode 100644 port/js/src/parseType.ts create mode 100644 port/js/src/types.ts delete mode 100644 port/js/src/utf8.js create mode 100644 port/js/src/utf8.ts diff --git a/README.md b/README.md index b3f9919..f49b8aa 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Each protocol should be placed in directory `base_dir/protocol`. `protocol` can be single directory or multiple subdirectories, outer directories are used as namespace for generated messages, e.g. "my_company/core" or "my_company/the_product/protocol". Message generator usage: -``` +```bash python3 messgen-generate.py --basedir --protocol --lang --outdir [--options key1=value1,key2=value2,...] ``` @@ -50,7 +50,7 @@ Generated messages placed in `out_dir` directory. Example for C++ messages generation: -``` +```bash python3 messgen-generate.py --basedir ./base_dir --protocol my_namespace/my_protocol --lang cpp --outdir out/cpp --options cpp_standard=20 ``` @@ -58,7 +58,7 @@ python3 messgen-generate.py --basedir ./base_dir --protocol my_namespace/my_prot Example for JS messages generation: -``` +```bash python3 messgen-generate.py --basedir ./base_dir --protocol my_namespace/my_protocol --lang json --outdir out/json ``` This command will generate json schema containing full protocol description. diff --git a/port/js/benchmarks/deserialize-variant.bench.js b/port/js/benchmarks/deserialize-variant.bench.js index 8a1bc3c..f2c1d44 100644 --- a/port/js/benchmarks/deserialize-variant.bench.js +++ b/port/js/benchmarks/deserialize-variant.bench.js @@ -1,11 +1,11 @@ import { bench } from 'vitest' -import {Struct} from '../src/messgen.js'; import {Buffer} from './deserialize-variant/messgen-old.js'; import { Buffer as BufferFromEntries} from './deserialize-variant/messgen-fromEntries.js'; import { Buffer as BufferPreBuild, Struct as StructPreBuild} from './deserialize-variant/messgen-pre-build.js'; import { bench, describe } from 'vitest' +import {Struct} from "../src/Struct.ts"; let srcStruct = new Struct({ id: 2, diff --git a/port/js/benchmarks/serializeObj.bench.js b/port/js/benchmarks/serializeObj.bench.js index 7bc40b8..2e825f7 100644 --- a/port/js/benchmarks/serializeObj.bench.js +++ b/port/js/benchmarks/serializeObj.bench.js @@ -1,5 +1,6 @@ -import {Buffer, Struct} from '../src/messgen.js'; import { bench, describe } from 'vitest' +import {Struct} from "../src/Struct.ts"; +import {Buffer} from "../src/Buffer.ts"; let srcStruct = new Struct({ id: 2, diff --git a/port/js/package.json b/port/js/package.json index a823265..d112c46 100644 --- a/port/js/package.json +++ b/port/js/package.json @@ -2,7 +2,7 @@ "name": "messgenjs", "version": "1.0.0", "description": "", - "main": "src/messgen.js", + "main": "src/messgen.ts", "type": "module", "scripts": { "build": "vite build", diff --git a/port/js/src/Buffer.ts b/port/js/src/Buffer.ts new file mode 100644 index 0000000..655c8b9 --- /dev/null +++ b/port/js/src/Buffer.ts @@ -0,0 +1,338 @@ +import { HEADER_STRUCT } from "./HEADER_STRUCT.js"; +import { parseType } from "./parseType.js"; +import { DYN_TYPE_SIZE, DYN_WRITE, DYN_READ, typeIndex, readFunc, writeFunc } from "./constants.js"; +import { encodeUTF8 } from "./utf8.js"; +import { Struct, FieldStruct } from "./Struct"; +import { Messages, SchemaObj, Obj, Field } from "./types"; + +/** + * class Buffer + */ +export class Buffer { + private _dynamicOffset: number; + private _includeMessages?: Messages + + set dataView(value: DataView) { + this._dataView = value; + } + + private _dataView: DataView; + + constructor(arrayBuffer: ArrayBufferLike) { + this._dataView = new DataView(arrayBuffer); + this._dynamicOffset = 0; + } + + // TODO: перенести в модуль messages + // а модуль messages генерализировать + static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages?: Messages) { + let res = []; + let buf = new Buffer(data); + let cur = 0; + while (cur < buf.size) { + let h = buf.deserialize(headerStruct, cur), + m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__); + m.__MSG_ID__ = h.msg_id; + cur += h.__SIZE__ + m.__SIZE__; + res.push(m); + } + return res; + } + + static mergeArrayBuffers(tArrs: Array, type = Uint8Array): Uint8Array { + const ret = new (type)(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)); + let off = 0; + tArrs.forEach((tArr) => { + ret.set(new (type)(tArr), off); + off += tArr.byteLength; + }); + return ret; + } + + static appendBuffer(buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBufferLike { + var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); + tmp.set(new Uint8Array(buffer1), 0); + tmp.set(new Uint8Array(buffer2), buffer1.byteLength); + return tmp.buffer; + } + + static calcSize(fields: FieldStruct[], includeMessages?: Messages) { + + let size = 0; + + for (let i = 0, len = fields.length; i < len; i++) { + + let fi = fields[i], + tp = fi._prop = parseType(fi.type, includeMessages); + + if (tp.isArray) { + + if (tp.isComplex) { + if (tp.length === 0) { + size += DYN_TYPE_SIZE; + } + for (let i = 0; i < fi.value.length; i++) { + let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages); + size += Buffer.calcSize(arr, includeMessages); + } + } else { + + let arrayLength = 0; + + // Dynamic size array + if (tp.length === 0) { + arrayLength = fi.value.length; + size += tp.typeSize * arrayLength + DYN_TYPE_SIZE; // for dynamic array length descriptor + } else { + // static size array + arrayLength = tp.length; + size += tp.typeSize * arrayLength; + } + + if (tp.typeIndex === typeIndex.String) { + fi._bytes = []; + for (let i = 0; i < arrayLength; i++) { + let b = encodeUTF8(fi.value[i] || ""); + fi._bytes.push(b); + size += b.length; + } + } + } + + } else if (tp.typeIndex === typeIndex.String) { + fi._bytes = encodeUTF8(fi.value || ""); + size += tp.typeSize + fi._bytes.length; + } else { + + if (tp.isComplex) { + size += Buffer.calcSize(fi.value, includeMessages); + } else { + size += tp.typeSize; + } + } + } + + return size; + } + + static createValueArray(schemaFields: SchemaObj["fields"], obj: Obj, includeMessages?: Messages) { + const len = schemaFields.length; + + let arr = new Array(len); + + for (let k = 0; k < len; k++) { + + let sk = schemaFields[k], + type = sk.type; + + if (includeMessages && includeMessages[type]) { + arr[k] = { + 'value': Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), + 'type': type + } + } else { + arr[k] = { 'value': obj[sk.name], 'type': type }; + } + } + + return arr; + } + + static serializeMessage(struct: Struct, obj: Obj, headerStruct = HEADER_STRUCT, includeMessages?: Messages) { + + let arr = Buffer.createValueArray(struct.fields, obj, includeMessages); + + let messageSize = Buffer.calcSize(arr, includeMessages); + + let headerBuf = Buffer.serializeObj(headerStruct.fields, { + seq: obj.seq, + size: messageSize, + cls: obj.cls, + msg_id: struct.id + }, + includeMessages); + + return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)); + } + + static serializeObj(schemaFields: FieldStruct[], obj: Obj, includeMessages?: Messages) { + + let arr = Buffer.createValueArray(schemaFields, obj, includeMessages); + + return Buffer.serialize(arr, includeMessages); + } + + static writeDataView(fields: FieldStruct[], dataView, includeMessages?: Messages, offset: number = 0) { + + for (let i = 0, len = fields.length; i < len; i++) { + + let fi = fields[i], + p = fi._prop; + + if (p.isArray) { + + let arrayLength = p.length; + + // Setting array size value for dynamic array size + if (arrayLength === 0) { + arrayLength = fi.value.length; + offset += DYN_WRITE(dataView, offset, fi.value.length); + } + + // Write array + for (let j = 0; j < arrayLength; j++) { + let val = fi._bytes && fi._bytes[j] || fi.value[j]; + if (p.isComplex) { + let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages); + let size = Buffer.calcSize(valArr, includeMessages); + Buffer.writeDataView(valArr, dataView, includeMessages, offset); + offset += size; + } else { + offset += writeFunc[p.typeIndex](dataView, offset, val); + } + } + + } else { + + if (p.isComplex) { + let size = Buffer.calcSize(fi.value, includeMessages); + Buffer.writeDataView(fi.value, dataView, includeMessages, offset); + offset += size; + } else { + let val = fi._bytes || fi.value; + offset += writeFunc[p.typeIndex](dataView, offset, val); + } + } + } + + return offset; + } + + static serialize(fields: FieldStruct[], includeMessages?: Messages) { + + let allSize = Buffer.calcSize(fields, includeMessages); + + let arrayBuffer = new ArrayBuffer(allSize), + dv = new DataView(arrayBuffer); + + Buffer.writeDataView(fields, dv, includeMessages); + + return arrayBuffer; + } + + get size(): number { + return this._dataView.buffer.byteLength; + } + + get dataView(): DataView { + return this._dataView; + } + + set(arrayBuffer: ArrayBufferLike): void { + this._dataView = null; + this._dataView = new DataView(arrayBuffer); + } + + deserialize(struct: Struct, offset: number = 0, sizeOffset: number = 0): Obj { + this._dynamicOffset = 0; + let res = this.__deserialize__(struct, offset, sizeOffset); + res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset; + return res; + } + + __deserialize__(struct: Struct, offset: number = 0, sizeOffset: number = 0): Obj { + + this._includeMessages = struct._includeMessages; + + let fields = struct.fields, + dv = this._dataView, + res = {}; + + let currOffset = 0; + + for (let f = 0, len = fields.length; f < len; f++) { + + let fi = fields[f], + p = fi._prop; + + currOffset = offset + fi._offset; + + if (p.isArray) { + + if (p.length === 0) { + + // + // Dynamic size array + // + + let length = DYN_READ(dv, currOffset + this._dynamicOffset); + + res[fi.name] = new Array(length); + + let currOffset_dyn = DYN_TYPE_SIZE + currOffset; + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize); + this._dynamicOffset += dv.getUint32(currOffset_dyn + this._dynamicOffset + j * p.typeSize, true); + } + } else { + if (p.isComplex) { + for (let j = 0; j < length; j++) { + res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset_dyn + j * p.typeSize, sizeOffset); + } + } else { + for (let j = 0; j < length; j++) { + res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize); + } + } + } + + this._dynamicOffset += length * p.typeSize; + + } else { + + // + //Static size array + // + + res[fi.name] = new Array(p.length); + + if (p.typeIndex === typeIndex.String) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize); + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true); + } + } else { + if (p.isComplex) { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset + j * p.typeSize, sizeOffset); + } + } else { + for (let j = 0; j < p.length; j++) { + res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize); + } + } + } + } + + } else { + + if (p.isComplex) { + + res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset); + + } else { + + res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset); + + if (p.typeIndex === typeIndex.String) { + this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true); + } + } + } + } + + return res; + } +} diff --git a/port/js/src/HEADER_STRUCT.ts b/port/js/src/HEADER_STRUCT.ts new file mode 100644 index 0000000..950201d --- /dev/null +++ b/port/js/src/HEADER_STRUCT.ts @@ -0,0 +1,12 @@ +import {Struct} from "./Struct.js"; +import { SchemaObj } from "./types"; + +export const HEADER_STRUCT = new Struct({ + id: 0, + fields: [ + { 'name': "seq", 'type': "Uint32" }, + { 'name': "cls", 'type': "Uint8" }, + { 'name': "msg_id", 'type': "Uint8" }, + { 'name': "size", 'type': "Uint32" } + ] +} satisfies SchemaObj); diff --git a/port/js/src/Struct.ts b/port/js/src/Struct.ts new file mode 100644 index 0000000..f7333f2 --- /dev/null +++ b/port/js/src/Struct.ts @@ -0,0 +1,85 @@ +import { parseType, ParseType } from "./parseType.js"; +import { DYN_TYPE_SIZE } from "./constants.js"; +import { SchemaObj, Messages, Field } from "./types"; + + +export type FieldStruct = Field & { + _offset: number + _prop: ParseType +}; + +/** + * + * class Struct + */ +export class Struct { + _id = 0; + _size = 0; + _fields: Array = null; + _schema = null; + _includeMessages?: Messages + + constructor(schema: SchemaObj, includeMessages?: Messages) { + this._includeMessages = includeMessages; + this.set(schema); + } + + get schema() { + return this._schema; + } + + get id() { + return this._id; + } + + get size() { + return this._size; + } + + get fields() { + return this._fields; + } + + set(schema) { + if (schema) { + this._id = schema.id || 0; + this._size = 0; + this._fields = new Array(schema.fields.length); + this._schema = schema; + this._init(); + } + } + + _init() { + + let schemaFields = this._schema.fields; + + let offset = 0; + + for (let i = 0, len = schemaFields.length; i < len; i++) { + + let si = schemaFields[i], + tp = parseType(si.type, this._includeMessages); + + this._fields[i] = { + name: si.name, + type: si.type, + _offset: offset, + _prop: tp + }; + + if (tp.isArray) { + if (tp.length === 0) { + offset += DYN_TYPE_SIZE; + } else { + offset += tp.typeSize * tp.length; + } + } else { + offset += tp.typeSize; + } + } + + this._size = offset; + } +} + diff --git a/port/js/src/constants.ts b/port/js/src/constants.ts new file mode 100644 index 0000000..5aec60a --- /dev/null +++ b/port/js/src/constants.ts @@ -0,0 +1,145 @@ +import { decodeUTF8 } from "./utf8"; + +const IS_LITTLE_ENDIAN = true; +const DYNAMIC_SIZE_TYPE = "Uint32"; +/** + * + * Read function returns value from byte array. + * Write function returns type byte size. + */ +export const basicTypes = [ + { + name: "Char", + size: 1, + read: (v, s) => String.fromCharCode(v.getInt8(s)), + write: (v, s, a) => { + v.setInt8(s, a ? a.toString().charCodeAt(0) : 0); + return 1; + } + }, { + name: "Int8", + size: 1, + read: (v, s) => v.getInt8(s), + write: (v, s, a) => { + v.setInt8(s, a); + return 1; + } + }, { + name: "Uint8", + size: 1, + read: (v, s) => v.getUint8(s), + write: (v, s, a) => { + v.setUint8(s, a); + return 1; + } + }, { + name: "Int16", + size: 2, + read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt16(s, a, IS_LITTLE_ENDIAN); + return 2; + } + }, { + name: "Uint16", + size: 2, + read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint16(s, a, IS_LITTLE_ENDIAN); + return 2; + } + }, { + name: "Int32", + size: 4, + read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setInt32(s, a, IS_LITTLE_ENDIAN); + return 4; + } + }, { + name: "Uint32", + size: 4, + read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setUint32(s, a, IS_LITTLE_ENDIAN); + return 4; + } + }, { + name: "Int64", + size: 8, + read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigInt64(s, a, IS_LITTLE_ENDIAN); + return 8; + } + }, { + name: "Uint64", + size: 8, + read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setBigUint64(s, a, IS_LITTLE_ENDIAN); + return 8; + } + }, { + name: "Float", + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN); + return 4; + } + }, { + name: "Float32", + size: 4, + read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat32(s, a, IS_LITTLE_ENDIAN); + return 4; + } + }, { + name: "Double", + size: 8, + read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), + write: (v, s, a) => { + v.setFloat64(s, a, IS_LITTLE_ENDIAN); + return 8; + } + }, { + name: "String", + size: 4, + read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), + write: (v, s, a) => { + let size = a.length; + v.setUint32(s, size, true); + for (let i = 0, s2 = s + 4; i < size; i++) { + v.setUint8(s2 + i, a[i]); + } + return size + 4; + } + } +] satisfies { + name: string; + size: number; + read: (v: DataView, s: number) => any; + write: (v: DataView, s: number, a: any) => number; +}[] + + +export let typeIndex: Record = {} +export let typeSize: number[] = [] + +export let readFunc = [] +export let writeFunc = []; + +for (let i = 0; i < basicTypes.length; i++) { + let ti = basicTypes[i]; + typeIndex[ti.name] = i; + typeSize[i] = ti.size; + readFunc[i] = ti.read; + writeFunc[i] = ti.write; +} + +const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE]; +export const DYN_TYPE_SIZE = typeSize[DYN_TYPE]; +export const DYN_READ = readFunc[DYN_TYPE]; +export const DYN_WRITE = writeFunc[DYN_TYPE]; diff --git a/port/js/src/messgen.d.ts b/port/js/src/messgen.d.ts deleted file mode 100644 index e62569f..0000000 --- a/port/js/src/messgen.d.ts +++ /dev/null @@ -1,92 +0,0 @@ -export type Field = { - name: string - type: string -} - -export type Schema = { - id: number - fields: Field[] -} - - -export class Struct { - constructor(schema: Schema) - - get schema(): Schema - - get id(): number - - get size(): number - - get fields(): Field[] - - set(schema: Schema): void -} - - -declare type Messages = { - __id__: Struct[] - __name__: KEYS[] -} & - Record & - addPrefixToObject>, 'MSG_'> & - Record; - -export const HEADER_STRUCT: Struct - -type Obj = Record; - -export class Buffer { - constructor(data: ArrayBufferLike) - - static deserialize(messages, data, headerStruct?: Struct, includeMessages?: Messages) - - static mergeArrayBuffers(tArrs: Array, type: Uint8ArrayConstructor): Uint8Array - - static appendBuffer(buffer1: ArrayBuffer, buffer2: ArrayBuffer): Uint8Array - - static calcSize(fields: Field[], includeMessages?: Messages) - - static createValueArray(schemaFields: Schema["fields"], obj: Obj, includeMessages?: Messages) - - static serializeMessage(struct: Struct, obj: Obj, headerStruct ?: Struct, includeMessages?: Messages): Uint8Array - - static serializeObj(schemaFields: Schema["fields"], obj: Obj, includeMessages?: Messages) - - static writeDataView(fields: Field[], dataView, includeMessages?: Messages, offset ?: number) - - static serialize(fields: Field[], includeMessages?: Messages) - - get size(): number - - get dataView(): DataView - - set(arrayBuffer: ArrayBufferLike): void - - deserialize(struct: Struct, offset?: number, sizeOffset?: number): Obj - -} - -export function initializeMessages( - messagesJson: Record, - headerSchema?: Schema -): Messages - -/* - ____,-------------------------------,____ - \ | HELPERS | / - /___|-------------------------------|___\ - -*/ - -// https://stackoverflow.com/questions/71824852/convert-typescript-object-keys-to-uppercase -// All string-type keys in the object, and then uppercased -type UppercaseStringKeys = Uppercase>; -// An object consisting of the above keys with the same values from the original object -type UppercaseObjectKeys = { - [x in UppercaseStringKeys]: x extends string ? T[Lowercase] : T[x]; -}; -// https://stackoverflow.com/questions/57510388/define-prefix-for-object-keys-using-types-in-typescript -type addPrefixToObject = { - [K in keyof T as K extends string ? `${P}${K}` : never]: T[K] -} diff --git a/port/js/src/messgen.js b/port/js/src/messgen.js deleted file mode 100644 index 36a188c..0000000 --- a/port/js/src/messgen.js +++ /dev/null @@ -1,593 +0,0 @@ -'use strict'; - -import {encodeUTF8, decodeUTF8} from "./utf8.js"; - -const IS_LITTLE_ENDIAN = true; - -const DYNAMIC_SIZE_TYPE = "Uint32"; - -/** - * - * Read function returns value from byte array. - * Write function returns type byte size. - */ -const basicTypes = [ - { - name: "Char", - size: 1, - read: (v, s) => String.fromCharCode(v.getInt8(s, IS_LITTLE_ENDIAN)), - write: (v, s, a) => { v.setInt8(s, a ? a.toString().charCodeAt(0) : 0, IS_LITTLE_ENDIAN); return 1; } - }, { - name: "Int8", - size: 1, - read: (v, s) => v.getInt8(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setInt8(s, a, IS_LITTLE_ENDIAN); return 1; } - }, { - name: "Uint8", - size: 1, - read: (v, s) => v.getUint8(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setUint8(s, a, IS_LITTLE_ENDIAN); return 1; } - }, { - name: "Int16", - size: 2, - read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setInt16(s, a, IS_LITTLE_ENDIAN); return 2; } - }, { - name: "Uint16", - size: 2, - read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setUint16(s, a, IS_LITTLE_ENDIAN); return 2; } - }, { - name: "Int32", - size: 4, - read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setInt32(s, a, IS_LITTLE_ENDIAN); return 4; } - }, { - name: "Uint32", - size: 4, - read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setUint32(s, a, IS_LITTLE_ENDIAN); return 4; } - }, { - name: "Int64", - size: 8, - read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setBigInt64(s, a, IS_LITTLE_ENDIAN); return 8; } - }, { - name: "Uint64", - size: 8, - read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setBigUint64(s, a, IS_LITTLE_ENDIAN); return 8; } - }, { - name: "Float", - size: 4, - read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setFloat32(s, a, IS_LITTLE_ENDIAN); return 4; } - }, { - name: "Float32", - size: 4, - read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setFloat32(s, a, IS_LITTLE_ENDIAN); return 4; } - }, { - name: "Double", - size: 8, - read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), - write: (v, s, a) => { v.setFloat64(s, a, IS_LITTLE_ENDIAN); return 8; } - }, { - name: "String", - size: 4, - read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), - write: (v, s, a) => { - let size = a.length; - v.setUint32(s, size, true); - for (let i = 0, s2 = s + 4; i < size; i++) { - v.setUint8(s2 + i, a[i], true); - } - return size + 4; - } - } -]; - -let typeIndex = [], - typeSize = []; - -let readFunc = [], - writeFunc = []; - -for (let i = 0; i < basicTypes.length; i++) { - let ti = basicTypes[i]; - typeIndex[ti.name] = i; - typeSize[i] = ti.size; - readFunc[i] = ti.read; - writeFunc[i] = ti.write; -} - -const DYN_TYPE = typeIndex[DYNAMIC_SIZE_TYPE]; -const DYN_TYPE_SIZE = typeSize[DYN_TYPE]; -const DYN_READ = readFunc[DYN_TYPE]; -const DYN_WRITE = writeFunc[DYN_TYPE]; - -function parseType(typeStr, includeMessages) { - - let a = typeStr.split('['), - name = a[0].trim(); - - let size, isComplex = false; - - let type = typeIndex[name]; - - if (type != undefined) { - size = typeSize[type]; - } else if (includeMessages && includeMessages[name]) { - type = includeMessages[name]; - size = type.size; - isComplex = true; - } else { - throw new Error(`Unknown type: ${ name }, if is complex type you must define before the struct. `); - } - - let length = parseInt(a[1]); - - return { - typeIndex: type, - typeSize: size, - length: isNaN(length) ? 0 : length, - isArray: a.length === 2, - isComplex: isComplex - }; -} -/** - * class Struct - */ -export class Struct { - constructor(schema, includeMessages) { - - this._id = 0; - this._size = 0; - this._fields = null; - this._schema = null; - - this._includeMessages = includeMessages; - - this.set(schema); - } - - get schema() { - return this._schema; - } - - get id() { - return this._id; - } - - get size() { - return this._size; - } - - get fields() { - return this._fields; - } - - set(schema) { - if (schema) { - this._id = schema.id || 0; - this._size = 0; - this._fields = new Array(schema.fields.length); - this._schema = schema; - this._init(); - } - } - - _init() { - - let schemaFields = this._schema.fields; - - let offset = 0; - - for (let i = 0, len = schemaFields.length; i < len; i++) { - - let si = schemaFields[i], - tp = parseType(si.type, this._includeMessages); - - this._fields[i] = { - name: si.name, - type: si.type, - _offset: offset, - _prop: tp - }; - - if (tp.isArray) { - if (tp.length === 0) { - offset += DYN_TYPE_SIZE; - } else { - offset += tp.typeSize * tp.length; - } - } else { - offset += tp.typeSize; - } - } - - this._size = offset; - } -} - -// uint32 seq; //!< Sequence number -// uint16 size; //!< Message payload size -// uint8 cls; //!< Message class -// uint8 msg_id; //!< Message type ID - -export const HEADER_STRUCT = new Struct({ - fields: [ - { 'name': "seq", 'type': "Uint32" }, - { 'name': "cls", 'type': "Uint8" }, - { 'name': "msg_id", 'type': "Uint8" }, - { 'name': "size", 'type': "Uint32" } - ] -}); - -/** - * class Buffer - */ -export class Buffer { - constructor(arrayBuffer) { - this._dataView = new DataView(arrayBuffer); - this._dynamicOffset = 0; - } - - // TODO: перенести в модуль messages - // а модуль messages генерализировать - static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages) { - let res = []; - let buf = new Buffer(data); - let cur = 0; - while (cur < buf.size) { - let h = buf.deserialize(headerStruct, cur), - m = buf.deserialize(messages.__id__[h.msg_id], cur + h.__SIZE__); - m.__MSG_ID__ = h.msg_id; - cur += h.__SIZE__ + m.__SIZE__; - res.push(m); - } - return res; - } - - static mergeArrayBuffers(tArrs, type = Uint8Array) { - const ret = new (type)(tArrs.reduce((acc, tArr) => acc + tArr.byteLength, 0)); - let off = 0; - tArrs.forEach((tArr) => { - ret.set(new (type)(tArr), off); - off += tArr.byteLength; - }); - return ret; - } - - static appendBuffer(buffer1, buffer2) { - var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); - tmp.set(new Uint8Array(buffer1), 0); - tmp.set(new Uint8Array(buffer2), buffer1.byteLength); - return tmp.buffer; - } - - static calcSize(fields, includeMessages) { - - let size = 0; - - for (let i = 0, len = fields.length; i < len; i++) { - - let fi = fields[i], - tp = fi._prop = parseType(fi.type, includeMessages); - - if (tp.isArray) { - - if (tp.isComplex) { - if (tp.length === 0) { - size += DYN_TYPE_SIZE; - } - for (let i = 0; i < fi.value.length; i++) { - let arr = Buffer.createValueArray(fi._prop.typeIndex.fields, fi.value[i], includeMessages); - size += Buffer.calcSize(arr, includeMessages); - } - } else { - - let arrayLength = 0; - - // Dynamic size array - if (tp.length === 0) { - arrayLength = fi.value.length; - size += tp.typeSize * arrayLength + DYN_TYPE_SIZE; // for dynamic array length descriptor - } else { - // static size array - arrayLength = tp.length; - size += tp.typeSize * arrayLength; - } - - if (tp.typeIndex === typeIndex.String) { - fi._bytes = []; - for (let i = 0; i < arrayLength; i++) { - let b = encodeUTF8(fi.value[i] || ""); - fi._bytes.push(b); - size += b.length; - } - } - } - - } else if (tp.typeIndex === typeIndex.String) { - fi._bytes = encodeUTF8(fi.value || ""); - size += tp.typeSize + fi._bytes.length; - } else { - - if (tp.isComplex) { - size += Buffer.calcSize(fi.value, includeMessages); - } else { - size += tp.typeSize; - } - } - } - - return size; - } - - static createValueArray(schemaFields, obj, includeMessages) { - - const len = schemaFields.length; - - let arr = new Array(len); - - for (let k = 0; k < len; k++) { - - let sk = schemaFields[k], - type = sk.type; - - if (includeMessages && includeMessages[type]) { - arr[k] = { - 'value': Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), - 'type': type - } - } else { - arr[k] = { 'value': obj[sk.name], 'type': type }; - } - } - - return arr; - } - - static serializeMessage(struct, obj, headerStruct = HEADER_STRUCT, includeMessages) { - - let arr = Buffer.createValueArray(struct.fields, obj, includeMessages); - - let messageSize = Buffer.calcSize(arr, includeMessages); - - let headerBuf = Buffer.serializeObj(headerStruct.fields, { - seq: obj.seq, - size: messageSize, - cls: obj.cls, - msg_id: struct.id - }, - includeMessages); - - return Buffer.appendBuffer(headerBuf, Buffer.serialize(arr, includeMessages)); - } - - static serializeObj(schemaFields, obj, includeMessages) { - - let arr = Buffer.createValueArray(schemaFields, obj, includeMessages); - - return Buffer.serialize(arr, includeMessages); - } - - static writeDataView(fields, dataView, includeMessages, offset = 0) { - - for (let i = 0, len = fields.length; i < len; i++) { - - let fi = fields[i], - p = fi._prop; - - if (p.isArray) { - - let arrayLength = p.length; - - // Setting array size value for dynamic array size - if (arrayLength === 0) { - arrayLength = fi.value.length; - offset += DYN_WRITE(dataView, offset, fi.value.length); - } - - // Write array - for (let j = 0; j < arrayLength; j++) { - let val = fi._bytes && fi._bytes[j] || fi.value[j]; - if (p.isComplex) { - let valArr = Buffer.createValueArray(p.typeIndex.fields, fi.value[j], includeMessages); - let size = Buffer.calcSize(valArr, includeMessages); - Buffer.writeDataView(valArr, dataView, includeMessages, offset); - offset += size; - } else { - offset += writeFunc[p.typeIndex](dataView, offset, val); - } - } - - } else { - - if (p.isComplex) { - let size = Buffer.calcSize(fi.value, includeMessages); - Buffer.writeDataView(fi.value, dataView, includeMessages, offset); - offset += size; - } else { - let val = fi._bytes || fi.value; - offset += writeFunc[p.typeIndex](dataView, offset, val); - } - } - } - - return offset; - } - - static serialize(fields, includeMessages) { - - let allSize = Buffer.calcSize(fields, includeMessages); - - let arrayBuffer = new ArrayBuffer(allSize), - dv = new DataView(arrayBuffer); - - Buffer.writeDataView(fields, dv, includeMessages); - - return arrayBuffer; - } - - get size() { - return this._dataView.buffer.byteLength; - } - - get dataView() { - return this._dataView; - } - - set(arrayBuffer) { - this._dataView = null; - this._dataView = new DataView(arrayBuffer); - } - - deserialize(struct, offset = 0, sizeOffset = 0) { - this._dynamicOffset = 0; - let res = this.__deserialize__(struct, offset, sizeOffset); - res.__SIZE__ = struct.size + this._dynamicOffset + sizeOffset; - return res; - } - - __deserialize__(struct, offset, sizeOffset) { - - this._includeMessages = struct._includeMessages; - - let fields = struct.fields, - dv = this._dataView, - res = {}; - - let currOffset = 0; - - for (let f = 0, len = fields.length; f < len; f++) { - - let fi = fields[f], - p = fi._prop; - - currOffset = offset + fi._offset; - - if (p.isArray) { - - if (p.length === 0) { - - // - // Dynamic size array - // - - let length = DYN_READ(dv, currOffset + this._dynamicOffset); - - res[fi.name] = new Array(length); - - let currOffset_dyn = DYN_TYPE_SIZE + currOffset; - - if (p.typeIndex === typeIndex.String) { - for (let j = 0; j < length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize); - this._dynamicOffset += dv.getUint32(currOffset_dyn + this._dynamicOffset + j * p.typeSize, true); - } - } else { - if (p.isComplex) { - for (let j = 0; j < length; j++) { - res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset_dyn + j * p.typeSize, sizeOffset); - } - } else { - for (let j = 0; j < length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset_dyn + this._dynamicOffset + j * p.typeSize); - } - } - } - - this._dynamicOffset += length * p.typeSize; - - } else { - - // - //Static size array - // - - res[fi.name] = new Array(p.length); - - if (p.typeIndex === typeIndex.String) { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize); - this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset + j * p.typeSize, true); - } - } else { - if (p.isComplex) { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = this.__deserialize__(p.typeIndex, currOffset + j * p.typeSize, sizeOffset); - } - } else { - for (let j = 0; j < p.length; j++) { - res[fi.name][j] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset + j * p.typeSize); - } - } - } - } - - } else { - - if (p.isComplex) { - - res[fi.name] = this.__deserialize__(p.typeIndex, currOffset, sizeOffset); - - } else { - - res[fi.name] = readFunc[p.typeIndex](dv, currOffset + this._dynamicOffset); - - if (p.typeIndex === typeIndex.String) { - this._dynamicOffset += dv.getUint32(currOffset + this._dynamicOffset, true); - } - } - } - } - - return res; - } -} - -/** - * Creates message struct namespace - * @param {*} messagesJson - Array of messages schemas - * @param {*} headerSchema - message header schema - */ -export function initializeMessages(messagesJson, headerSchema) { - - let res = { - __id__: [], - __name__: [], - HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT - }; - - for (let m of getKeysWithSortById(messagesJson)) { - - let name = m.trim(), - messageObj = messagesJson[m], - msg = "MSG_" + name.toUpperCase(), - id = messageObj.id; - - if (!res.__id__[id]) { - let msg_struct = new Struct(messageObj, res); - - res.__id__[id] = msg_struct; - res.__name__[id] = m.trim(); - res[msg] = msg_struct; - res[name] = msg_struct; - - } else { - console.warn(`Warning: message ${ id } ${ msg } already exists.`); - } - } - - return res; -} - -const getKeysWithSortById = (obj) => { - let keys = Object.keys(obj); - keys.sort((a, b) => { - return obj[a].id - obj[b].id; - }); - return keys; -} diff --git a/port/js/src/messgen.ts b/port/js/src/messgen.ts new file mode 100644 index 0000000..5f9ad6c --- /dev/null +++ b/port/js/src/messgen.ts @@ -0,0 +1,53 @@ +'use strict'; + +import {Struct} from "./Struct.ts"; +import {HEADER_STRUCT} from "./HEADER_STRUCT.ts"; +import {Schema, Messages} from "./messgen.js"; + + +/** + * Creates message struct namespace + * @param {*} messagesJson - Array of messages schemas + * @param {*} headerSchema - message header schema + */ +export function initializeMessages( + messagesJson: Record, + headerSchema?: Schema +): Messages { + + let res = { + __id__: [], + __name__: [], + HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT + }; + + for (let m of getKeysWithSortById(messagesJson)) { + + let name = m.trim(), + messageObj = messagesJson[m], + msg = "MSG_" + name.toUpperCase(), + id = messageObj.id; + + if (!res.__id__[id]) { + let msg_struct = new Struct(messageObj, res); + + res.__id__[id] = msg_struct; + res.__name__[id] = m.trim(); + res[msg] = msg_struct; + res[name] = msg_struct; + + } else { + console.warn(`Warning: message ${ id } ${ msg } already exists.`); + } + } + + return res; +} + +const getKeysWithSortById = (obj) => { + let keys = Object.keys(obj); + keys.sort((a, b) => { + return obj[a].id - obj[b].id; + }); + return keys; +} diff --git a/port/js/src/parseType.ts b/port/js/src/parseType.ts new file mode 100644 index 0000000..a5d800a --- /dev/null +++ b/port/js/src/parseType.ts @@ -0,0 +1,44 @@ +import { typeIndex, typeSize } from "./constants"; +import { Messages } from "./types"; +import { Struct } from "./Struct"; + +export type ParseType = { + struct?: Struct + typeIndex: number | Struct + typeSize: number + length: number + isArray: boolean + isComplex: boolean +} + +export function parseType(typeStr: string, includeMessages: Messages): ParseType { + + let a = typeStr.split('['), + name = a[0].trim(); + + let size, isComplex = false; + let struct + let type: Struct | number = typeIndex[name]; + + if (type != undefined) { + size = typeSize[type]; + } else if (includeMessages && includeMessages[name]) { + type = includeMessages[name]; + struct = includeMessages[name]; + size = type.size; + isComplex = true; + } else { + throw new Error(`Unknown type: ${name}, if is complex type you must define before the struct. `); + } + + let length = parseInt(a[1]); + + return { + struct, + typeIndex: type, + typeSize: size, + length: isNaN(length) ? 0 : length, + isArray: a.length === 2, + isComplex: isComplex + }; +} diff --git a/port/js/src/types.ts b/port/js/src/types.ts new file mode 100644 index 0000000..8bcb222 --- /dev/null +++ b/port/js/src/types.ts @@ -0,0 +1,86 @@ +import { Struct } from "./Struct"; + + +export type Field = { + name: IName + type: IType +} + +export type SchemaObj = { + id: IId + fields: Field[] +} + + +export type Messages = { + __id__: Struct[] + __name__: KEYS[] +} & + Record & + addPrefixToObject>, 'MSG_'> & + Record; + + +export type Obj = Record; + + +/* + ____,-------------------------------------,____ + \ | Nominal types | / + /___|-------------------------------------|___\ + +*/ +declare const NominalType: unique symbol +// String-typed unique nominal types generator: +// +// let a: NominalStrict<'DateTime'> = '2021-10-26T13:53:05.997Z'; +// let b: NominalStrict<'DayDate'> = '2021-10-26'; +// a = b; - compile-time error; +export type NominalStrict = Type & { [NominalType]: NAME } +export type Nominal = Type & { [NominalType]?: NAME } + + +export type IName = Nominal<'Name', string> +export type IId = Nominal<'Id', number> +export type IPrimitiveType = + "Int8" | + "Uint8" | + "Int16" | + "Uint16" | + "Int32" | + "Uint32" | + "Int64" | + "Uint64" | + "String" | + "Double" | + "Char" + +type ArrayDynamicSize = '[]'; +type ArrayFixSize = `[${number}]`; +type MapType = `{${'string' | 'number'}`; + +type SubType = `${ArrayDynamicSize | ArrayFixSize}` | ''; + + +export type IType = `${IName | IPrimitiveType}${SubType}${SubType}${SubType}` + + +/* + ____,-------------------------------,____ + \ | HELPERS | / + /___|-------------------------------|___\ + +*/ + + +// https://stackoverflow.com/questions/71824852/convert-typescript-object-keys-to-uppercase +// All string-type keys in the object, and then uppercased +type UppercaseStringKeys = Uppercase>; +// An object consisting of the above keys with the same values from the original object +type UppercaseObjectKeys = { + [x in UppercaseStringKeys]: x extends string ? T[Lowercase] : T[x]; +}; +// https://stackoverflow.com/questions/57510388/define-prefix-for-object-keys-using-types-in-typescript +type addPrefixToObject = { + [K in keyof T as K extends string ? `${P}${K}` : never]: T[K] +} diff --git a/port/js/src/utf8.js b/port/js/src/utf8.js deleted file mode 100644 index e37c8bc..0000000 --- a/port/js/src/utf8.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict' - -// This is free and unencumbered software released into the public domain. -// https://gist.github.com/pascaldekloe - -// Marshals a string to an Uint8Array. -export function encodeUTF8(s) { - var i = 0, - bytes = new Uint8Array(s.length * 4) - for (var ci = 0; ci !== s.length; ci++) { - var c = s.charCodeAt(ci) - if (c < 128) { - bytes[i++] = c - continue - } - if (c < 2048) { - bytes[i++] = (c >> 6) | 192 - } else { - if (c > 0xd7ff && c < 0xdc00) { - if (++ci >= s.length) throw new Error('UTF-8 encode: incomplete surrogate pair') - var c2 = s.charCodeAt(ci) - if (c2 < 0xdc00 || c2 > 0xdfff) - throw new Error( - 'UTF-8 encode: second surrogate character 0x' + - c2.toString(16) + - ' at index ' + - ci + - ' out of range' - ) - c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff) - bytes[i++] = (c >> 18) | 240 - bytes[i++] = ((c >> 12) & 63) | 128 - } else bytes[i++] = (c >> 12) | 224 - bytes[i++] = ((c >> 6) & 63) | 128 - } - bytes[i++] = (c & 63) | 128 - } - return bytes.subarray(0, i) -} - -// Unmarshals a string from an Uint8Array. -export function decodeUTF8(bytes) { - var i = 0, - s = '' - while (i < bytes.length) { - var c = bytes[i++] - if (c > 127) { - if (c > 191 && c < 224) { - if (i >= bytes.length) throw new Error('UTF-8 decode: incomplete 2-byte sequence') - c = ((c & 31) << 6) | (bytes[i++] & 63) - } else if (c > 223 && c < 240) { - if (i + 1 >= bytes.length) throw new Error('UTF-8 decode: incomplete 3-byte sequence') - c = ((c & 15) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) - } else if (c > 239 && c < 248) { - if (i + 2 >= bytes.length) throw new Error('UTF-8 decode: incomplete 4-byte sequence') - c = ((c & 7) << 18) | ((bytes[i++] & 63) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) - } else throw new Error('UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1)) - } - if (c <= 0xffff) s += String.fromCharCode(c) - else if (c <= 0x10ffff) { - c -= 0x10000 - s += String.fromCharCode((c >> 10) | 0xd800) - s += String.fromCharCode((c & 0x3ff) | 0xdc00) - } else throw new Error('UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach') - } - return s -} diff --git a/port/js/src/utf8.ts b/port/js/src/utf8.ts new file mode 100644 index 0000000..6253d69 --- /dev/null +++ b/port/js/src/utf8.ts @@ -0,0 +1,67 @@ +'use strict' + +// This is free and unencumbered software released into the public domain. +// https://gist.github.com/pascaldekloe + +// Marshals a string to an Uint8Array. +export function encodeUTF8(s: string): Uint8Array { + var i = 0, + bytes = new Uint8Array(s.length * 4) + for (var ci = 0; ci !== s.length; ci++) { + var c = s.charCodeAt(ci) + if (c < 128) { + bytes[i++] = c + continue + } + if (c < 2048) { + bytes[i++] = (c >> 6) | 192 + } else { + if (c > 0xd7ff && c < 0xdc00) { + if (++ci >= s.length) throw new Error('UTF-8 encode: incomplete surrogate pair') + var c2 = s.charCodeAt(ci) + if (c2 < 0xdc00 || c2 > 0xdfff) + throw new Error( + 'UTF-8 encode: second surrogate character 0x' + + c2.toString(16) + + ' at index ' + + ci + + ' out of range' + ) + c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff) + bytes[i++] = (c >> 18) | 240 + bytes[i++] = ((c >> 12) & 63) | 128 + } else bytes[i++] = (c >> 12) | 224 + bytes[i++] = ((c >> 6) & 63) | 128 + } + bytes[i++] = (c & 63) | 128 + } + return bytes.subarray(0, i) +} + +// Unmarshals a string from an Uint8Array. +export function decodeUTF8(bytes: Uint8Array): string { + var i = 0, + s = '' + while (i < bytes.length) { + var c = bytes[i++] + if (c > 127) { + if (c > 191 && c < 224) { + if (i >= bytes.length) throw new Error('UTF-8 decode: incomplete 2-byte sequence') + c = ((c & 31) << 6) | (bytes[i++] & 63) + } else if (c > 223 && c < 240) { + if (i + 1 >= bytes.length) throw new Error('UTF-8 decode: incomplete 3-byte sequence') + c = ((c & 15) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) + } else if (c > 239 && c < 248) { + if (i + 2 >= bytes.length) throw new Error('UTF-8 decode: incomplete 4-byte sequence') + c = ((c & 7) << 18) | ((bytes[i++] & 63) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63) + } else throw new Error('UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1)) + } + if (c <= 0xffff) s += String.fromCharCode(c) + else if (c <= 0x10ffff) { + c -= 0x10000 + s += String.fromCharCode((c >> 10) | 0xd800) + s += String.fromCharCode((c & 0x3ff) | 0xdc00) + } else throw new Error('UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach') + } + return s +} diff --git a/port/js/tests/messgen.test.js b/port/js/tests/messgen.test.js index 02d6eeb..bec7de6 100644 --- a/port/js/tests/messgen.test.js +++ b/port/js/tests/messgen.test.js @@ -1,6 +1,9 @@ 'use strict'; -import {Buffer, Struct, HEADER_STRUCT, initializeMessages} from '../src/messgen.js'; +import {initializeMessages} from '../src/messgen.ts'; +import {Struct} from "../src/Struct.ts"; +import {HEADER_STRUCT} from "../src/HEADER_STRUCT.ts"; +import {Buffer} from "../src/Buffer.ts"; describe('Serialization deserialization tests', () => { it('Basic types', () => { diff --git a/port/js/tests/utf8.test.js b/port/js/tests/utf8.test.js index ea231d4..927fab0 100644 --- a/port/js/tests/utf8.test.js +++ b/port/js/tests/utf8.test.js @@ -1,6 +1,6 @@ 'use strict' -import { encodeUTF8, decodeUTF8 } from '../src/utf8.js' +import { encodeUTF8, decodeUTF8 } from '../src/utf8.ts' describe('UTF8 function test', () => { it('Encoding decoding test', () => { diff --git a/port/js/vite.config.js b/port/js/vite.config.js index 00f2b32..4a6309a 100644 --- a/port/js/vite.config.js +++ b/port/js/vite.config.js @@ -7,7 +7,7 @@ const OUTPUT_NAME = `dist/messgen` export default defineConfig({ build: { lib: { - entry: 'src/messgen.js', + entry: 'src/messgen.ts', name: pkg.name, fileName: `messgen` From 4a59c22402d7dca3ae53bf2877b45651472260ec Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Mon, 15 Apr 2024 19:54:23 +0400 Subject: [PATCH 21/23] remove MSG_ prefix --- port/js/src/messgen.ts | 78 ++++++++++++++++++++---------------------- port/js/src/types.ts | 26 ++------------ 2 files changed, 40 insertions(+), 64 deletions(-) diff --git a/port/js/src/messgen.ts b/port/js/src/messgen.ts index 5f9ad6c..926aed6 100644 --- a/port/js/src/messgen.ts +++ b/port/js/src/messgen.ts @@ -1,8 +1,6 @@ -'use strict'; - -import {Struct} from "./Struct.ts"; -import {HEADER_STRUCT} from "./HEADER_STRUCT.ts"; -import {Schema, Messages} from "./messgen.js"; +import { Struct } from "./Struct"; +import { HEADER_STRUCT } from "./HEADER_STRUCT"; +import { Messages, SchemaObj, IName } from "./types"; /** @@ -10,44 +8,42 @@ import {Schema, Messages} from "./messgen.js"; * @param {*} messagesJson - Array of messages schemas * @param {*} headerSchema - message header schema */ -export function initializeMessages( - messagesJson: Record, - headerSchema?: Schema +export function initializeMessages( + messagesJson: Record, + headerSchema?: SchemaObj ): Messages { - - let res = { - __id__: [], - __name__: [], - HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT - }; - - for (let m of getKeysWithSortById(messagesJson)) { - - let name = m.trim(), - messageObj = messagesJson[m], - msg = "MSG_" + name.toUpperCase(), - id = messageObj.id; - - if (!res.__id__[id]) { - let msg_struct = new Struct(messageObj, res); - - res.__id__[id] = msg_struct; - res.__name__[id] = m.trim(); - res[msg] = msg_struct; - res[name] = msg_struct; - - } else { - console.warn(`Warning: message ${ id } ${ msg } already exists.`); - } + + let res = { + __id__: [], + __name__: [], + HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT + } as unknown as Messages; + + for (let m of getKeysWithSortById(messagesJson)) { + + let name = m.trim() as KEYS; + let messageObj = messagesJson[m]; + let id = messageObj.id; + + if (!res.__id__[id]) { + let msg_struct = new Struct(messageObj, res); + + res.__id__[id] = msg_struct; + res.__name__[id] = name + res[name] = msg_struct; + + } else { + console.warn(`Warning: message ${id} ${name} already exists.`); } - - return res; + } + + return res; } -const getKeysWithSortById = (obj) => { - let keys = Object.keys(obj); - keys.sort((a, b) => { - return obj[a].id - obj[b].id; - }); - return keys; +const getKeysWithSortById = (obj: Record): KEYS[] => { + let keys = Object.keys(obj) as KEYS[]; + keys.sort((a, b) => { + return obj[a].id - obj[b].id; + }); + return keys; } diff --git a/port/js/src/types.ts b/port/js/src/types.ts index 8bcb222..8368eda 100644 --- a/port/js/src/types.ts +++ b/port/js/src/types.ts @@ -12,13 +12,12 @@ export type SchemaObj = { } -export type Messages = { +export type Messages = { __id__: Struct[] __name__: KEYS[] + HEADER_STRUCT: Struct } & - Record & - addPrefixToObject>, 'MSG_'> & - Record; + Record export type Obj = Record; @@ -65,22 +64,3 @@ type SubType = `${ArrayDynamicSize | ArrayFixSize}` | ''; export type IType = `${IName | IPrimitiveType}${SubType}${SubType}${SubType}` -/* - ____,-------------------------------,____ - \ | HELPERS | / - /___|-------------------------------|___\ - -*/ - - -// https://stackoverflow.com/questions/71824852/convert-typescript-object-keys-to-uppercase -// All string-type keys in the object, and then uppercased -type UppercaseStringKeys = Uppercase>; -// An object consisting of the above keys with the same values from the original object -type UppercaseObjectKeys = { - [x in UppercaseStringKeys]: x extends string ? T[Lowercase] : T[x]; -}; -// https://stackoverflow.com/questions/57510388/define-prefix-for-object-keys-using-types-in-typescript -type addPrefixToObject = { - [K in keyof T as K extends string ? `${P}${K}` : never]: T[K] -} From 7fbfae1159179aedfc63d11fdecb6a0f186a7375 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Wed, 17 Apr 2024 15:25:03 +0400 Subject: [PATCH 22/23] Update package dependencies and refactor type naming conventions across the codebase Update TypeScript definitions, add test UI script, and refactor code for consistency --- port/js/babel.config.js | 3 - port/js/docs/shema.drawio.svg | 4 + port/js/jest.config.js | 8 - port/js/package-lock.json | 311 +++++++++++++++++++++++++ port/js/package.json | 3 + port/js/src/Buffer.ts | 8 +- port/js/src/HEADER_STRUCT.ts | 10 +- port/js/src/Struct.ts | 6 +- port/js/src/constants.ts | 48 ++-- port/js/src/messgen.ts | 3 +- port/js/src/parseType.ts | 116 +++++++--- port/js/src/types.ts | 32 +-- port/js/tests/calcSize.test.ts | 180 +++++++++++++++ port/js/tests/data/flat_struct.bin | Bin 0 -> 77 bytes port/js/tests/data/flat_struct.json | 11 + port/js/tests/messgen.test.js | 4 +- port/js/tests/parseType.test.ts | 338 ++++++++++++++++++++++++++++ port/js/tsconfig.json | 125 ++++++++++ 18 files changed, 1111 insertions(+), 99 deletions(-) delete mode 100644 port/js/babel.config.js create mode 100644 port/js/docs/shema.drawio.svg delete mode 100644 port/js/jest.config.js create mode 100644 port/js/tests/calcSize.test.ts create mode 100644 port/js/tests/data/flat_struct.bin create mode 100644 port/js/tests/data/flat_struct.json create mode 100644 port/js/tests/parseType.test.ts create mode 100644 port/js/tsconfig.json diff --git a/port/js/babel.config.js b/port/js/babel.config.js deleted file mode 100644 index 6ab438e..0000000 --- a/port/js/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: ['@babel/preset-env'] -} diff --git a/port/js/docs/shema.drawio.svg b/port/js/docs/shema.drawio.svg new file mode 100644 index 0000000..72eda9b --- /dev/null +++ b/port/js/docs/shema.drawio.svg @@ -0,0 +1,4 @@ + + + +
Struct
Struct
constructor(schema: SchemaObj, includeMessages?: Messages<string>)
constructor(schema: SchemaObj, includeMessages?: Messages<string>)
id: IId
id: IId
schema: SchemaObj
schema: SchemaObj
fields: FieldStruct
fields: FieldStruct
_includeMessages?: Messages<string>
_includeMessages?: Messages<string>
Buffer
Buffer
_dataView: DataView;
_dataView: DataView;
_dynamicOffset: number;
_dynamicOffset: number;
_includeMessages?: Messages<string>
_includeMessages?: Messages<string>
 constructor(arrayBuffer: ArrayBufferLike)
 constructor(arrayBuffer: ArrayBufferLike)
 deserialize: (struct: Struct, offset: number = 0, sizeOffset: number = 0)=> Obj
 deserialize: (struct: Struct, offset: number = 0, sizeOffset: number = 0)=> Obj
Messgen
Messgen
constructor(%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%26lt%3Bspan%20style%3D%26quot%3Btext-align%3A%20center%3B%26quot%3B%26gt%3B%26lt%3Bspan%20style%3D%26quot%3Bfont-weight%3A%20400%3B%26quot%3B%26gt%3Bdeserialize%3A%20(data%3A%20ArrayBufferLike)%3D%26amp%3Bgt%3B%26lt%3B%2Fspan%26gt%3B%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BspacingLeft%3D4%3BspacingRight%3D4%3Boverflow%3Dhidden%3Bpoints%3D%5B%5B0%2C0.5%5D%2C%5B1%2C0.5%5D%5D%3BportConstraint%3Deastwest%3Brotatable%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontStyle%3D1%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%2250%22%20y%3D%22350%22%20width%3D%22260%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E  messagesJson: Record<KEYS, SchemaObj>,

  headerSchema?: SchemaObj  messagesJson: Record<KEYS, SchemaObj>,
  headerSchema?: SchemaObj
)
constructor(%3CmxGraphModel%3E%3Croot%3E%3CmxCel...
_includeMessages?: Messages<string>
_includeMessages?: Messages<string>
deserialize: (data: ArrayBufferLike) => Obj[]
deserialize: (data: ArrayBufferLike) => Obj[]
serialize: (data: Obj) =>  ArrayBufferLike
serialize: (data: Obj) =>  ArrayBufferLike
DataSerializer
DataSerializer
serialize
serialize
_dataView: DataView;
_dataView: DataView;
calcSize
calcSize
writeDataView
writeDataView
serializeObj
serializeObj
Text is not SVG - cannot display
\ No newline at end of file diff --git a/port/js/jest.config.js b/port/js/jest.config.js deleted file mode 100644 index a1c7a58..0000000 --- a/port/js/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('jest').Config} */ -const config = { - transform: { - '\\.js?$': 'babel-jest' - } -} - -module.exports = config diff --git a/port/js/package-lock.json b/port/js/package-lock.json index 7fe0bce..8111c70 100644 --- a/port/js/package-lock.json +++ b/port/js/package-lock.json @@ -10,8 +10,10 @@ "license": "ISC", "devDependencies": { "@rollup/plugin-terser": "^0.4.4", + "@vitest/ui": "^1.5.0", "prettier": "3.2.5", "tinybench": "^2.7.0", + "typescript": "^5.4.5", "vite": "^5.2.8", "vitest": "^1.5.0" } @@ -454,6 +456,47 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@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, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, "node_modules/@rollup/plugin-terser": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", @@ -732,6 +775,27 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/ui": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.5.0.tgz", + "integrity": "sha512-ETcToK2TzICf/Oartvt19IH7yR4oCs8GrQk5hRhZ5oZFaSdDHTh6o3EdzyxOaY24NZ20cXYYNGjj1se/5vHfFg==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.5.0", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.5.0" + } + }, "node_modules/@vitest/utils": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.0.tgz", @@ -789,6 +853,18 @@ "node": "*" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -939,6 +1015,55 @@ "@types/estree": "^1.0.0" } }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -962,6 +1087,48 @@ "node": "*" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1017,6 +1184,28 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mlly": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", @@ -1029,6 +1218,15 @@ "ufo": "^1.3.2" } }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1098,6 +1296,18 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pkg-types": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", @@ -1166,6 +1376,26 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1181,6 +1411,16 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "3.28.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", @@ -1199,6 +1439,29 @@ "fsevents": "~2.3.2" } }, + "node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1255,6 +1518,20 @@ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/smob": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", @@ -1361,6 +1638,27 @@ "node": ">=14.0.0" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -1370,6 +1668,19 @@ "node": ">=4" } }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/ufo": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", diff --git a/port/js/package.json b/port/js/package.json index d112c46..d4e4463 100644 --- a/port/js/package.json +++ b/port/js/package.json @@ -7,6 +7,7 @@ "scripts": { "build": "vite build", "test": "vitest", + "test-ui": "vitest --watch --ui", "prettier": "prettier --write \"src/**/*.js\" \"tests/**/*.js\" \"*.js\"", "gen": "python3 ../../messgen-generate.py --basedir ../../tests/messages --protocol messgen/test_proto --protocol messgen/messgen_test --protocol another_proto --outdir ./tests", "gen-json": "npm run gen -- --lang json", @@ -19,8 +20,10 @@ "license": "ISC", "devDependencies": { "@rollup/plugin-terser": "^0.4.4", + "@vitest/ui": "^1.5.0", "prettier": "3.2.5", "tinybench": "^2.7.0", + "typescript": "^5.4.5", "vite": "^5.2.8", "vitest": "^1.5.0" } diff --git a/port/js/src/Buffer.ts b/port/js/src/Buffer.ts index 655c8b9..8434977 100644 --- a/port/js/src/Buffer.ts +++ b/port/js/src/Buffer.ts @@ -25,7 +25,7 @@ export class Buffer { // TODO: перенести в модуль messages // а модуль messages генерализировать - static deserialize(messages, data, headerStruct = HEADER_STRUCT, includeMessages?: Messages) { + static deserialize(messages, data: ArrayBufferLike, headerStruct = HEADER_STRUCT, includeMessages?: Messages) { let res = []; let buf = new Buffer(data); let cur = 0; @@ -125,9 +125,9 @@ export class Buffer { let sk = schemaFields[k], type = sk.type; - if (includeMessages && includeMessages[type]) { + if (includeMessages && includeMessages.__messages__[type]) { arr[k] = { - 'value': Buffer.createValueArray(includeMessages[type].fields, obj[sk.name], includeMessages), + 'value': Buffer.createValueArray(includeMessages.__messages__[type].fields, obj[sk.name], includeMessages), 'type': type } } else { @@ -162,7 +162,7 @@ export class Buffer { return Buffer.serialize(arr, includeMessages); } - static writeDataView(fields: FieldStruct[], dataView, includeMessages?: Messages, offset: number = 0) { + static writeDataView(fields: FieldStruct[], dataView: DataView, includeMessages?: Messages, offset: number = 0) { for (let i = 0, len = fields.length; i < len; i++) { diff --git a/port/js/src/HEADER_STRUCT.ts b/port/js/src/HEADER_STRUCT.ts index 950201d..eb68d51 100644 --- a/port/js/src/HEADER_STRUCT.ts +++ b/port/js/src/HEADER_STRUCT.ts @@ -1,12 +1,12 @@ -import {Struct} from "./Struct.js"; +import { Struct } from "./Struct.js"; import { SchemaObj } from "./types"; export const HEADER_STRUCT = new Struct({ id: 0, fields: [ - { 'name': "seq", 'type': "Uint32" }, - { 'name': "cls", 'type': "Uint8" }, - { 'name': "msg_id", 'type': "Uint8" }, - { 'name': "size", 'type': "Uint32" } + { 'name': "seq", 'type': "uint32" }, + { 'name': "cls", 'type': "uint8" }, + { 'name': "msg_id", 'type': "uint8" }, + { 'name': "size", 'type': "uint32" } ] } satisfies SchemaObj); diff --git a/port/js/src/Struct.ts b/port/js/src/Struct.ts index f7333f2..fda2a3f 100644 --- a/port/js/src/Struct.ts +++ b/port/js/src/Struct.ts @@ -15,8 +15,8 @@ export type FieldStruct = Field & { export class Struct { _id = 0; _size = 0; - _fields: Array = null; - _schema = null; + _fields: Array | null = null; + _schema: SchemaObj | null = null; _includeMessages?: Messages constructor(schema: SchemaObj, includeMessages?: Messages) { @@ -40,7 +40,7 @@ export class Struct { return this._fields; } - set(schema) { + set(schema: SchemaObj) { if (schema) { this._id = schema.id || 0; this._size = 0; diff --git a/port/js/src/constants.ts b/port/js/src/constants.ts index 5aec60a..795c3ce 100644 --- a/port/js/src/constants.ts +++ b/port/js/src/constants.ts @@ -9,15 +9,7 @@ const DYNAMIC_SIZE_TYPE = "Uint32"; */ export const basicTypes = [ { - name: "Char", - size: 1, - read: (v, s) => String.fromCharCode(v.getInt8(s)), - write: (v, s, a) => { - v.setInt8(s, a ? a.toString().charCodeAt(0) : 0); - return 1; - } - }, { - name: "Int8", + name: "int8", size: 1, read: (v, s) => v.getInt8(s), write: (v, s, a) => { @@ -25,7 +17,7 @@ export const basicTypes = [ return 1; } }, { - name: "Uint8", + name: "uint8", size: 1, read: (v, s) => v.getUint8(s), write: (v, s, a) => { @@ -33,7 +25,7 @@ export const basicTypes = [ return 1; } }, { - name: "Int16", + name: "int16", size: 2, read: (v, s) => v.getInt16(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { @@ -41,7 +33,7 @@ export const basicTypes = [ return 2; } }, { - name: "Uint16", + name: "uint16", size: 2, read: (v, s) => v.getUint16(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { @@ -49,7 +41,7 @@ export const basicTypes = [ return 2; } }, { - name: "Int32", + name: "int32", size: 4, read: (v, s) => v.getInt32(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { @@ -57,7 +49,7 @@ export const basicTypes = [ return 4; } }, { - name: "Uint32", + name: "uint32", size: 4, read: (v, s) => v.getUint32(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { @@ -65,7 +57,7 @@ export const basicTypes = [ return 4; } }, { - name: "Int64", + name: "int64", size: 8, read: (v, s) => v.getBigInt64(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { @@ -73,7 +65,7 @@ export const basicTypes = [ return 8; } }, { - name: "Uint64", + name: "uint64", size: 8, read: (v, s) => v.getBigUint64(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { @@ -81,7 +73,7 @@ export const basicTypes = [ return 8; } }, { - name: "Float", + name: "float", size: 4, read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { @@ -89,7 +81,7 @@ export const basicTypes = [ return 4; } }, { - name: "Float32", + name: "float32", size: 4, read: (v, s) => v.getFloat32(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { @@ -97,7 +89,7 @@ export const basicTypes = [ return 4; } }, { - name: "Double", + name: "double", size: 8, read: (v, s) => v.getFloat64(s, IS_LITTLE_ENDIAN), write: (v, s, a) => { @@ -105,7 +97,15 @@ export const basicTypes = [ return 8; } }, { - name: "String", + name: "char", + size: 1, + read: (v, s) => String.fromCharCode(v.getInt8(s)), + write: (v, s, a) => { + v.setInt8(s, a ? a.toString().charCodeAt(0) : 0); + return 1; + } + }, { + name: "string", size: 4, read: (v, s) => decodeUTF8(new Uint8Array(v.buffer, s + 4, v.getUint32(s, IS_LITTLE_ENDIAN))), write: (v, s, a) => { @@ -120,16 +120,16 @@ export const basicTypes = [ ] satisfies { name: string; size: number; - read: (v: DataView, s: number) => any; - write: (v: DataView, s: number, a: any) => number; + read: (v: DataView, byteOffset: number) => any; + write: (v: DataView, byteOffset: number, value: any) => number; }[] export let typeIndex: Record = {} export let typeSize: number[] = [] -export let readFunc = [] -export let writeFunc = []; +export let readFunc: ((v: DataView, s: number) => any)[] = [] +export let writeFunc: ((v: DataView, s: number, a: any) => number)[] = []; for (let i = 0; i < basicTypes.length; i++) { let ti = basicTypes[i]; diff --git a/port/js/src/messgen.ts b/port/js/src/messgen.ts index 926aed6..d95a3c2 100644 --- a/port/js/src/messgen.ts +++ b/port/js/src/messgen.ts @@ -16,6 +16,7 @@ export function initializeMessages( let res = { __id__: [], __name__: [], + __messages__: {}, HEADER_STRUCT: headerSchema ? new Struct(headerSchema) : HEADER_STRUCT } as unknown as Messages; @@ -30,7 +31,7 @@ export function initializeMessages( res.__id__[id] = msg_struct; res.__name__[id] = name - res[name] = msg_struct; + res.__messages__[name] = msg_struct; } else { console.warn(`Warning: message ${id} ${name} already exists.`); diff --git a/port/js/src/parseType.ts b/port/js/src/parseType.ts index a5d800a..0284736 100644 --- a/port/js/src/parseType.ts +++ b/port/js/src/parseType.ts @@ -1,44 +1,94 @@ -import { typeIndex, typeSize } from "./constants"; -import { Messages } from "./types"; +import { Messages, IType, IPrimitiveType, IName } from "./types"; import { Struct } from "./Struct"; +import { typeSize, typeIndex } from "./constants"; -export type ParseType = { - struct?: Struct - typeIndex: number | Struct +export type ParseArrayType = + { + variant: 'array' + length: number | undefined + } + +export type ParseMapType = + { + variant: 'map' + keyType: IPrimitiveType | 'string' | undefined + keyTypeSize: number + } + + +export type ParsePrimitiveType = { + variant: 'primitive' + typeIndex: number typeSize: number - length: number - isArray: boolean - isComplex: boolean + wrapper: Array } -export function parseType(typeStr: string, includeMessages: Messages): ParseType { +export type ParseComplexType = + { + variant: 'complex' + struct: Struct + typeSize: number + wrapper: Array + } + +export function parseType(typeStr: IType, includeMessages: Messages): ParsePrimitiveType | ParseComplexType { + let wrapper: Array = []; + let basisType: IPrimitiveType | IName; + let typeParts = typeStr.split( + /[\[\{]/ig + ); - let a = typeStr.split('['), - name = a[0].trim(); + basisType = typeParts[0] as IPrimitiveType | IName; + for (let i = 1; i < typeParts.length; i++) { + let item = typeParts[i]; + let keyType: IPrimitiveType | undefined; + + if (item.includes(']')) { + let lengthStr = item.slice(0, -1); + let le + wrapper.push({ variant: 'array', length: lengthStr ? parseInt(lengthStr) : undefined }); + } + + if (item.includes('}')) { + keyType = item.slice(0, -1) as IPrimitiveType; + if (keyType === undefined) { + throw new Error(`Invalid map key type: ${item}`); + } + let keyTypeIndex = typeIndex[keyType] + if (keyTypeIndex === undefined) { + throw new Error(`Unknown type: ${keyType}, if is complex type you must define before the struct. `) + } + wrapper.push({ + variant: 'map', + keyType: keyType, + keyTypeSize: typeSize[keyTypeIndex] + }); + } + } - let size, isComplex = false; - let struct - let type: Struct | number = typeIndex[name]; + let type = typeIndex[basisType] - if (type != undefined) { - size = typeSize[type]; - } else if (includeMessages && includeMessages[name]) { - type = includeMessages[name]; - struct = includeMessages[name]; - size = type.size; - isComplex = true; + if (type !== undefined) { + return { + variant: 'primitive', + typeIndex: type, + typeSize: typeSize[type], + wrapper + } + + } else if (includeMessages) { + + let struct = includeMessages.__messages__[basisType]; + if (!struct) { + throw new Error(`Unknown type: ${basisType}, if is complex type you must define before the struct.`) + } + return { + variant: 'complex', + struct, + typeSize: struct.size, + wrapper + } } else { - throw new Error(`Unknown type: ${name}, if is complex type you must define before the struct. `); + throw new Error(`Unknown type: ${basisType}, if is complex type you must define before the struct. `) } - - let length = parseInt(a[1]); - - return { - struct, - typeIndex: type, - typeSize: size, - length: isNaN(length) ? 0 : length, - isArray: a.length === 2, - isComplex: isComplex - }; } diff --git a/port/js/src/types.ts b/port/js/src/types.ts index 8368eda..56b967c 100644 --- a/port/js/src/types.ts +++ b/port/js/src/types.ts @@ -15,9 +15,9 @@ export type SchemaObj = { export type Messages = { __id__: Struct[] __name__: KEYS[] + __messages__: Record HEADER_STRUCT: Struct -} & - Record +} export type Obj = Record; @@ -39,26 +39,26 @@ export type NominalStrict = Type & export type Nominal = Type & { [NominalType]?: NAME } -export type IName = Nominal<'Name', string> +export type IName = string export type IId = Nominal<'Id', number> export type IPrimitiveType = - "Int8" | - "Uint8" | - "Int16" | - "Uint16" | - "Int32" | - "Uint32" | - "Int64" | - "Uint64" | - "String" | - "Double" | - "Char" + "int8" | + "uint8" | + "int16" | + "uint16" | + "int32" | + "uint32" | + "int64" | + "uint64" | + "double" | + "string" | + "char" type ArrayDynamicSize = '[]'; type ArrayFixSize = `[${number}]`; -type MapType = `{${'string' | 'number'}`; +type MapType = `{${IPrimitiveType}}`; -type SubType = `${ArrayDynamicSize | ArrayFixSize}` | ''; +type SubType = `${ArrayDynamicSize | ArrayFixSize | MapType}` | ''; export type IType = `${IName | IPrimitiveType}${SubType}${SubType}${SubType}` diff --git a/port/js/tests/calcSize.test.ts b/port/js/tests/calcSize.test.ts new file mode 100644 index 0000000..89d9ffe --- /dev/null +++ b/port/js/tests/calcSize.test.ts @@ -0,0 +1,180 @@ +import { describe, it, expect } from 'vitest'; +import { FieldStruct } from "../src/Struct"; +import { Messages } from "../src/types"; +import { Buffer } from "../src/Buffer"; + +describe('calcSize', () => { + + // Calculates the correct size for a simple object with primitive types + it('должен правильно вычислять размер для простого объекта с примитивными типами', () => { + const fields: FieldStruct[] = [ + { + name: "name", + type: "string" + }, + { + name: "age", + type: "number" + }, + { + name: "address", + type: "string" + } + ]; + + const includeMessages: Messages = { + __id__: [], + __name__: [], + __messages__: {}, + HEADER_STRUCT: { + id: 0, + size: 0, + fields: [] + } + }; + + const size = Buffer.calcSize(fields, includeMessages); + + expect(size).toBe(12); + }); + + // Calculates the correct size for an object with nested complex types + it('должен правильно вычислять размер для объекта с вложенными сложными типами', () => { + const fields: FieldStruct[] = [ + { + name: "name", + type: "string" + }, + { + name: "age", + type: "number" + }, + { + name: "address", + type: "string" + }, + { + name: "nested", + type: "object", + fields: [ + { + name: "nestedName", + type: "string" + }, + { + name: "nestedAge", + type: "number" + } + ] + } + ]; + + const includeMessages: Messages = { + __id__: [], + __name__: [], + __messages__: {}, + HEADER_STRUCT: { + id: 0, + size: 0, + fields: [] + } + }; + + const size = Buffer.calcSize(fields, includeMessages); + + expect(size).toBe(24); + }); + + // Calculates the correct size for an empty object + it('должен правильно вычислять размер для пустого объекта', () => { + const fields: FieldStruct[] = []; + + const includeMessages: Messages = { + __id__: [], + __name__: [], + __messages__: {}, + HEADER_STRUCT: { + id: 0, + size: 0, + fields: [] + } + }; + + const size = Buffer.calcSize(fields, includeMessages); + + expect(size).toBe(0); + }); + + // Calculates the correct size for an object with null values + it('должен правильно вычислять размер для объекта со значениями null', () => { + const fields: FieldStruct[] = [ + { + name: "name", + type: "string", + value: null + }, + { + name: "age", + type: "number", + value: null + }, + { + name: "address", + type: "string", + value: null + } + ]; + + const includeMessages: Messages = { + __id__: [], + __name__: [], + __messages__: {}, + HEADER_STRUCT: { + id: 0, + size: 0, + fields: [] + } + }; + + const size = Buffer.calcSize(fields, includeMessages); + + expect(size).toBe(0); + }); + + // Calculates the correct size for an object with undefined values + it('должен правильно вычислять размер для объекта со значениями undefined', () => { + const fields: FieldStruct[] = [ + { + name: "name", + type: "string", + value: undefined + }, + { + name: "age", + type: "number", + value: undefined + }, + { + name: "address", + type: "string", + value: undefined + } + ]; + + const includeMessages: Messages = { + __id__: [], + __name__: [], + __messages__: {}, + HEADER_STRUCT: { + id: 0, + size: 0, + fields: [] + } + }; + + const size = Buffer.calcSize(fields, includeMessages); + + expect(size).toBe(0); + }); + +}); diff --git a/port/js/tests/data/flat_struct.bin b/port/js/tests/data/flat_struct.bin new file mode 100644 index 0000000000000000000000000000000000000000..95caa5ed22dc8f5f745a61aec4c71f397f823fb8 GIT binary patch literal 77 tcmb { + it('Basic types', () => { let srcStruct = new Struct({ @@ -336,6 +335,7 @@ describe('Serialization deserialization tests', () => { it('Complex type with dynamic array size', () => { + let schema = { "MyYZ": { id: 100, diff --git a/port/js/tests/parseType.test.ts b/port/js/tests/parseType.test.ts new file mode 100644 index 0000000..4965a38 --- /dev/null +++ b/port/js/tests/parseType.test.ts @@ -0,0 +1,338 @@ +import { parseType } from "../src/parseType"; +import { describe, it, expect } from 'vitest'; +import { Messages, IName, IType } from "../src/types"; +import { Struct } from "../src/Struct"; +import { HEADER_STRUCT } from "../src/HEADER_STRUCT"; + + +describe('parseType', () => { + let includeMessages = { + __id__: [0], + __name__: ['MyType'], + __messages__: { + MyType: new Struct( + { + id: 0, + fields: [ + { name: "field1", type: "int8" }, + { name: "field2", type: "int16" }, + { name: "field3", type: "int32" }, + { name: "field4", type: "int64" }, + { name: "field5", type: "int32" } + ] + } + ), + }, + HEADER_STRUCT: HEADER_STRUCT, + } as unknown as Messages; + + // Should correctly parse a simple primitive type without array notation + it('должен правильно разбирать простой примитивный тип без обозначения массива', () => { + // Given + const typeStr = 'int8'; + + // When + const result = parseType(typeStr, includeMessages); + + // Then + expect(result).toEqual({ + variant: 'primitive', + typeIndex: 0, + typeSize: 1, + wrapper: [] + }); + }); + + // Should correctly parse a simple primitive type with array notation + it('Должен правильно разбирать простой примитивный тип с использованием массивной нотации', () => { + const typeStr = 'int32[5]'; + + const result = parseType(typeStr, includeMessages); + + expect(result).toEqual( + { + variant: 'primitive', + typeIndex: 4, + typeSize: 4, + wrapper: [ + { + variant: 'array', + length: 5 + } + ] + } + ); + }); + // Should correctly parse a simple primitive type with array notation + it('Должен правильно разбирать простой примитивный тип с использованием массивной нотации вложеной в map', () => { + const typeStr = 'int32[5]{int32}'; + + const result = parseType(typeStr, includeMessages); + + expect(result).toEqual( + { + variant: 'primitive', + typeIndex: 4, + typeSize: 4, + wrapper: [ + { + variant: 'array', + length: 5 + }, + { + variant: 'map', + keyType: 'int32', + keyTypeSize: 4 + } + ] + } + ); + }); + + // Should throw an error when encountering an unknown type + it('должен выбросить ошибку, когда встречается неизвестный тип', () => { + expect(() => { + // @ts-ignore + parseType('UnknownType', includeMessages); + }).toThrowError('Unknown type: UnknownType, if is complex type you must define before the struct.'); + }); + + // Should correctly parse a simple complex type without array notation and with includeMessages parameter + it('Должен правильно разбирать простой сложный тип без обозначения массива и с параметром includeMessages', () => { + // Given + const typeStr = 'MyType' as IType; + + // When + const result = parseType(typeStr, includeMessages); + + // Then + expect(result).toEqual({ + variant: 'complex', + struct: includeMessages.__messages__.MyType, + typeSize: 19, + wrapper: [] + }); + }); + + // Should correctly parse a simple complex type with array notation and with includeMessages parameter + it('Должен правильно разбирать простой сложный тип с массивной нотацией и с параметром includeMessages', () => { + // Given + const typeStr = "MyType[10]"; + + // When + const result = parseType(typeStr, includeMessages); + + // Then + expect(result).toEqual({ + variant: 'complex', + struct: includeMessages.__messages__.MyType, + typeSize: 19, + wrapper: [ + { + variant: 'array', + length: 10 + } + ] + }); + }); + + // Should correctly parse a simple primitive type with array notation and a length of 0 + it('Должен правильно разбирать простой примитивный тип с массивной нотацией и длиной 0', () => { + const typeStr = "int8[0]"; + + + const result = parseType(typeStr, includeMessages); + + expect(result).toEqual({ + variant: 'primitive', + typeIndex: 0, + typeSize: 1, + wrapper: [ + { + variant: 'array', + length: 0 + } + ] + }); + }); + + // Should correctly parse a simple primitive type with array notation and a length of 1 + it('Должен правильно разбирать простой примитивный тип с массивной нотацией и длиной 1', () => { + // Given + const typeStr = "int8[1]"; + + // When + const result = parseType(typeStr, includeMessages); + + // Then + expect(result).toEqual({ + variant: 'primitive', + typeIndex: 0, + typeSize: 1, + wrapper: [ + { + variant: 'array', + length: 1 + } + ] + }); + }); + + // Should correctly parse a simple complex type with array notation and a length of 0 and with includeMessages parameter + it('Должен правильно разбирать простой сложный тип с массивной нотацией и длиной 0 и с параметром includeMessages', () => { + // Given + const typeStr = "MyType[0]"; + + // When + const result = parseType(typeStr, includeMessages); + + // Then + expect(result).toEqual({ + variant: 'complex', + struct: includeMessages.__messages__.MyType, + typeSize: 19, + wrapper: [ + { + variant: 'array', + length: 0 + } + ] + }); + }); + + // Should throw an error when encountering a complex type without includeMessages parameter + it('должен выбросить ошибку, когда встречается сложный тип без параметра includeMessages', () => { + expect(() => { + // @ts-ignore + parseType('ComplexType', undefined); + }).toThrowError('Unknown type: ComplexType, if is complex type you must define before the struct.'); + }); + + // Should correctly parse a simple complex type with array notation and a length of 1 and with includeMessages parameter + it('Должен правильно разбирать простой сложный тип с массивной нотацией и длиной 1 с параметром includeMessages', () => { + // Given + const typeStr = "MyType[1]"; + + // When + const result = parseType(typeStr, includeMessages); + + // Then + expect(result).toEqual({ + variant: 'complex', + struct: includeMessages.__messages__.MyType, + typeSize: 19, + wrapper: [ + { + variant: 'array', + length: 1 + } + ] + }); + }); + + // Should throw an error when encountering an unknown type with array notation + it('должен выбросить ошибку, когда встречается неизвестный тип с использованием массивной нотации', () => { + // Given + const typeStr = "UnknownType[5]"; + + + // When + const parseTypeWrapper = () => parseType(typeStr, includeMessages); + + // Then + expect(parseTypeWrapper).toThrowError("Unknown type: UnknownType, if is complex type you must define before the struct."); + }); + + + // Should correctly parse a simple complex type with array notation and with a SubType and with includeMessages parameter + it('Должен правильно разбирать простой сложный тип с массивной нотацией и с подтипом и с параметром includeMessages', () => { + // Given + const typeStr = "MyType[10][20][30]"; + + // When + const result = parseType(typeStr, includeMessages); + + // Then + expect(result).toEqual({ + variant: 'complex', + struct: includeMessages.__messages__.MyType, + typeSize: 19, + wrapper: [ + { + variant: 'array', + length: 10 + }, + { + variant: 'array', + length: 20 + }, + { + variant: 'array', + length: 30 + } + ] + }); + }); + it('должен выбросить ошибку, когда встречается неизвестный тип', () => { + // Given + const typeStr = 'int32[5]{invalidType}'; + + // Then + expect(() => { + // When + parseType(typeStr, includeMessages); + }).toThrowError(`Unknown type: invalidType, if is complex type you must define before the struct.`); + }); + + it('Должен правильно разбирать сложный тип с несколькими массивными и картографическими обозначениями', () => { + const typeStr = 'MyType[10]{int32}[5]'; + + const result = parseType(typeStr, includeMessages); + + expect(result).toEqual({ + variant: 'complex', + struct: includeMessages.__messages__.MyType, + typeSize: 19, + wrapper: [ + { + variant: 'array', + length: 10 + }, + { + variant: 'map', + keyType: 'int32', + keyTypeSize: 4 + }, + { + variant: 'array', + length: 5 + } + ] + }); + }); + + it('Должен правильно разбирать простой примитивный тип с использованием массивной нотации вложеной в map', () => { + const typeStr = 'int32[5]{int32}'; + + const result = parseType(typeStr, includeMessages); + + expect(result).toEqual( + { + variant: 'primitive', + typeIndex: 4, + typeSize: 4, + wrapper: [ + { + variant: 'array', + length: 5 + }, + { + variant: 'map', + keyType: 'int32', + keyTypeSize: 4 + } + ] + } + ); + }); +}); diff --git a/port/js/tsconfig.json b/port/js/tsconfig.json new file mode 100644 index 0000000..88fc239 --- /dev/null +++ b/port/js/tsconfig.json @@ -0,0 +1,125 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2020", + /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", + /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true, + /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declarationMap": true, + /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, + /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, + /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, + /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true, + /* Skip type checking all .d.ts files. */ + "include": [ + "src", + "node_modules/vitest/globals.d.ts", + ], +// "exclude": [ +//// "node_modules", +// "**/*.spec.ts" +// ] + } +} From b2a8a344742fa1bb10dbc921ae3c12e59916d2a7 Mon Sep 17 00:00:00 2001 From: Kirill Baldin Date: Wed, 17 Apr 2024 17:07:51 +0400 Subject: [PATCH 23/23] Update package dependencies and refactor type naming conventions across the codebase Update TypeScript definitions, add test UI script, and refactor code for consistency Standardize test descriptions and expand type definitions in JS implementation - Standardize English test descriptions in `parseType.test.ts` for consistency. Standardize test descriptions and improve parsing tests in JS implementation --- port/js/tests/data/flat_struct.bin | Bin 77 -> 0 bytes port/js/tests/data/flat_struct.json | 11 ----- port/js/tests/parseType.test.ts | 46 +++++++----------- .../typed_array_dynamic_message.yaml | 28 ----------- .../messgen_test/typed_array_message.yaml | 29 ----------- 5 files changed, 17 insertions(+), 97 deletions(-) delete mode 100644 port/js/tests/data/flat_struct.bin delete mode 100644 port/js/tests/data/flat_struct.json delete mode 100644 tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml delete mode 100644 tests/messages/messgen/messgen_test/typed_array_message.yaml diff --git a/port/js/tests/data/flat_struct.bin b/port/js/tests/data/flat_struct.bin deleted file mode 100644 index 95caa5ed22dc8f5f745a61aec4c71f397f823fb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77 tcmb { HEADER_STRUCT: HEADER_STRUCT, } as unknown as Messages; - // Should correctly parse a simple primitive type without array notation - it('должен правильно разбирать простой примитивный тип без обозначения массива', () => { + it('Should correctly parse a simple primitive type without array notation', () => { // Given const typeStr = 'int8'; @@ -43,8 +42,7 @@ describe('parseType', () => { }); }); - // Should correctly parse a simple primitive type with array notation - it('Должен правильно разбирать простой примитивный тип с использованием массивной нотации', () => { + it('Should correctly parse a simple primitive type with array notation', () => { const typeStr = 'int32[5]'; const result = parseType(typeStr, includeMessages); @@ -63,8 +61,7 @@ describe('parseType', () => { } ); }); - // Should correctly parse a simple primitive type with array notation - it('Должен правильно разбирать простой примитивный тип с использованием массивной нотации вложеной в map', () => { + it('Should correctly parse a simple primitive type with array notation', () => { const typeStr = 'int32[5]{int32}'; const result = parseType(typeStr, includeMessages); @@ -89,16 +86,14 @@ describe('parseType', () => { ); }); - // Should throw an error when encountering an unknown type - it('должен выбросить ошибку, когда встречается неизвестный тип', () => { + it('Should throw an error when encountering an unknown type', () => { expect(() => { // @ts-ignore parseType('UnknownType', includeMessages); }).toThrowError('Unknown type: UnknownType, if is complex type you must define before the struct.'); }); - // Should correctly parse a simple complex type without array notation and with includeMessages parameter - it('Должен правильно разбирать простой сложный тип без обозначения массива и с параметром includeMessages', () => { + it('Should correctly parse a simple complex type without array notation and with includeMessages parameter', () => { // Given const typeStr = 'MyType' as IType; @@ -114,8 +109,7 @@ describe('parseType', () => { }); }); - // Should correctly parse a simple complex type with array notation and with includeMessages parameter - it('Должен правильно разбирать простой сложный тип с массивной нотацией и с параметром includeMessages', () => { + it('Should correctly parse a simple complex type with array notation and with includeMessages parameter', () => { // Given const typeStr = "MyType[10]"; @@ -136,8 +130,7 @@ describe('parseType', () => { }); }); - // Should correctly parse a simple primitive type with array notation and a length of 0 - it('Должен правильно разбирать простой примитивный тип с массивной нотацией и длиной 0', () => { + it('Should correctly parse a simple primitive type with array notation and a length of 0', () => { const typeStr = "int8[0]"; @@ -156,8 +149,8 @@ describe('parseType', () => { }); }); - // Should correctly parse a simple primitive type with array notation and a length of 1 - it('Должен правильно разбирать простой примитивный тип с массивной нотацией и длиной 1', () => { + // + it('Must correctly parse a simple primitive type with array notation and length 1', () => { // Given const typeStr = "int8[1]"; @@ -178,8 +171,7 @@ describe('parseType', () => { }); }); - // Should correctly parse a simple complex type with array notation and a length of 0 and with includeMessages parameter - it('Должен правильно разбирать простой сложный тип с массивной нотацией и длиной 0 и с параметром includeMessages', () => { + it('Should correctly parse a simple complex type with array notation and a length of 0 and with includeMessages parameter', () => { // Given const typeStr = "MyType[0]"; @@ -200,16 +192,14 @@ describe('parseType', () => { }); }); - // Should throw an error when encountering a complex type without includeMessages parameter - it('должен выбросить ошибку, когда встречается сложный тип без параметра includeMessages', () => { + it('Should throw an error when encountering a complex type without includeMessages parameter', () => { expect(() => { // @ts-ignore parseType('ComplexType', undefined); }).toThrowError('Unknown type: ComplexType, if is complex type you must define before the struct.'); }); - // Should correctly parse a simple complex type with array notation and a length of 1 and with includeMessages parameter - it('Должен правильно разбирать простой сложный тип с массивной нотацией и длиной 1 с параметром includeMessages', () => { + it('Should correctly parse a simple complex type with array notation and a length of 1 and with includeMessages parameter', () => { // Given const typeStr = "MyType[1]"; @@ -230,8 +220,7 @@ describe('parseType', () => { }); }); - // Should throw an error when encountering an unknown type with array notation - it('должен выбросить ошибку, когда встречается неизвестный тип с использованием массивной нотации', () => { + it('Should throw an error when encountering an unknown type with array notation', () => { // Given const typeStr = "UnknownType[5]"; @@ -244,8 +233,7 @@ describe('parseType', () => { }); - // Should correctly parse a simple complex type with array notation and with a SubType and with includeMessages parameter - it('Должен правильно разбирать простой сложный тип с массивной нотацией и с подтипом и с параметром includeMessages', () => { + it('Should correctly parse a simple complex type with array notation and with a SubType and with includeMessages parameter', () => { // Given const typeStr = "MyType[10][20][30]"; @@ -273,7 +261,7 @@ describe('parseType', () => { ] }); }); - it('должен выбросить ошибку, когда встречается неизвестный тип', () => { + it('should throw an error when an unknown type is encountered', () => { // Given const typeStr = 'int32[5]{invalidType}'; @@ -284,7 +272,7 @@ describe('parseType', () => { }).toThrowError(`Unknown type: invalidType, if is complex type you must define before the struct.`); }); - it('Должен правильно разбирать сложный тип с несколькими массивными и картографическими обозначениями', () => { + it('Must correctly parse complex type with multiple massive and cartographic notations', () => { const typeStr = 'MyType[10]{int32}[5]'; const result = parseType(typeStr, includeMessages); @@ -311,7 +299,7 @@ describe('parseType', () => { }); }); - it('Должен правильно разбирать простой примитивный тип с использованием массивной нотации вложеной в map', () => { + it('Must correctly parse a simple primitive type using array notation nested in map', () => { const typeStr = 'int32[5]{int32}'; const result = parseType(typeStr, includeMessages); diff --git a/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml b/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml deleted file mode 100644 index 1f1728a..0000000 --- a/tests/messages/messgen/messgen_test/typed_array_dynamic_message.yaml +++ /dev/null @@ -1,28 +0,0 @@ -id: 14 -fields: - - name: type_Int8 - type: int8[] - - - name: type_Uint8 - type: uint8[] - - - name: type_Int16 - type: int16[] - - - name: type_Uint16 - type: uint16[] - - - name: type_Int32 - type: int32[] - - - name: type_Uint32 - type: uint32[] - - - name: type_Int64 - type: int64[] - - - name: type_Uint64 - type: uint64[] - - - name: type_Char - type: char diff --git a/tests/messages/messgen/messgen_test/typed_array_message.yaml b/tests/messages/messgen/messgen_test/typed_array_message.yaml deleted file mode 100644 index 5305358..0000000 --- a/tests/messages/messgen/messgen_test/typed_array_message.yaml +++ /dev/null @@ -1,29 +0,0 @@ -id: 15 -fields: - - name: type_Int8 - type: int8[100] - - - name: type_Uint8 - type: uint8[100] - - - name: type_Int16 - type: int16[100] - - - name: type_Uint16 - type: uint16[100] - - - name: type_Int32 - type: int32[100] - - - name: type_Uint32 - type: uint32[100] - - - name: type_Int64 - type: int64[100] - - - name: type_Uint64 - type: uint64[100] - - - - name: type_Char - type: char