From 4ee0e889612a6ce6557d336b4365143d6e301559 Mon Sep 17 00:00:00 2001 From: Chia Automation Date: Wed, 15 May 2024 20:04:55 +0000 Subject: [PATCH 01/24] chore: Updating npm dev dependencies --- package-lock.json | 935 +++++++++++++++++++++++----------------------- package.json | 24 +- 2 files changed, 489 insertions(+), 470 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb0c3988..32dd2e4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cadt", - "version": "1.7.13", + "version": "1.7.14", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cadt", - "version": "1.7.13", + "version": "1.7.14", "dependencies": { "@babel/eslint-parser": "^7.23.10", "async-mutex": "^0.4.1", @@ -39,39 +39,31 @@ "cadt": "build/server.js" }, "devDependencies": { - "@babel/cli": "^7.24.1", - "@babel/core": "^7.24.4", + "@babel/cli": "^7.24.5", + "@babel/core": "^7.24.5", "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/preset-env": "^7.24.4", + "@babel/preset-env": "^7.24.5", "@babel/register": "^7.23.7", - "@commitlint/cli": "^19.2.1", - "@commitlint/config-conventional": "^19.1.0", - "babel-plugin-module-resolver": "^5.0.0", - "chai": "^5.1.0", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", + "babel-plugin-module-resolver": "^5.0.2", + "chai": "^5.1.1", "chai-http": "^4.4.0", - "eslint": "^8.57.0", + "eslint": "^9.2.0", "eslint-plugin-es": "^4.1.0", - "eslint-plugin-mocha": "^10.4.1", + "eslint-plugin-mocha": "^10.4.3", "husky": "^9.0.11", "mocha": "^10.4.0", - "semver": "^7.6.0", - "sinon": "^17.0.1", + "semver": "^7.6.2", + "sinon": "^18.0.0", "socket.io-client": "^4.7.5", "standard-version": "^9.5.0", - "supertest": "^6.3.4" + "supertest": "^7.0.0" }, "engines": { "node": ">=16.13" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -85,9 +77,9 @@ } }, "node_modules/@babel/cli": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.1.tgz", - "integrity": "sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.5.tgz", + "integrity": "sha512-2qg1mYtJRsOOWF6IUwLP5jI42P8Cc0hQ5TmnjLrik/4DKouO8dFJN80HEz81VmVeUs97yuuf3vQ/9j7Elrcjlg==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -134,20 +126,20 @@ } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -171,9 +163,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz", + "integrity": "sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -184,7 +176,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/semver": { @@ -196,11 +188,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -257,19 +249,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -315,9 +307,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -362,12 +354,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -385,15 +377,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -415,9 +407,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -458,11 +450,11 @@ } }, "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==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -481,11 +473,11 @@ } }, "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==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -500,9 +492,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } @@ -516,38 +508,38 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", + "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.23.0", + "@babel/template": "^7.24.0", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -557,9 +549,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -568,13 +560,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -944,12 +936,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -992,18 +984,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -1030,12 +1022,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1349,15 +1341,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1399,12 +1391,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1416,12 +1408,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1447,14 +1439,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1572,12 +1564,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1650,16 +1642,16 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", @@ -1686,12 +1678,12 @@ "@babel/plugin-transform-async-generator-functions": "^7.24.3", "@babel/plugin-transform-async-to-generator": "^7.24.1", "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-block-scoping": "^7.24.5", "@babel/plugin-transform-class-properties": "^7.24.1", "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-transform-dotall-regex": "^7.24.1", "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-transform-dynamic-import": "^7.24.1", @@ -1711,13 +1703,13 @@ "@babel/plugin-transform-new-target": "^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-object-super": "^7.24.1", "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-transform-property-literals": "^7.24.1", "@babel/plugin-transform-regenerator": "^7.24.1", "@babel/plugin-transform-reserved-words": "^7.24.1", @@ -1725,7 +1717,7 @@ "@babel/plugin-transform-spread": "^7.24.1", "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", "@babel/plugin-transform-unicode-escapes": "^7.24.1", "@babel/plugin-transform-unicode-property-regex": "^7.24.1", "@babel/plugin-transform-unicode-regex": "^7.24.1", @@ -1793,9 +1785,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1824,18 +1816,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1844,12 +1836,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1865,13 +1857,13 @@ } }, "node_modules/@commitlint/cli": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.2.1.tgz", - "integrity": "sha512-cbkYUJsLqRomccNxvoJTyv5yn0bSy05BBizVyIcLACkRbVUqYorC351Diw/XFSWC/GtpwiwT2eOvQgFZa374bg==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", + "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", "dev": true, "dependencies": { - "@commitlint/format": "^19.0.3", - "@commitlint/lint": "^19.1.0", + "@commitlint/format": "^19.3.0", + "@commitlint/lint": "^19.2.2", "@commitlint/load": "^19.2.0", "@commitlint/read": "^19.2.1", "@commitlint/types": "^19.0.3", @@ -1886,9 +1878,9 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.1.0.tgz", - "integrity": "sha512-KIKD2xrp6Uuk+dcZVj3++MlzIr/Su6zLE8crEDQCZNvWHNQSeeGbzOlNtsR32TUy6H3JbP7nWgduAHCaiGQ6EA==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -1938,9 +1930,9 @@ } }, "node_modules/@commitlint/format": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.0.3.tgz", - "integrity": "sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", + "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -1963,9 +1955,9 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.0.3.tgz", - "integrity": "sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", + "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -1976,12 +1968,12 @@ } }, "node_modules/@commitlint/lint": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.1.0.tgz", - "integrity": "sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", + "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^19.0.3", + "@commitlint/is-ignored": "^19.2.2", "@commitlint/parse": "^19.0.3", "@commitlint/rules": "^19.0.3", "@commitlint/types": "^19.0.3" @@ -2185,14 +2177,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", + "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2200,7 +2192,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2222,14 +2214,11 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2240,23 +2229,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", + "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@gar/promisify": { @@ -2279,11 +2257,11 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -2308,6 +2286,18 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" }, + "node_modules/@humanwhocodes/retry": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz", + "integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", @@ -2506,9 +2496,9 @@ "dev": true }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, "node_modules/@tootallnate/once": { "version": "1.1.2", @@ -2520,9 +2510,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz", - "integrity": "sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==", + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", "dev": true }, "node_modules/@types/conventional-commits-parser": { @@ -2573,9 +2563,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", - "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2607,14 +2597,9 @@ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" }, "node_modules/@types/validator": { - "version": "13.11.9", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", - "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "version": "13.11.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", + "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==" }, "node_modules/abbrev": { "version": "1.1.1", @@ -2697,15 +2682,15 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -2871,19 +2856,16 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/babel-plugin-module-resolver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.0.tgz", - "integrity": "sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz", + "integrity": "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg==", "dev": true, "dependencies": { - "find-babel-config": "^2.0.0", - "glob": "^8.0.3", + "find-babel-config": "^2.1.1", + "glob": "^9.3.3", "pkg-up": "^3.1.0", "reselect": "^4.1.7", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">= 16" + "resolve": "^1.22.8" } }, "node_modules/babel-plugin-module-resolver/node_modules/brace-expansion": { @@ -2896,44 +2878,55 @@ } }, "node_modules/babel-plugin-module-resolver/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/babel-plugin-module-resolver/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -2963,12 +2956,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3319,9 +3312,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001606", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz", - "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==", + "version": "1.0.30001618", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", + "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", "funding": [ { "type": "opencollective", @@ -3338,13 +3331,13 @@ ] }, "node_modules/chai": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.0.tgz", - "integrity": "sha512-kDZ7MZyM6Q1DhR9jy7dalKohXQ2yrlXkk59CR52aRKxJrobmlBNqnFQxX9xOX8w+4mz8SYlKJa/7D7ddltFXCw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, "dependencies": { "assertion-error": "^2.0.1", - "check-error": "^2.0.0", + "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" @@ -3373,9 +3366,9 @@ } }, "node_modules/chai-http/node_modules/qs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", - "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dev": true, "dependencies": { "side-channel": "^1.0.6" @@ -3410,9 +3403,9 @@ } }, "node_modules/check-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.0.0.tgz", - "integrity": "sha512-tjLAOBHKVxtPoHe/SA7kNOMvhCRdCJ3vETdeY0RuAc9popf+hyaSV6ZEg9hr4cpWF7jmo/JSWEnLDrnijS9Tog==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "engines": { "node": ">= 16" @@ -4698,9 +4691,9 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { "browserslist": "^4.23.0" @@ -5025,17 +5018,6 @@ "node": ">=0.3.1" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -5144,9 +5126,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.729", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz", - "integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==" + "version": "1.4.770", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.770.tgz", + "integrity": "sha512-ONwOsDiVvV07CMsyH4+dEaZ9L79HMH/ODHnDS3GkIhgNqdDHJN2C18kFb0fBj0RXpQywsPJl6k2Pqg1IY4r1ig==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5309,40 +5291,36 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz", + "integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "9.2.0", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.2.3", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -5356,7 +5334,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5382,9 +5360,9 @@ } }, "node_modules/eslint-plugin-mocha": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.1.tgz", - "integrity": "sha512-G85ALUgKaLzuEuHhoW3HVRgPTmia6njQC3qCG6CEvA8/Ja9PDZnRZOuzekMki+HaViEQXINuYsmhp5WR5/4MfA==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz", + "integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==", "dev": true, "dependencies": { "eslint-utils": "^3.0.0", @@ -5559,26 +5537,26 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5618,20 +5596,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5698,17 +5662,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -5721,27 +5674,27 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5954,14 +5907,14 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-stream-rotator": { @@ -6020,16 +5973,13 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-babel-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.0.0.tgz", - "integrity": "sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.1.1.tgz", + "integrity": "sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==", "dev": true, "dependencies": { - "json5": "^2.1.1", + "json5": "^2.2.3", "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" } }, "node_modules/find-cache-dir": { @@ -6082,16 +6032,15 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { @@ -6172,7 +6121,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==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -6646,6 +6596,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6713,11 +6664,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "devOptional": true }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -6996,9 +6942,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, "funding": { "type": "github", @@ -7040,6 +6986,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7286,9 +7233,9 @@ } }, "node_modules/joi": { - "version": "17.12.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.3.tgz", - "integrity": "sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==", + "version": "17.13.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", + "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -7708,9 +7655,9 @@ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/loupe": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.0.tgz", - "integrity": "sha512-qKl+FrLXUhFuHUoDJG7f8P8gEMHq9NFS0c6ghXG1J0rldmZFQZoNVv/vyirE9qwCIhWZDsvEFd1sbFu3GvRQFg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, "dependencies": { "get-func-name": "^2.0.1" @@ -8407,9 +8354,9 @@ } }, "node_modules/mysql2": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.3.tgz", - "integrity": "sha512-+ZaoF0llESUy7BffccHG+urErHcWPZ/WuzYAA9TEeLaDYyke3/3D+VQDzK9xzRnXpd0eMtRf0WNOeo4Q1Baung==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz", + "integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -8487,9 +8434,9 @@ "dev": true }, "node_modules/nise": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", - "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", + "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", @@ -8500,15 +8447,15 @@ } }, "node_modules/nise/node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", "dev": true }, "node_modules/node-abi": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.57.0.tgz", - "integrity": "sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==", + "version": "3.62.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz", + "integrity": "sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==", "dependencies": { "semver": "^7.3.5" }, @@ -8715,16 +8662,16 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -8833,6 +8780,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -8851,6 +8799,40 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -8892,9 +8874,9 @@ "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -9637,6 +9619,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "optional": true, "dependencies": { "glob": "^7.1.3" }, @@ -9710,12 +9693,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -9723,22 +9703,6 @@ "node": ">=10" } }, - "node_modules/semver/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==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/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/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -9786,9 +9750,9 @@ "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "node_modules/sequelize": { - "version": "6.37.2", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.2.tgz", - "integrity": "sha512-bnb7swGANONXCTrVyebpOOZssLwQrVkYX2tcC6qOIvH+P+OhsoMBi7c3GXI5bC+Z4b4tOl+kQy6yeqLCZ1YQAQ==", + "version": "6.37.3", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.3.tgz", + "integrity": "sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A==", "funding": [ { "type": "opencollective", @@ -10021,17 +9985,17 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sinon": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", - "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", + "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0", + "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "^11.2.2", "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.5", - "supports-color": "^7.2.0" + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" }, "funding": { "type": "opencollective", @@ -10187,9 +10151,9 @@ } }, "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "optional": true, "dependencies": { "ip-address": "^9.0.5", @@ -10647,6 +10611,7 @@ "version": "8.1.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", @@ -10675,16 +10640,62 @@ } }, "node_modules/supertest": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", - "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", + "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^9.0.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest/node_modules/formidable": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "dev": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/supertest/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/supertest/node_modules/superagent": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", "dev": true, "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", "methods": "^1.1.2", - "superagent": "^8.1.2" + "mime": "2.6.0", + "qs": "^6.11.0" }, "engines": { - "node": ">=6.4.0" + "node": ">=14.18.0" } }, "node_modules/supports-color": { @@ -10968,9 +10979,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "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, "peer": true, "bin": { @@ -11078,9 +11089,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "funding": [ { "type": "opencollective", @@ -11096,8 +11107,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -11155,9 +11166,9 @@ } }, "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { "node": ">= 0.10" } @@ -11289,6 +11300,14 @@ "@types/node": "*" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 497b74ee..c0765a34 100644 --- a/package.json +++ b/package.json @@ -59,26 +59,26 @@ "winston-daily-rotate-file": "^4.7.1" }, "devDependencies": { - "@babel/cli": "^7.24.1", - "@babel/core": "^7.24.4", + "@babel/cli": "^7.24.5", + "@babel/core": "^7.24.5", "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/preset-env": "^7.24.4", + "@babel/preset-env": "^7.24.5", "@babel/register": "^7.23.7", - "@commitlint/cli": "^19.2.1", - "@commitlint/config-conventional": "^19.1.0", - "babel-plugin-module-resolver": "^5.0.0", - "chai": "^5.1.0", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", + "babel-plugin-module-resolver": "^5.0.2", + "chai": "^5.1.1", "chai-http": "^4.4.0", - "eslint": "^8.57.0", + "eslint": "^9.2.0", "eslint-plugin-es": "^4.1.0", - "eslint-plugin-mocha": "^10.4.1", + "eslint-plugin-mocha": "^10.4.3", "husky": "^9.0.11", "mocha": "^10.4.0", - "semver": "^7.6.0", - "sinon": "^17.0.1", + "semver": "^7.6.2", + "sinon": "^18.0.0", "socket.io-client": "^4.7.5", "standard-version": "^9.5.0", - "supertest": "^6.3.4" + "supertest": "^7.0.0" }, "standard-version": { "skip": { From 97f47fe5140dfac5d62afd0e456cf6f964393f08 Mon Sep 17 00:00:00 2001 From: Chris Marslender Date: Fri, 17 May 2024 12:16:27 -0500 Subject: [PATCH 02/24] Add github actions to dependabot --- .github/dependabot.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index dfaf3c86..ef3be773 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,3 +6,11 @@ updates: interval: "weekly" day: "sunday" target-branch: "develop" + + - package-ecosystem: "github-actions" + directory: / + schedule: + interval: "weekly" + day: "tuesday" + open-pull-requests-limit: 10 + reviewers: ["cmmarslender", "Starttoaster", "pmaslana", "TheLastCicada"] From e3201f13131cde9d7f0d8b8804cccabb1e543b88 Mon Sep 17 00:00:00 2001 From: Chia Automation Date: Fri, 17 May 2024 17:27:20 +0000 Subject: [PATCH 03/24] Update dependabot --- .github/dependabot.yml | 50 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ef3be773..6ce1d1e9 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,11 +1,35 @@ +# This file is managed by the repo-content-updater project. Manual changes here will result in a PR to bring back +# inline with the upstream template, unless you remove the dependabot managed file property from the repo + version: 2 updates: - - package-ecosystem: "npm" - directory: "/" + - package-ecosystem: "gomod" + directory: / + schedule: + interval: "weekly" + day: "tuesday" + open-pull-requests-limit: 10 + labels: + - dependencies + - go + - "Changed" + reviewers: ["cmmarslender", "starttoaster"] + groups: + global: + patterns: + - "*" + + - package-ecosystem: "pip" + directory: / schedule: interval: "weekly" - day: "sunday" - target-branch: "develop" + day: "tuesday" + open-pull-requests-limit: 10 + labels: + - dependencies + - python + - "Changed" + reviewers: ["emlowe", "altendky"] - package-ecosystem: "github-actions" directory: / @@ -13,4 +37,20 @@ updates: interval: "weekly" day: "tuesday" open-pull-requests-limit: 10 - reviewers: ["cmmarslender", "Starttoaster", "pmaslana", "TheLastCicada"] + labels: + - dependencies + - github_actions + - "Changed" + reviewers: ["cmmarslender", "Starttoaster", "pmaslana"] + + - package-ecosystem: "npm" + directory: / + schedule: + interval: "weekly" + day: "tuesday" + open-pull-requests-limit: 10 + labels: + - dependencies + - javascript + - "Changed" + reviewers: ["cmmarslender", "emlowe"] From 478de3649d39752f6c6b328b6b6bea23fcc68b3d Mon Sep 17 00:00:00 2001 From: Michael Taylor Date: Tue, 21 May 2024 09:24:53 -0400 Subject: [PATCH 04/24] fix: use toBeProcessedIndex --- .../tasks/sync-registries_20240521092408.js | 450 ++++++++++++++++++ .../tasks/sync-registries_20240521092430.js | 450 ++++++++++++++++++ .../tasks/sync-registries_20240521092435.js | 450 ++++++++++++++++++ src/tasks/sync-registries.js | 4 +- 4 files changed, 1352 insertions(+), 2 deletions(-) create mode 100644 .history/src/tasks/sync-registries_20240521092408.js create mode 100644 .history/src/tasks/sync-registries_20240521092430.js create mode 100644 .history/src/tasks/sync-registries_20240521092435.js diff --git a/.history/src/tasks/sync-registries_20240521092408.js b/.history/src/tasks/sync-registries_20240521092408.js new file mode 100644 index 00000000..11d251d4 --- /dev/null +++ b/.history/src/tasks/sync-registries_20240521092408.js @@ -0,0 +1,450 @@ +import _ from 'lodash'; + +import { SimpleIntervalJob, Task } from 'toad-scheduler'; +import { Mutex } from 'async-mutex'; +import { Organization, Audit, ModelKeys, Staging, Meta } from '../models'; +import datalayer from '../datalayer'; +import { + decodeHex, + encodeHex, + optimizeAndSortKvDiff, +} from '../utils/datalayer-utils'; +import dotenv from 'dotenv'; +import { logger } from '../config/logger.cjs'; +import { sequelize, sequelizeMirror } from '../database'; +import { getConfig } from '../utils/config-loader'; +import { + assertDataLayerAvailable, + assertWalletIsSynced, +} from '../utils/data-assertions'; +import { mirrorDBEnabled } from '../database'; +import { + migrateToNewSync, + generateGenerationIndex, +} from '../utils/sync-migration-utils'; + +dotenv.config(); +const mutex = new Mutex(); +const CONFIG = getConfig().APP; + +const task = new Task('sync-registries', async () => { + if (!mutex.isLocked()) { + const releaseMutex = await mutex.acquire(); + try { + const hasMigratedToNewSyncMethod = await Meta.findOne({ + where: { metaKey: 'migratedToNewSync' }, + }); + + const hasMigratedToGenerationIndexSync = await Meta.findOne({ + where: { metaKey: 'migratedToIndexBasedSync' }, + }); + + if (hasMigratedToNewSyncMethod || CONFIG.USE_SIMULATOR) { + if (hasMigratedToGenerationIndexSync) { + await processJob(); + } else { + await generateGenerationIndex(); + } + } else { + await migrateToNewSync(); + } + } catch (error) { + logger.error(`Error during datasync: ${error.message}`); + + console.trace(error); + + // Log additional information if present in the error object + if (error.response && error.response.body) { + logger.error( + `Additional error details: ${JSON.stringify(error.response.body)}`, + ); + } + } finally { + releaseMutex(); + } + } +}); + +const job = new SimpleIntervalJob( + { + seconds: 10, + runImmediately: true, + }, + task, + { id: 'sync-registries', preventOverrun: true }, +); + +const processJob = async () => { + await assertDataLayerAvailable(); + await assertWalletIsSynced(); + + const organizations = await Organization.findAll({ + where: { subscribed: true }, + raw: true, + }); + + for (const organization of organizations) { + await syncOrganizationAudit(organization); + } +}; + +async function createTransaction(callback, afterCommitCallbacks) { + let result = null; + + let transaction; + let mirrorTransaction; + + try { + logger.info('Starting transaction'); + // Start a transaction + transaction = await sequelize.transaction(); + + if (mirrorDBEnabled()) { + mirrorTransaction = await sequelizeMirror.transaction(); + } + + // Execute the provided callback with the transaction + result = await callback(transaction, mirrorTransaction); + + // Commit the transaction if the callback completes without errors + await transaction.commit(); + + if (mirrorDBEnabled()) { + await mirrorTransaction.commit(); + } + + for (const afterCommitCallback of afterCommitCallbacks) { + await afterCommitCallback(); + } + + logger.info('Commited transaction'); + + return result; + } catch (error) { + // Roll back the transaction if an error occurs + if (transaction) { + logger.error('Rolling back transaction'); + console.error(error); + await transaction.rollback(); + } + } +} + +const tryParseJSON = (jsonString, defaultValue) => { + try { + return JSON.parse(jsonString); + } catch (error) { + return defaultValue; + } +}; + +const truncateStaging = async () => { + logger.info(`ATTEMPTING TO TRUNCATE STAGING TABLE`); + + let success = false; + let attempts = 0; + const maxAttempts = 5; // Set a maximum number of attempts to avoid infinite loops + + while (!success && attempts < maxAttempts) { + try { + await Staging.truncate(); + success = true; // If truncate succeeds, set success to true to exit the loop + logger.info('STAGING TABLE TRUNCATED SUCCESSFULLY'); + } catch (error) { + attempts++; + logger.error( + `TRUNCATION FAILED ON ATTEMPT ${attempts}: ${error.message}`, + ); + if (attempts < maxAttempts) { + logger.info('WAITING 1 SECOND BEFORE RETRYING...'); + await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait for 1 second + } else { + logger.error('MAXIMUM TRUNCATION ATTEMPTS REACHED, GIVING UP'); + } + } + } +}; + +const syncOrganizationAudit = async (organization) => { + try { + let afterCommitCallbacks = []; + + const homeOrg = await Organization.getHomeOrg(); + const rootHistory = await datalayer.getRootHistory(organization.registryId); + + if (!rootHistory.length) { + logger.info(`No root history found for ${organization.name}`); + return; + } + + let lastRootSaved; + + if (CONFIG.USE_SIMULATOR) { + console.log('USING MOCK ROOT HISTORY'); + lastRootSaved = rootHistory[0]; + lastRootSaved.rootHash = lastRootSaved.root_hash; + lastRootSaved.generation = 0; + } else { + lastRootSaved = await Audit.findOne({ + where: { registryId: organization.registryId }, + order: [['generation', 'DESC']], + raw: true, + }); + + if (lastRootSaved) { + // There was an oversight in the audit model where we named it onChainConfirmationTimeStamp but + // the RPC result calls in timestamp. This is a temporary fix to ensure that we can still sync + lastRootSaved.timestamp = Number( + lastRootSaved?.onchainConfirmationTimeStamp || 0, + ); + lastRootSaved.root_hash = lastRootSaved.rootHash; + } + } + + let currentGeneration = _.get(rootHistory, '[0]'); + + if (!lastRootSaved) { + logger.info(`Syncing new registry ${organization.name}`); + + await Audit.create({ + orgUid: organization.orgUid, + registryId: organization.registryId, + rootHash: currentGeneration.root_hash, + type: 'CREATE REGISTRY', + generation: 0, + change: null, + table: null, + onchainConfirmationTimeStamp: currentGeneration.timestamp.toString(), + }); + + // Destroy existing records for this singleton + // On a fresh db this does nothing, but when the audit table + // is reset this will ensure that this organizations registry data is + // cleaned up on both the local db and mirror db and ready to resync + await Promise.all( + Object.keys(ModelKeys).map(async (modelKey) => { + ModelKeys[modelKey].destroy({ + where: { + orgUid: organization.orgUid, + }, + }); + }), + ); + + return; + } else { + currentGeneration = lastRootSaved; + } + + const lastProcessedIndex = currentGeneration.generation; + logger.debug(`1 Last processed index: ${lastProcessedIndex}`); + + if (lastProcessedIndex > rootHistory.length) { + logger.error( + `Could not find root history for ${organization.name} with timestamp ${currentGeneration.timestamp}, something is wrong and the sync for this organization will be paused until this is resolved.`, + ); + } + + const rootHistoryZeroBasedCount = rootHistory.length - 1; + const syncRemaining = rootHistoryZeroBasedCount - lastProcessedIndex; + const isSynced = syncRemaining === 0; + + await Organization.update( + { + synced: isSynced, + sync_remaining: syncRemaining, + }, + { where: { orgUid: organization.orgUid } }, + ); + + if (process.env.NODE_ENV !== 'test' && isSynced) { + logger.debug(`3 Last processed index: ${lastProcessedIndex}`); + return; + } + + const toBeProcessedIndex = lastProcessedIndex + 1; + logger.debug(`3 Last processed index: ${lastProcessedIndex}`); + logger.debug(`4 To be processed index: ${toBeProcessedIndex}`); + + // Organization not synced, sync it + logger.info(' '); + logger.info( + `Syncing ${organization.name} generation ${toBeProcessedIndex}`, + ); + logger.info( + `${organization.name} is ${syncRemaining} DataLayer generations away from being fully synced.`, + ); + + if (!CONFIG.USE_SIMULATOR) { + await new Promise((resolve) => setTimeout(resolve, 30000)); + + const { sync_status } = await datalayer.getSyncStatus( + organization.registryId, + ); + + if (lastProcessedIndex > sync_status.generation) { + const warningMsg = [ + `No data found for ${organization.name} in the current datalayer generation.`, + `DataLayer not yet caught up to generation ${lastProcessedIndex}. The current processed generation is ${sync_status.generation}.`, + `This issue is often temporary and could be due to a lag in data propagation.`, + 'Syncing for this organization will be paused until this is resolved.', + 'For ongoing issues, please contact the organization.', + ].join(' '); + + logger.warn(warningMsg); + return; + } + } + + logger.debug(`5 Last processed index: ${lastProcessedIndex}`); + const root1 = _.get(rootHistory, `[${lastProcessedIndex}]`); + logger.debug(`6 To be processed index: ${toBeProcessedIndex}`); + const root2 = _.get(rootHistory, `[${toBeProcessedIndex}]`); + + logger.info(`ROOT 1 ${JSON.stringify(root1)}`); + logger.info(`ROOT 2', ${JSON.stringify(root2)}`); + + if (!_.get(root2, 'confirmed')) { + logger.info( + `Waiting for the latest root for ${organization.name} to confirm`, + ); + return; + } + + logger.debug(`7 Last processed index: ${lastProcessedIndex}`); + logger.debug(`8 To be processed index: ${toBeProcessedIndex}`); + + const kvDiff = await datalayer.getRootDiff( + organization.registryId, + root1.root_hash, + root2.root_hash, + ); + + const comment = kvDiff.filter( + (diff) => + (diff.key === encodeHex('comment') || + diff.key === `0x${encodeHex('comment')}`) && + diff.type === 'INSERT', + ); + + const author = kvDiff.filter( + (diff) => + (diff.key === encodeHex('author') || + diff.key === `0x${encodeHex('author')}`) && + diff.type === 'INSERT', + ); + + // This optimizedKvDiff will remove all the DELETES that have corresponding INSERTS + // This is because we treat INSERTS as UPSERTS and we can save time and reduce DB thrashing + // by not processing the DELETE for that record. + const optimizedKvDiff = optimizeAndSortKvDiff(kvDiff); + + const updateTransaction = async (transaction, mirrorTransaction) => { + logger.info( + `Syncing ${organization.name} generation ${toBeProcessedIndex}`, + ); + if (_.isEmpty(optimizedKvDiff)) { + const auditData = { + orgUid: organization.orgUid, + registryId: organization.registryId, + rootHash: root2.root_hash, + type: 'NO CHANGE', + table: null, + change: null, + onchainConfirmationTimeStamp: root2.timestamp, + generation: toBeProcessedIndex, + comment: '', + author: '', + }; + + await Audit.create(auditData, { transaction, mirrorTransaction }); + } else { + for (const diff of optimizedKvDiff) { + const key = decodeHex(diff.key); + const modelKey = key.split('|')[0]; + + const auditData = { + orgUid: organization.orgUid, + registryId: organization.registryId, + rootHash: root2.root_hash, + type: diff.type, + table: modelKey, + change: decodeHex(diff.value), + onchainConfirmationTimeStamp: root2.timestamp, + generation: toBeProcessedIndex, + comment: _.get( + tryParseJSON( + decodeHex(_.get(comment, '[0].value', encodeHex('{}'))), + ), + 'comment', + '', + ), + author: _.get( + tryParseJSON( + decodeHex(_.get(author, '[0].value', encodeHex('{}'))), + ), + 'author', + '', + ), + }; + + if (modelKey && Object.keys(ModelKeys).includes(modelKey)) { + const record = JSON.parse(decodeHex(diff.value)); + const primaryKeyValue = + record[ModelKeys[modelKey].primaryKeyAttributes[0]]; + + if (diff.type === 'INSERT') { + logger.info(`UPSERTING: ${modelKey} - ${primaryKeyValue}`); + + // Remove updatedAt fields if they exist + // This is because the db will update this field automatically and its not allowed to be null + delete record.updatedAt; + + // if createdAt is null, remove it, so that the db will update it automatically + // this field is also not allowed to be null + if (_.isNil(record.createdAt)) { + delete record.createdAt; + } + + await ModelKeys[modelKey].upsert(record, { + transaction, + mirrorTransaction, + }); + } else if (diff.type === 'DELETE') { + logger.info(`DELETING: ${modelKey} - ${primaryKeyValue}`); + await ModelKeys[modelKey].destroy({ + where: { + [ModelKeys[modelKey].primaryKeyAttributes[0]]: + primaryKeyValue, + }, + transaction, + mirrorTransaction, + }); + } + } + + // Create the Audit record + await Audit.create(auditData, { transaction, mirrorTransaction }); + await Organization.update( + { registryHash: root2.root_hash }, + { + where: { orgUid: organization.orgUid }, + transaction, + mirrorTransaction, + }, + ); + } + } + }; + + if (organization.orgUid === homeOrg?.orgUid) { + afterCommitCallbacks.push(truncateStaging); + } + + await createTransaction(updateTransaction, afterCommitCallbacks); + } catch (error) { + logger.error('Error syncing org audit', error); + } +}; + +export default job; diff --git a/.history/src/tasks/sync-registries_20240521092430.js b/.history/src/tasks/sync-registries_20240521092430.js new file mode 100644 index 00000000..a92c27f5 --- /dev/null +++ b/.history/src/tasks/sync-registries_20240521092430.js @@ -0,0 +1,450 @@ +import _ from 'lodash'; + +import { SimpleIntervalJob, Task } from 'toad-scheduler'; +import { Mutex } from 'async-mutex'; +import { Organization, Audit, ModelKeys, Staging, Meta } from '../models'; +import datalayer from '../datalayer'; +import { + decodeHex, + encodeHex, + optimizeAndSortKvDiff, +} from '../utils/datalayer-utils'; +import dotenv from 'dotenv'; +import { logger } from '../config/logger.cjs'; +import { sequelize, sequelizeMirror } from '../database'; +import { getConfig } from '../utils/config-loader'; +import { + assertDataLayerAvailable, + assertWalletIsSynced, +} from '../utils/data-assertions'; +import { mirrorDBEnabled } from '../database'; +import { + migrateToNewSync, + generateGenerationIndex, +} from '../utils/sync-migration-utils'; + +dotenv.config(); +const mutex = new Mutex(); +const CONFIG = getConfig().APP; + +const task = new Task('sync-registries', async () => { + if (!mutex.isLocked()) { + const releaseMutex = await mutex.acquire(); + try { + const hasMigratedToNewSyncMethod = await Meta.findOne({ + where: { metaKey: 'migratedToNewSync' }, + }); + + const hasMigratedToGenerationIndexSync = await Meta.findOne({ + where: { metaKey: 'migratedToIndexBasedSync' }, + }); + + if (hasMigratedToNewSyncMethod || CONFIG.USE_SIMULATOR) { + if (hasMigratedToGenerationIndexSync) { + await processJob(); + } else { + await generateGenerationIndex(); + } + } else { + await migrateToNewSync(); + } + } catch (error) { + logger.error(`Error during datasync: ${error.message}`); + + console.trace(error); + + // Log additional information if present in the error object + if (error.response && error.response.body) { + logger.error( + `Additional error details: ${JSON.stringify(error.response.body)}`, + ); + } + } finally { + releaseMutex(); + } + } +}); + +const job = new SimpleIntervalJob( + { + seconds: 10, + runImmediately: true, + }, + task, + { id: 'sync-registries', preventOverrun: true }, +); + +const processJob = async () => { + await assertDataLayerAvailable(); + await assertWalletIsSynced(); + + const organizations = await Organization.findAll({ + where: { subscribed: true }, + raw: true, + }); + + for (const organization of organizations) { + await syncOrganizationAudit(organization); + } +}; + +async function createTransaction(callback, afterCommitCallbacks) { + let result = null; + + let transaction; + let mirrorTransaction; + + try { + logger.info('Starting transaction'); + // Start a transaction + transaction = await sequelize.transaction(); + + if (mirrorDBEnabled()) { + mirrorTransaction = await sequelizeMirror.transaction(); + } + + // Execute the provided callback with the transaction + result = await callback(transaction, mirrorTransaction); + + // Commit the transaction if the callback completes without errors + await transaction.commit(); + + if (mirrorDBEnabled()) { + await mirrorTransaction.commit(); + } + + for (const afterCommitCallback of afterCommitCallbacks) { + await afterCommitCallback(); + } + + logger.info('Commited transaction'); + + return result; + } catch (error) { + // Roll back the transaction if an error occurs + if (transaction) { + logger.error('Rolling back transaction'); + console.error(error); + await transaction.rollback(); + } + } +} + +const tryParseJSON = (jsonString, defaultValue) => { + try { + return JSON.parse(jsonString); + } catch (error) { + return defaultValue; + } +}; + +const truncateStaging = async () => { + logger.info(`ATTEMPTING TO TRUNCATE STAGING TABLE`); + + let success = false; + let attempts = 0; + const maxAttempts = 5; // Set a maximum number of attempts to avoid infinite loops + + while (!success && attempts < maxAttempts) { + try { + await Staging.truncate(); + success = true; // If truncate succeeds, set success to true to exit the loop + logger.info('STAGING TABLE TRUNCATED SUCCESSFULLY'); + } catch (error) { + attempts++; + logger.error( + `TRUNCATION FAILED ON ATTEMPT ${attempts}: ${error.message}`, + ); + if (attempts < maxAttempts) { + logger.info('WAITING 1 SECOND BEFORE RETRYING...'); + await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait for 1 second + } else { + logger.error('MAXIMUM TRUNCATION ATTEMPTS REACHED, GIVING UP'); + } + } + } +}; + +const syncOrganizationAudit = async (organization) => { + try { + let afterCommitCallbacks = []; + + const homeOrg = await Organization.getHomeOrg(); + const rootHistory = await datalayer.getRootHistory(organization.registryId); + + if (!rootHistory.length) { + logger.info(`No root history found for ${organization.name}`); + return; + } + + let lastRootSaved; + + if (CONFIG.USE_SIMULATOR) { + console.log('USING MOCK ROOT HISTORY'); + lastRootSaved = rootHistory[0]; + lastRootSaved.rootHash = lastRootSaved.root_hash; + lastRootSaved.generation = 0; + } else { + lastRootSaved = await Audit.findOne({ + where: { registryId: organization.registryId }, + order: [['generation', 'DESC']], + raw: true, + }); + + if (lastRootSaved) { + // There was an oversight in the audit model where we named it onChainConfirmationTimeStamp but + // the RPC result calls in timestamp. This is a temporary fix to ensure that we can still sync + lastRootSaved.timestamp = Number( + lastRootSaved?.onchainConfirmationTimeStamp || 0, + ); + lastRootSaved.root_hash = lastRootSaved.rootHash; + } + } + + let currentGeneration = _.get(rootHistory, '[0]'); + + if (!lastRootSaved) { + logger.info(`Syncing new registry ${organization.name}`); + + await Audit.create({ + orgUid: organization.orgUid, + registryId: organization.registryId, + rootHash: currentGeneration.root_hash, + type: 'CREATE REGISTRY', + generation: 0, + change: null, + table: null, + onchainConfirmationTimeStamp: currentGeneration.timestamp.toString(), + }); + + // Destroy existing records for this singleton + // On a fresh db this does nothing, but when the audit table + // is reset this will ensure that this organizations registry data is + // cleaned up on both the local db and mirror db and ready to resync + await Promise.all( + Object.keys(ModelKeys).map(async (modelKey) => { + ModelKeys[modelKey].destroy({ + where: { + orgUid: organization.orgUid, + }, + }); + }), + ); + + return; + } else { + currentGeneration = lastRootSaved; + } + + const lastProcessedIndex = currentGeneration.generation; + logger.debug(`1 Last processed index: ${lastProcessedIndex}`); + + if (lastProcessedIndex > rootHistory.length) { + logger.error( + `Could not find root history for ${organization.name} with timestamp ${currentGeneration.timestamp}, something is wrong and the sync for this organization will be paused until this is resolved.`, + ); + } + + const rootHistoryZeroBasedCount = rootHistory.length - 1; + const syncRemaining = rootHistoryZeroBasedCount - lastProcessedIndex; + const isSynced = syncRemaining === 0; + + await Organization.update( + { + synced: isSynced, + sync_remaining: syncRemaining, + }, + { where: { orgUid: organization.orgUid } }, + ); + + if (process.env.NODE_ENV !== 'test' && isSynced) { + logger.debug(`3 Last processed index: ${lastProcessedIndex}`); + return; + } + + const toBeProcessedIndex = lastProcessedIndex + 1; + logger.debug(`3 Last processed index: ${lastProcessedIndex}`); + logger.debug(`4 To be processed index: ${toBeProcessedIndex}`); + + // Organization not synced, sync it + logger.info(' '); + logger.info( + `Syncing ${organization.name} generation ${toBeProcessedIndex}`, + ); + logger.info( + `${organization.name} is ${syncRemaining} DataLayer generations away from being fully synced.`, + ); + + if (!CONFIG.USE_SIMULATOR) { + await new Promise((resolve) => setTimeout(resolve, 30000)); + + const { sync_status } = await datalayer.getSyncStatus( + organization.registryId, + ); + + if (toBeProcessedIndex > sync_status.generation) { + const warningMsg = [ + `No data found for ${organization.name} in the current datalayer generation.`, + `DataLayer not yet caught up to generation ${lastProcessedIndex}. The current processed generation is ${sync_status.generation}.`, + `This issue is often temporary and could be due to a lag in data propagation.`, + 'Syncing for this organization will be paused until this is resolved.', + 'For ongoing issues, please contact the organization.', + ].join(' '); + + logger.warn(warningMsg); + return; + } + } + + logger.debug(`5 Last processed index: ${lastProcessedIndex}`); + const root1 = _.get(rootHistory, `[${lastProcessedIndex}]`); + logger.debug(`6 To be processed index: ${toBeProcessedIndex}`); + const root2 = _.get(rootHistory, `[${toBeProcessedIndex}]`); + + logger.info(`ROOT 1 ${JSON.stringify(root1)}`); + logger.info(`ROOT 2', ${JSON.stringify(root2)}`); + + if (!_.get(root2, 'confirmed')) { + logger.info( + `Waiting for the latest root for ${organization.name} to confirm`, + ); + return; + } + + logger.debug(`7 Last processed index: ${lastProcessedIndex}`); + logger.debug(`8 To be processed index: ${toBeProcessedIndex}`); + + const kvDiff = await datalayer.getRootDiff( + organization.registryId, + root1.root_hash, + root2.root_hash, + ); + + const comment = kvDiff.filter( + (diff) => + (diff.key === encodeHex('comment') || + diff.key === `0x${encodeHex('comment')}`) && + diff.type === 'INSERT', + ); + + const author = kvDiff.filter( + (diff) => + (diff.key === encodeHex('author') || + diff.key === `0x${encodeHex('author')}`) && + diff.type === 'INSERT', + ); + + // This optimizedKvDiff will remove all the DELETES that have corresponding INSERTS + // This is because we treat INSERTS as UPSERTS and we can save time and reduce DB thrashing + // by not processing the DELETE for that record. + const optimizedKvDiff = optimizeAndSortKvDiff(kvDiff); + + const updateTransaction = async (transaction, mirrorTransaction) => { + logger.info( + `Syncing ${organization.name} generation ${toBeProcessedIndex}`, + ); + if (_.isEmpty(optimizedKvDiff)) { + const auditData = { + orgUid: organization.orgUid, + registryId: organization.registryId, + rootHash: root2.root_hash, + type: 'NO CHANGE', + table: null, + change: null, + onchainConfirmationTimeStamp: root2.timestamp, + generation: toBeProcessedIndex, + comment: '', + author: '', + }; + + await Audit.create(auditData, { transaction, mirrorTransaction }); + } else { + for (const diff of optimizedKvDiff) { + const key = decodeHex(diff.key); + const modelKey = key.split('|')[0]; + + const auditData = { + orgUid: organization.orgUid, + registryId: organization.registryId, + rootHash: root2.root_hash, + type: diff.type, + table: modelKey, + change: decodeHex(diff.value), + onchainConfirmationTimeStamp: root2.timestamp, + generation: toBeProcessedIndex, + comment: _.get( + tryParseJSON( + decodeHex(_.get(comment, '[0].value', encodeHex('{}'))), + ), + 'comment', + '', + ), + author: _.get( + tryParseJSON( + decodeHex(_.get(author, '[0].value', encodeHex('{}'))), + ), + 'author', + '', + ), + }; + + if (modelKey && Object.keys(ModelKeys).includes(modelKey)) { + const record = JSON.parse(decodeHex(diff.value)); + const primaryKeyValue = + record[ModelKeys[modelKey].primaryKeyAttributes[0]]; + + if (diff.type === 'INSERT') { + logger.info(`UPSERTING: ${modelKey} - ${primaryKeyValue}`); + + // Remove updatedAt fields if they exist + // This is because the db will update this field automatically and its not allowed to be null + delete record.updatedAt; + + // if createdAt is null, remove it, so that the db will update it automatically + // this field is also not allowed to be null + if (_.isNil(record.createdAt)) { + delete record.createdAt; + } + + await ModelKeys[modelKey].upsert(record, { + transaction, + mirrorTransaction, + }); + } else if (diff.type === 'DELETE') { + logger.info(`DELETING: ${modelKey} - ${primaryKeyValue}`); + await ModelKeys[modelKey].destroy({ + where: { + [ModelKeys[modelKey].primaryKeyAttributes[0]]: + primaryKeyValue, + }, + transaction, + mirrorTransaction, + }); + } + } + + // Create the Audit record + await Audit.create(auditData, { transaction, mirrorTransaction }); + await Organization.update( + { registryHash: root2.root_hash }, + { + where: { orgUid: organization.orgUid }, + transaction, + mirrorTransaction, + }, + ); + } + } + }; + + if (organization.orgUid === homeOrg?.orgUid) { + afterCommitCallbacks.push(truncateStaging); + } + + await createTransaction(updateTransaction, afterCommitCallbacks); + } catch (error) { + logger.error('Error syncing org audit', error); + } +}; + +export default job; diff --git a/.history/src/tasks/sync-registries_20240521092435.js b/.history/src/tasks/sync-registries_20240521092435.js new file mode 100644 index 00000000..91004bb6 --- /dev/null +++ b/.history/src/tasks/sync-registries_20240521092435.js @@ -0,0 +1,450 @@ +import _ from 'lodash'; + +import { SimpleIntervalJob, Task } from 'toad-scheduler'; +import { Mutex } from 'async-mutex'; +import { Organization, Audit, ModelKeys, Staging, Meta } from '../models'; +import datalayer from '../datalayer'; +import { + decodeHex, + encodeHex, + optimizeAndSortKvDiff, +} from '../utils/datalayer-utils'; +import dotenv from 'dotenv'; +import { logger } from '../config/logger.cjs'; +import { sequelize, sequelizeMirror } from '../database'; +import { getConfig } from '../utils/config-loader'; +import { + assertDataLayerAvailable, + assertWalletIsSynced, +} from '../utils/data-assertions'; +import { mirrorDBEnabled } from '../database'; +import { + migrateToNewSync, + generateGenerationIndex, +} from '../utils/sync-migration-utils'; + +dotenv.config(); +const mutex = new Mutex(); +const CONFIG = getConfig().APP; + +const task = new Task('sync-registries', async () => { + if (!mutex.isLocked()) { + const releaseMutex = await mutex.acquire(); + try { + const hasMigratedToNewSyncMethod = await Meta.findOne({ + where: { metaKey: 'migratedToNewSync' }, + }); + + const hasMigratedToGenerationIndexSync = await Meta.findOne({ + where: { metaKey: 'migratedToIndexBasedSync' }, + }); + + if (hasMigratedToNewSyncMethod || CONFIG.USE_SIMULATOR) { + if (hasMigratedToGenerationIndexSync) { + await processJob(); + } else { + await generateGenerationIndex(); + } + } else { + await migrateToNewSync(); + } + } catch (error) { + logger.error(`Error during datasync: ${error.message}`); + + console.trace(error); + + // Log additional information if present in the error object + if (error.response && error.response.body) { + logger.error( + `Additional error details: ${JSON.stringify(error.response.body)}`, + ); + } + } finally { + releaseMutex(); + } + } +}); + +const job = new SimpleIntervalJob( + { + seconds: 10, + runImmediately: true, + }, + task, + { id: 'sync-registries', preventOverrun: true }, +); + +const processJob = async () => { + await assertDataLayerAvailable(); + await assertWalletIsSynced(); + + const organizations = await Organization.findAll({ + where: { subscribed: true }, + raw: true, + }); + + for (const organization of organizations) { + await syncOrganizationAudit(organization); + } +}; + +async function createTransaction(callback, afterCommitCallbacks) { + let result = null; + + let transaction; + let mirrorTransaction; + + try { + logger.info('Starting transaction'); + // Start a transaction + transaction = await sequelize.transaction(); + + if (mirrorDBEnabled()) { + mirrorTransaction = await sequelizeMirror.transaction(); + } + + // Execute the provided callback with the transaction + result = await callback(transaction, mirrorTransaction); + + // Commit the transaction if the callback completes without errors + await transaction.commit(); + + if (mirrorDBEnabled()) { + await mirrorTransaction.commit(); + } + + for (const afterCommitCallback of afterCommitCallbacks) { + await afterCommitCallback(); + } + + logger.info('Commited transaction'); + + return result; + } catch (error) { + // Roll back the transaction if an error occurs + if (transaction) { + logger.error('Rolling back transaction'); + console.error(error); + await transaction.rollback(); + } + } +} + +const tryParseJSON = (jsonString, defaultValue) => { + try { + return JSON.parse(jsonString); + } catch (error) { + return defaultValue; + } +}; + +const truncateStaging = async () => { + logger.info(`ATTEMPTING TO TRUNCATE STAGING TABLE`); + + let success = false; + let attempts = 0; + const maxAttempts = 5; // Set a maximum number of attempts to avoid infinite loops + + while (!success && attempts < maxAttempts) { + try { + await Staging.truncate(); + success = true; // If truncate succeeds, set success to true to exit the loop + logger.info('STAGING TABLE TRUNCATED SUCCESSFULLY'); + } catch (error) { + attempts++; + logger.error( + `TRUNCATION FAILED ON ATTEMPT ${attempts}: ${error.message}`, + ); + if (attempts < maxAttempts) { + logger.info('WAITING 1 SECOND BEFORE RETRYING...'); + await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait for 1 second + } else { + logger.error('MAXIMUM TRUNCATION ATTEMPTS REACHED, GIVING UP'); + } + } + } +}; + +const syncOrganizationAudit = async (organization) => { + try { + let afterCommitCallbacks = []; + + const homeOrg = await Organization.getHomeOrg(); + const rootHistory = await datalayer.getRootHistory(organization.registryId); + + if (!rootHistory.length) { + logger.info(`No root history found for ${organization.name}`); + return; + } + + let lastRootSaved; + + if (CONFIG.USE_SIMULATOR) { + console.log('USING MOCK ROOT HISTORY'); + lastRootSaved = rootHistory[0]; + lastRootSaved.rootHash = lastRootSaved.root_hash; + lastRootSaved.generation = 0; + } else { + lastRootSaved = await Audit.findOne({ + where: { registryId: organization.registryId }, + order: [['generation', 'DESC']], + raw: true, + }); + + if (lastRootSaved) { + // There was an oversight in the audit model where we named it onChainConfirmationTimeStamp but + // the RPC result calls in timestamp. This is a temporary fix to ensure that we can still sync + lastRootSaved.timestamp = Number( + lastRootSaved?.onchainConfirmationTimeStamp || 0, + ); + lastRootSaved.root_hash = lastRootSaved.rootHash; + } + } + + let currentGeneration = _.get(rootHistory, '[0]'); + + if (!lastRootSaved) { + logger.info(`Syncing new registry ${organization.name}`); + + await Audit.create({ + orgUid: organization.orgUid, + registryId: organization.registryId, + rootHash: currentGeneration.root_hash, + type: 'CREATE REGISTRY', + generation: 0, + change: null, + table: null, + onchainConfirmationTimeStamp: currentGeneration.timestamp.toString(), + }); + + // Destroy existing records for this singleton + // On a fresh db this does nothing, but when the audit table + // is reset this will ensure that this organizations registry data is + // cleaned up on both the local db and mirror db and ready to resync + await Promise.all( + Object.keys(ModelKeys).map(async (modelKey) => { + ModelKeys[modelKey].destroy({ + where: { + orgUid: organization.orgUid, + }, + }); + }), + ); + + return; + } else { + currentGeneration = lastRootSaved; + } + + const lastProcessedIndex = currentGeneration.generation; + logger.debug(`1 Last processed index: ${lastProcessedIndex}`); + + if (lastProcessedIndex > rootHistory.length) { + logger.error( + `Could not find root history for ${organization.name} with timestamp ${currentGeneration.timestamp}, something is wrong and the sync for this organization will be paused until this is resolved.`, + ); + } + + const rootHistoryZeroBasedCount = rootHistory.length - 1; + const syncRemaining = rootHistoryZeroBasedCount - lastProcessedIndex; + const isSynced = syncRemaining === 0; + + await Organization.update( + { + synced: isSynced, + sync_remaining: syncRemaining, + }, + { where: { orgUid: organization.orgUid } }, + ); + + if (process.env.NODE_ENV !== 'test' && isSynced) { + logger.debug(`3 Last processed index: ${lastProcessedIndex}`); + return; + } + + const toBeProcessedIndex = lastProcessedIndex + 1; + logger.debug(`3 Last processed index: ${lastProcessedIndex}`); + logger.debug(`4 To be processed index: ${toBeProcessedIndex}`); + + // Organization not synced, sync it + logger.info(' '); + logger.info( + `Syncing ${organization.name} generation ${toBeProcessedIndex}`, + ); + logger.info( + `${organization.name} is ${syncRemaining} DataLayer generations away from being fully synced.`, + ); + + if (!CONFIG.USE_SIMULATOR) { + await new Promise((resolve) => setTimeout(resolve, 30000)); + + const { sync_status } = await datalayer.getSyncStatus( + organization.registryId, + ); + + if (toBeProcessedIndex > sync_status.generation) { + const warningMsg = [ + `No data found for ${organization.name} in the current datalayer generation.`, + `DataLayer not yet caught up to generation ${toBeProcessedIndex}. The current processed generation is ${sync_status.generation}.`, + `This issue is often temporary and could be due to a lag in data propagation.`, + 'Syncing for this organization will be paused until this is resolved.', + 'For ongoing issues, please contact the organization.', + ].join(' '); + + logger.warn(warningMsg); + return; + } + } + + logger.debug(`5 Last processed index: ${lastProcessedIndex}`); + const root1 = _.get(rootHistory, `[${lastProcessedIndex}]`); + logger.debug(`6 To be processed index: ${toBeProcessedIndex}`); + const root2 = _.get(rootHistory, `[${toBeProcessedIndex}]`); + + logger.info(`ROOT 1 ${JSON.stringify(root1)}`); + logger.info(`ROOT 2', ${JSON.stringify(root2)}`); + + if (!_.get(root2, 'confirmed')) { + logger.info( + `Waiting for the latest root for ${organization.name} to confirm`, + ); + return; + } + + logger.debug(`7 Last processed index: ${lastProcessedIndex}`); + logger.debug(`8 To be processed index: ${toBeProcessedIndex}`); + + const kvDiff = await datalayer.getRootDiff( + organization.registryId, + root1.root_hash, + root2.root_hash, + ); + + const comment = kvDiff.filter( + (diff) => + (diff.key === encodeHex('comment') || + diff.key === `0x${encodeHex('comment')}`) && + diff.type === 'INSERT', + ); + + const author = kvDiff.filter( + (diff) => + (diff.key === encodeHex('author') || + diff.key === `0x${encodeHex('author')}`) && + diff.type === 'INSERT', + ); + + // This optimizedKvDiff will remove all the DELETES that have corresponding INSERTS + // This is because we treat INSERTS as UPSERTS and we can save time and reduce DB thrashing + // by not processing the DELETE for that record. + const optimizedKvDiff = optimizeAndSortKvDiff(kvDiff); + + const updateTransaction = async (transaction, mirrorTransaction) => { + logger.info( + `Syncing ${organization.name} generation ${toBeProcessedIndex}`, + ); + if (_.isEmpty(optimizedKvDiff)) { + const auditData = { + orgUid: organization.orgUid, + registryId: organization.registryId, + rootHash: root2.root_hash, + type: 'NO CHANGE', + table: null, + change: null, + onchainConfirmationTimeStamp: root2.timestamp, + generation: toBeProcessedIndex, + comment: '', + author: '', + }; + + await Audit.create(auditData, { transaction, mirrorTransaction }); + } else { + for (const diff of optimizedKvDiff) { + const key = decodeHex(diff.key); + const modelKey = key.split('|')[0]; + + const auditData = { + orgUid: organization.orgUid, + registryId: organization.registryId, + rootHash: root2.root_hash, + type: diff.type, + table: modelKey, + change: decodeHex(diff.value), + onchainConfirmationTimeStamp: root2.timestamp, + generation: toBeProcessedIndex, + comment: _.get( + tryParseJSON( + decodeHex(_.get(comment, '[0].value', encodeHex('{}'))), + ), + 'comment', + '', + ), + author: _.get( + tryParseJSON( + decodeHex(_.get(author, '[0].value', encodeHex('{}'))), + ), + 'author', + '', + ), + }; + + if (modelKey && Object.keys(ModelKeys).includes(modelKey)) { + const record = JSON.parse(decodeHex(diff.value)); + const primaryKeyValue = + record[ModelKeys[modelKey].primaryKeyAttributes[0]]; + + if (diff.type === 'INSERT') { + logger.info(`UPSERTING: ${modelKey} - ${primaryKeyValue}`); + + // Remove updatedAt fields if they exist + // This is because the db will update this field automatically and its not allowed to be null + delete record.updatedAt; + + // if createdAt is null, remove it, so that the db will update it automatically + // this field is also not allowed to be null + if (_.isNil(record.createdAt)) { + delete record.createdAt; + } + + await ModelKeys[modelKey].upsert(record, { + transaction, + mirrorTransaction, + }); + } else if (diff.type === 'DELETE') { + logger.info(`DELETING: ${modelKey} - ${primaryKeyValue}`); + await ModelKeys[modelKey].destroy({ + where: { + [ModelKeys[modelKey].primaryKeyAttributes[0]]: + primaryKeyValue, + }, + transaction, + mirrorTransaction, + }); + } + } + + // Create the Audit record + await Audit.create(auditData, { transaction, mirrorTransaction }); + await Organization.update( + { registryHash: root2.root_hash }, + { + where: { orgUid: organization.orgUid }, + transaction, + mirrorTransaction, + }, + ); + } + } + }; + + if (organization.orgUid === homeOrg?.orgUid) { + afterCommitCallbacks.push(truncateStaging); + } + + await createTransaction(updateTransaction, afterCommitCallbacks); + } catch (error) { + logger.error('Error syncing org audit', error); + } +}; + +export default job; diff --git a/src/tasks/sync-registries.js b/src/tasks/sync-registries.js index 11d251d4..91004bb6 100644 --- a/src/tasks/sync-registries.js +++ b/src/tasks/sync-registries.js @@ -282,10 +282,10 @@ const syncOrganizationAudit = async (organization) => { organization.registryId, ); - if (lastProcessedIndex > sync_status.generation) { + if (toBeProcessedIndex > sync_status.generation) { const warningMsg = [ `No data found for ${organization.name} in the current datalayer generation.`, - `DataLayer not yet caught up to generation ${lastProcessedIndex}. The current processed generation is ${sync_status.generation}.`, + `DataLayer not yet caught up to generation ${toBeProcessedIndex}. The current processed generation is ${sync_status.generation}.`, `This issue is often temporary and could be due to a lag in data propagation.`, 'Syncing for this organization will be paused until this is resolved.', 'For ongoing issues, please contact the organization.', From 33bc5d05178a0943213970b099a96c771a3ee0af Mon Sep 17 00:00:00 2001 From: Michael Taylor Date: Tue, 21 May 2024 09:27:59 -0400 Subject: [PATCH 05/24] fix: use toBeProcessedIndex --- .../tasks/sync-registries_20240521092408.js | 450 ------------------ .../tasks/sync-registries_20240521092430.js | 450 ------------------ .../tasks/sync-registries_20240521092435.js | 450 ------------------ 3 files changed, 1350 deletions(-) delete mode 100644 .history/src/tasks/sync-registries_20240521092408.js delete mode 100644 .history/src/tasks/sync-registries_20240521092430.js delete mode 100644 .history/src/tasks/sync-registries_20240521092435.js diff --git a/.history/src/tasks/sync-registries_20240521092408.js b/.history/src/tasks/sync-registries_20240521092408.js deleted file mode 100644 index 11d251d4..00000000 --- a/.history/src/tasks/sync-registries_20240521092408.js +++ /dev/null @@ -1,450 +0,0 @@ -import _ from 'lodash'; - -import { SimpleIntervalJob, Task } from 'toad-scheduler'; -import { Mutex } from 'async-mutex'; -import { Organization, Audit, ModelKeys, Staging, Meta } from '../models'; -import datalayer from '../datalayer'; -import { - decodeHex, - encodeHex, - optimizeAndSortKvDiff, -} from '../utils/datalayer-utils'; -import dotenv from 'dotenv'; -import { logger } from '../config/logger.cjs'; -import { sequelize, sequelizeMirror } from '../database'; -import { getConfig } from '../utils/config-loader'; -import { - assertDataLayerAvailable, - assertWalletIsSynced, -} from '../utils/data-assertions'; -import { mirrorDBEnabled } from '../database'; -import { - migrateToNewSync, - generateGenerationIndex, -} from '../utils/sync-migration-utils'; - -dotenv.config(); -const mutex = new Mutex(); -const CONFIG = getConfig().APP; - -const task = new Task('sync-registries', async () => { - if (!mutex.isLocked()) { - const releaseMutex = await mutex.acquire(); - try { - const hasMigratedToNewSyncMethod = await Meta.findOne({ - where: { metaKey: 'migratedToNewSync' }, - }); - - const hasMigratedToGenerationIndexSync = await Meta.findOne({ - where: { metaKey: 'migratedToIndexBasedSync' }, - }); - - if (hasMigratedToNewSyncMethod || CONFIG.USE_SIMULATOR) { - if (hasMigratedToGenerationIndexSync) { - await processJob(); - } else { - await generateGenerationIndex(); - } - } else { - await migrateToNewSync(); - } - } catch (error) { - logger.error(`Error during datasync: ${error.message}`); - - console.trace(error); - - // Log additional information if present in the error object - if (error.response && error.response.body) { - logger.error( - `Additional error details: ${JSON.stringify(error.response.body)}`, - ); - } - } finally { - releaseMutex(); - } - } -}); - -const job = new SimpleIntervalJob( - { - seconds: 10, - runImmediately: true, - }, - task, - { id: 'sync-registries', preventOverrun: true }, -); - -const processJob = async () => { - await assertDataLayerAvailable(); - await assertWalletIsSynced(); - - const organizations = await Organization.findAll({ - where: { subscribed: true }, - raw: true, - }); - - for (const organization of organizations) { - await syncOrganizationAudit(organization); - } -}; - -async function createTransaction(callback, afterCommitCallbacks) { - let result = null; - - let transaction; - let mirrorTransaction; - - try { - logger.info('Starting transaction'); - // Start a transaction - transaction = await sequelize.transaction(); - - if (mirrorDBEnabled()) { - mirrorTransaction = await sequelizeMirror.transaction(); - } - - // Execute the provided callback with the transaction - result = await callback(transaction, mirrorTransaction); - - // Commit the transaction if the callback completes without errors - await transaction.commit(); - - if (mirrorDBEnabled()) { - await mirrorTransaction.commit(); - } - - for (const afterCommitCallback of afterCommitCallbacks) { - await afterCommitCallback(); - } - - logger.info('Commited transaction'); - - return result; - } catch (error) { - // Roll back the transaction if an error occurs - if (transaction) { - logger.error('Rolling back transaction'); - console.error(error); - await transaction.rollback(); - } - } -} - -const tryParseJSON = (jsonString, defaultValue) => { - try { - return JSON.parse(jsonString); - } catch (error) { - return defaultValue; - } -}; - -const truncateStaging = async () => { - logger.info(`ATTEMPTING TO TRUNCATE STAGING TABLE`); - - let success = false; - let attempts = 0; - const maxAttempts = 5; // Set a maximum number of attempts to avoid infinite loops - - while (!success && attempts < maxAttempts) { - try { - await Staging.truncate(); - success = true; // If truncate succeeds, set success to true to exit the loop - logger.info('STAGING TABLE TRUNCATED SUCCESSFULLY'); - } catch (error) { - attempts++; - logger.error( - `TRUNCATION FAILED ON ATTEMPT ${attempts}: ${error.message}`, - ); - if (attempts < maxAttempts) { - logger.info('WAITING 1 SECOND BEFORE RETRYING...'); - await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait for 1 second - } else { - logger.error('MAXIMUM TRUNCATION ATTEMPTS REACHED, GIVING UP'); - } - } - } -}; - -const syncOrganizationAudit = async (organization) => { - try { - let afterCommitCallbacks = []; - - const homeOrg = await Organization.getHomeOrg(); - const rootHistory = await datalayer.getRootHistory(organization.registryId); - - if (!rootHistory.length) { - logger.info(`No root history found for ${organization.name}`); - return; - } - - let lastRootSaved; - - if (CONFIG.USE_SIMULATOR) { - console.log('USING MOCK ROOT HISTORY'); - lastRootSaved = rootHistory[0]; - lastRootSaved.rootHash = lastRootSaved.root_hash; - lastRootSaved.generation = 0; - } else { - lastRootSaved = await Audit.findOne({ - where: { registryId: organization.registryId }, - order: [['generation', 'DESC']], - raw: true, - }); - - if (lastRootSaved) { - // There was an oversight in the audit model where we named it onChainConfirmationTimeStamp but - // the RPC result calls in timestamp. This is a temporary fix to ensure that we can still sync - lastRootSaved.timestamp = Number( - lastRootSaved?.onchainConfirmationTimeStamp || 0, - ); - lastRootSaved.root_hash = lastRootSaved.rootHash; - } - } - - let currentGeneration = _.get(rootHistory, '[0]'); - - if (!lastRootSaved) { - logger.info(`Syncing new registry ${organization.name}`); - - await Audit.create({ - orgUid: organization.orgUid, - registryId: organization.registryId, - rootHash: currentGeneration.root_hash, - type: 'CREATE REGISTRY', - generation: 0, - change: null, - table: null, - onchainConfirmationTimeStamp: currentGeneration.timestamp.toString(), - }); - - // Destroy existing records for this singleton - // On a fresh db this does nothing, but when the audit table - // is reset this will ensure that this organizations registry data is - // cleaned up on both the local db and mirror db and ready to resync - await Promise.all( - Object.keys(ModelKeys).map(async (modelKey) => { - ModelKeys[modelKey].destroy({ - where: { - orgUid: organization.orgUid, - }, - }); - }), - ); - - return; - } else { - currentGeneration = lastRootSaved; - } - - const lastProcessedIndex = currentGeneration.generation; - logger.debug(`1 Last processed index: ${lastProcessedIndex}`); - - if (lastProcessedIndex > rootHistory.length) { - logger.error( - `Could not find root history for ${organization.name} with timestamp ${currentGeneration.timestamp}, something is wrong and the sync for this organization will be paused until this is resolved.`, - ); - } - - const rootHistoryZeroBasedCount = rootHistory.length - 1; - const syncRemaining = rootHistoryZeroBasedCount - lastProcessedIndex; - const isSynced = syncRemaining === 0; - - await Organization.update( - { - synced: isSynced, - sync_remaining: syncRemaining, - }, - { where: { orgUid: organization.orgUid } }, - ); - - if (process.env.NODE_ENV !== 'test' && isSynced) { - logger.debug(`3 Last processed index: ${lastProcessedIndex}`); - return; - } - - const toBeProcessedIndex = lastProcessedIndex + 1; - logger.debug(`3 Last processed index: ${lastProcessedIndex}`); - logger.debug(`4 To be processed index: ${toBeProcessedIndex}`); - - // Organization not synced, sync it - logger.info(' '); - logger.info( - `Syncing ${organization.name} generation ${toBeProcessedIndex}`, - ); - logger.info( - `${organization.name} is ${syncRemaining} DataLayer generations away from being fully synced.`, - ); - - if (!CONFIG.USE_SIMULATOR) { - await new Promise((resolve) => setTimeout(resolve, 30000)); - - const { sync_status } = await datalayer.getSyncStatus( - organization.registryId, - ); - - if (lastProcessedIndex > sync_status.generation) { - const warningMsg = [ - `No data found for ${organization.name} in the current datalayer generation.`, - `DataLayer not yet caught up to generation ${lastProcessedIndex}. The current processed generation is ${sync_status.generation}.`, - `This issue is often temporary and could be due to a lag in data propagation.`, - 'Syncing for this organization will be paused until this is resolved.', - 'For ongoing issues, please contact the organization.', - ].join(' '); - - logger.warn(warningMsg); - return; - } - } - - logger.debug(`5 Last processed index: ${lastProcessedIndex}`); - const root1 = _.get(rootHistory, `[${lastProcessedIndex}]`); - logger.debug(`6 To be processed index: ${toBeProcessedIndex}`); - const root2 = _.get(rootHistory, `[${toBeProcessedIndex}]`); - - logger.info(`ROOT 1 ${JSON.stringify(root1)}`); - logger.info(`ROOT 2', ${JSON.stringify(root2)}`); - - if (!_.get(root2, 'confirmed')) { - logger.info( - `Waiting for the latest root for ${organization.name} to confirm`, - ); - return; - } - - logger.debug(`7 Last processed index: ${lastProcessedIndex}`); - logger.debug(`8 To be processed index: ${toBeProcessedIndex}`); - - const kvDiff = await datalayer.getRootDiff( - organization.registryId, - root1.root_hash, - root2.root_hash, - ); - - const comment = kvDiff.filter( - (diff) => - (diff.key === encodeHex('comment') || - diff.key === `0x${encodeHex('comment')}`) && - diff.type === 'INSERT', - ); - - const author = kvDiff.filter( - (diff) => - (diff.key === encodeHex('author') || - diff.key === `0x${encodeHex('author')}`) && - diff.type === 'INSERT', - ); - - // This optimizedKvDiff will remove all the DELETES that have corresponding INSERTS - // This is because we treat INSERTS as UPSERTS and we can save time and reduce DB thrashing - // by not processing the DELETE for that record. - const optimizedKvDiff = optimizeAndSortKvDiff(kvDiff); - - const updateTransaction = async (transaction, mirrorTransaction) => { - logger.info( - `Syncing ${organization.name} generation ${toBeProcessedIndex}`, - ); - if (_.isEmpty(optimizedKvDiff)) { - const auditData = { - orgUid: organization.orgUid, - registryId: organization.registryId, - rootHash: root2.root_hash, - type: 'NO CHANGE', - table: null, - change: null, - onchainConfirmationTimeStamp: root2.timestamp, - generation: toBeProcessedIndex, - comment: '', - author: '', - }; - - await Audit.create(auditData, { transaction, mirrorTransaction }); - } else { - for (const diff of optimizedKvDiff) { - const key = decodeHex(diff.key); - const modelKey = key.split('|')[0]; - - const auditData = { - orgUid: organization.orgUid, - registryId: organization.registryId, - rootHash: root2.root_hash, - type: diff.type, - table: modelKey, - change: decodeHex(diff.value), - onchainConfirmationTimeStamp: root2.timestamp, - generation: toBeProcessedIndex, - comment: _.get( - tryParseJSON( - decodeHex(_.get(comment, '[0].value', encodeHex('{}'))), - ), - 'comment', - '', - ), - author: _.get( - tryParseJSON( - decodeHex(_.get(author, '[0].value', encodeHex('{}'))), - ), - 'author', - '', - ), - }; - - if (modelKey && Object.keys(ModelKeys).includes(modelKey)) { - const record = JSON.parse(decodeHex(diff.value)); - const primaryKeyValue = - record[ModelKeys[modelKey].primaryKeyAttributes[0]]; - - if (diff.type === 'INSERT') { - logger.info(`UPSERTING: ${modelKey} - ${primaryKeyValue}`); - - // Remove updatedAt fields if they exist - // This is because the db will update this field automatically and its not allowed to be null - delete record.updatedAt; - - // if createdAt is null, remove it, so that the db will update it automatically - // this field is also not allowed to be null - if (_.isNil(record.createdAt)) { - delete record.createdAt; - } - - await ModelKeys[modelKey].upsert(record, { - transaction, - mirrorTransaction, - }); - } else if (diff.type === 'DELETE') { - logger.info(`DELETING: ${modelKey} - ${primaryKeyValue}`); - await ModelKeys[modelKey].destroy({ - where: { - [ModelKeys[modelKey].primaryKeyAttributes[0]]: - primaryKeyValue, - }, - transaction, - mirrorTransaction, - }); - } - } - - // Create the Audit record - await Audit.create(auditData, { transaction, mirrorTransaction }); - await Organization.update( - { registryHash: root2.root_hash }, - { - where: { orgUid: organization.orgUid }, - transaction, - mirrorTransaction, - }, - ); - } - } - }; - - if (organization.orgUid === homeOrg?.orgUid) { - afterCommitCallbacks.push(truncateStaging); - } - - await createTransaction(updateTransaction, afterCommitCallbacks); - } catch (error) { - logger.error('Error syncing org audit', error); - } -}; - -export default job; diff --git a/.history/src/tasks/sync-registries_20240521092430.js b/.history/src/tasks/sync-registries_20240521092430.js deleted file mode 100644 index a92c27f5..00000000 --- a/.history/src/tasks/sync-registries_20240521092430.js +++ /dev/null @@ -1,450 +0,0 @@ -import _ from 'lodash'; - -import { SimpleIntervalJob, Task } from 'toad-scheduler'; -import { Mutex } from 'async-mutex'; -import { Organization, Audit, ModelKeys, Staging, Meta } from '../models'; -import datalayer from '../datalayer'; -import { - decodeHex, - encodeHex, - optimizeAndSortKvDiff, -} from '../utils/datalayer-utils'; -import dotenv from 'dotenv'; -import { logger } from '../config/logger.cjs'; -import { sequelize, sequelizeMirror } from '../database'; -import { getConfig } from '../utils/config-loader'; -import { - assertDataLayerAvailable, - assertWalletIsSynced, -} from '../utils/data-assertions'; -import { mirrorDBEnabled } from '../database'; -import { - migrateToNewSync, - generateGenerationIndex, -} from '../utils/sync-migration-utils'; - -dotenv.config(); -const mutex = new Mutex(); -const CONFIG = getConfig().APP; - -const task = new Task('sync-registries', async () => { - if (!mutex.isLocked()) { - const releaseMutex = await mutex.acquire(); - try { - const hasMigratedToNewSyncMethod = await Meta.findOne({ - where: { metaKey: 'migratedToNewSync' }, - }); - - const hasMigratedToGenerationIndexSync = await Meta.findOne({ - where: { metaKey: 'migratedToIndexBasedSync' }, - }); - - if (hasMigratedToNewSyncMethod || CONFIG.USE_SIMULATOR) { - if (hasMigratedToGenerationIndexSync) { - await processJob(); - } else { - await generateGenerationIndex(); - } - } else { - await migrateToNewSync(); - } - } catch (error) { - logger.error(`Error during datasync: ${error.message}`); - - console.trace(error); - - // Log additional information if present in the error object - if (error.response && error.response.body) { - logger.error( - `Additional error details: ${JSON.stringify(error.response.body)}`, - ); - } - } finally { - releaseMutex(); - } - } -}); - -const job = new SimpleIntervalJob( - { - seconds: 10, - runImmediately: true, - }, - task, - { id: 'sync-registries', preventOverrun: true }, -); - -const processJob = async () => { - await assertDataLayerAvailable(); - await assertWalletIsSynced(); - - const organizations = await Organization.findAll({ - where: { subscribed: true }, - raw: true, - }); - - for (const organization of organizations) { - await syncOrganizationAudit(organization); - } -}; - -async function createTransaction(callback, afterCommitCallbacks) { - let result = null; - - let transaction; - let mirrorTransaction; - - try { - logger.info('Starting transaction'); - // Start a transaction - transaction = await sequelize.transaction(); - - if (mirrorDBEnabled()) { - mirrorTransaction = await sequelizeMirror.transaction(); - } - - // Execute the provided callback with the transaction - result = await callback(transaction, mirrorTransaction); - - // Commit the transaction if the callback completes without errors - await transaction.commit(); - - if (mirrorDBEnabled()) { - await mirrorTransaction.commit(); - } - - for (const afterCommitCallback of afterCommitCallbacks) { - await afterCommitCallback(); - } - - logger.info('Commited transaction'); - - return result; - } catch (error) { - // Roll back the transaction if an error occurs - if (transaction) { - logger.error('Rolling back transaction'); - console.error(error); - await transaction.rollback(); - } - } -} - -const tryParseJSON = (jsonString, defaultValue) => { - try { - return JSON.parse(jsonString); - } catch (error) { - return defaultValue; - } -}; - -const truncateStaging = async () => { - logger.info(`ATTEMPTING TO TRUNCATE STAGING TABLE`); - - let success = false; - let attempts = 0; - const maxAttempts = 5; // Set a maximum number of attempts to avoid infinite loops - - while (!success && attempts < maxAttempts) { - try { - await Staging.truncate(); - success = true; // If truncate succeeds, set success to true to exit the loop - logger.info('STAGING TABLE TRUNCATED SUCCESSFULLY'); - } catch (error) { - attempts++; - logger.error( - `TRUNCATION FAILED ON ATTEMPT ${attempts}: ${error.message}`, - ); - if (attempts < maxAttempts) { - logger.info('WAITING 1 SECOND BEFORE RETRYING...'); - await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait for 1 second - } else { - logger.error('MAXIMUM TRUNCATION ATTEMPTS REACHED, GIVING UP'); - } - } - } -}; - -const syncOrganizationAudit = async (organization) => { - try { - let afterCommitCallbacks = []; - - const homeOrg = await Organization.getHomeOrg(); - const rootHistory = await datalayer.getRootHistory(organization.registryId); - - if (!rootHistory.length) { - logger.info(`No root history found for ${organization.name}`); - return; - } - - let lastRootSaved; - - if (CONFIG.USE_SIMULATOR) { - console.log('USING MOCK ROOT HISTORY'); - lastRootSaved = rootHistory[0]; - lastRootSaved.rootHash = lastRootSaved.root_hash; - lastRootSaved.generation = 0; - } else { - lastRootSaved = await Audit.findOne({ - where: { registryId: organization.registryId }, - order: [['generation', 'DESC']], - raw: true, - }); - - if (lastRootSaved) { - // There was an oversight in the audit model where we named it onChainConfirmationTimeStamp but - // the RPC result calls in timestamp. This is a temporary fix to ensure that we can still sync - lastRootSaved.timestamp = Number( - lastRootSaved?.onchainConfirmationTimeStamp || 0, - ); - lastRootSaved.root_hash = lastRootSaved.rootHash; - } - } - - let currentGeneration = _.get(rootHistory, '[0]'); - - if (!lastRootSaved) { - logger.info(`Syncing new registry ${organization.name}`); - - await Audit.create({ - orgUid: organization.orgUid, - registryId: organization.registryId, - rootHash: currentGeneration.root_hash, - type: 'CREATE REGISTRY', - generation: 0, - change: null, - table: null, - onchainConfirmationTimeStamp: currentGeneration.timestamp.toString(), - }); - - // Destroy existing records for this singleton - // On a fresh db this does nothing, but when the audit table - // is reset this will ensure that this organizations registry data is - // cleaned up on both the local db and mirror db and ready to resync - await Promise.all( - Object.keys(ModelKeys).map(async (modelKey) => { - ModelKeys[modelKey].destroy({ - where: { - orgUid: organization.orgUid, - }, - }); - }), - ); - - return; - } else { - currentGeneration = lastRootSaved; - } - - const lastProcessedIndex = currentGeneration.generation; - logger.debug(`1 Last processed index: ${lastProcessedIndex}`); - - if (lastProcessedIndex > rootHistory.length) { - logger.error( - `Could not find root history for ${organization.name} with timestamp ${currentGeneration.timestamp}, something is wrong and the sync for this organization will be paused until this is resolved.`, - ); - } - - const rootHistoryZeroBasedCount = rootHistory.length - 1; - const syncRemaining = rootHistoryZeroBasedCount - lastProcessedIndex; - const isSynced = syncRemaining === 0; - - await Organization.update( - { - synced: isSynced, - sync_remaining: syncRemaining, - }, - { where: { orgUid: organization.orgUid } }, - ); - - if (process.env.NODE_ENV !== 'test' && isSynced) { - logger.debug(`3 Last processed index: ${lastProcessedIndex}`); - return; - } - - const toBeProcessedIndex = lastProcessedIndex + 1; - logger.debug(`3 Last processed index: ${lastProcessedIndex}`); - logger.debug(`4 To be processed index: ${toBeProcessedIndex}`); - - // Organization not synced, sync it - logger.info(' '); - logger.info( - `Syncing ${organization.name} generation ${toBeProcessedIndex}`, - ); - logger.info( - `${organization.name} is ${syncRemaining} DataLayer generations away from being fully synced.`, - ); - - if (!CONFIG.USE_SIMULATOR) { - await new Promise((resolve) => setTimeout(resolve, 30000)); - - const { sync_status } = await datalayer.getSyncStatus( - organization.registryId, - ); - - if (toBeProcessedIndex > sync_status.generation) { - const warningMsg = [ - `No data found for ${organization.name} in the current datalayer generation.`, - `DataLayer not yet caught up to generation ${lastProcessedIndex}. The current processed generation is ${sync_status.generation}.`, - `This issue is often temporary and could be due to a lag in data propagation.`, - 'Syncing for this organization will be paused until this is resolved.', - 'For ongoing issues, please contact the organization.', - ].join(' '); - - logger.warn(warningMsg); - return; - } - } - - logger.debug(`5 Last processed index: ${lastProcessedIndex}`); - const root1 = _.get(rootHistory, `[${lastProcessedIndex}]`); - logger.debug(`6 To be processed index: ${toBeProcessedIndex}`); - const root2 = _.get(rootHistory, `[${toBeProcessedIndex}]`); - - logger.info(`ROOT 1 ${JSON.stringify(root1)}`); - logger.info(`ROOT 2', ${JSON.stringify(root2)}`); - - if (!_.get(root2, 'confirmed')) { - logger.info( - `Waiting for the latest root for ${organization.name} to confirm`, - ); - return; - } - - logger.debug(`7 Last processed index: ${lastProcessedIndex}`); - logger.debug(`8 To be processed index: ${toBeProcessedIndex}`); - - const kvDiff = await datalayer.getRootDiff( - organization.registryId, - root1.root_hash, - root2.root_hash, - ); - - const comment = kvDiff.filter( - (diff) => - (diff.key === encodeHex('comment') || - diff.key === `0x${encodeHex('comment')}`) && - diff.type === 'INSERT', - ); - - const author = kvDiff.filter( - (diff) => - (diff.key === encodeHex('author') || - diff.key === `0x${encodeHex('author')}`) && - diff.type === 'INSERT', - ); - - // This optimizedKvDiff will remove all the DELETES that have corresponding INSERTS - // This is because we treat INSERTS as UPSERTS and we can save time and reduce DB thrashing - // by not processing the DELETE for that record. - const optimizedKvDiff = optimizeAndSortKvDiff(kvDiff); - - const updateTransaction = async (transaction, mirrorTransaction) => { - logger.info( - `Syncing ${organization.name} generation ${toBeProcessedIndex}`, - ); - if (_.isEmpty(optimizedKvDiff)) { - const auditData = { - orgUid: organization.orgUid, - registryId: organization.registryId, - rootHash: root2.root_hash, - type: 'NO CHANGE', - table: null, - change: null, - onchainConfirmationTimeStamp: root2.timestamp, - generation: toBeProcessedIndex, - comment: '', - author: '', - }; - - await Audit.create(auditData, { transaction, mirrorTransaction }); - } else { - for (const diff of optimizedKvDiff) { - const key = decodeHex(diff.key); - const modelKey = key.split('|')[0]; - - const auditData = { - orgUid: organization.orgUid, - registryId: organization.registryId, - rootHash: root2.root_hash, - type: diff.type, - table: modelKey, - change: decodeHex(diff.value), - onchainConfirmationTimeStamp: root2.timestamp, - generation: toBeProcessedIndex, - comment: _.get( - tryParseJSON( - decodeHex(_.get(comment, '[0].value', encodeHex('{}'))), - ), - 'comment', - '', - ), - author: _.get( - tryParseJSON( - decodeHex(_.get(author, '[0].value', encodeHex('{}'))), - ), - 'author', - '', - ), - }; - - if (modelKey && Object.keys(ModelKeys).includes(modelKey)) { - const record = JSON.parse(decodeHex(diff.value)); - const primaryKeyValue = - record[ModelKeys[modelKey].primaryKeyAttributes[0]]; - - if (diff.type === 'INSERT') { - logger.info(`UPSERTING: ${modelKey} - ${primaryKeyValue}`); - - // Remove updatedAt fields if they exist - // This is because the db will update this field automatically and its not allowed to be null - delete record.updatedAt; - - // if createdAt is null, remove it, so that the db will update it automatically - // this field is also not allowed to be null - if (_.isNil(record.createdAt)) { - delete record.createdAt; - } - - await ModelKeys[modelKey].upsert(record, { - transaction, - mirrorTransaction, - }); - } else if (diff.type === 'DELETE') { - logger.info(`DELETING: ${modelKey} - ${primaryKeyValue}`); - await ModelKeys[modelKey].destroy({ - where: { - [ModelKeys[modelKey].primaryKeyAttributes[0]]: - primaryKeyValue, - }, - transaction, - mirrorTransaction, - }); - } - } - - // Create the Audit record - await Audit.create(auditData, { transaction, mirrorTransaction }); - await Organization.update( - { registryHash: root2.root_hash }, - { - where: { orgUid: organization.orgUid }, - transaction, - mirrorTransaction, - }, - ); - } - } - }; - - if (organization.orgUid === homeOrg?.orgUid) { - afterCommitCallbacks.push(truncateStaging); - } - - await createTransaction(updateTransaction, afterCommitCallbacks); - } catch (error) { - logger.error('Error syncing org audit', error); - } -}; - -export default job; diff --git a/.history/src/tasks/sync-registries_20240521092435.js b/.history/src/tasks/sync-registries_20240521092435.js deleted file mode 100644 index 91004bb6..00000000 --- a/.history/src/tasks/sync-registries_20240521092435.js +++ /dev/null @@ -1,450 +0,0 @@ -import _ from 'lodash'; - -import { SimpleIntervalJob, Task } from 'toad-scheduler'; -import { Mutex } from 'async-mutex'; -import { Organization, Audit, ModelKeys, Staging, Meta } from '../models'; -import datalayer from '../datalayer'; -import { - decodeHex, - encodeHex, - optimizeAndSortKvDiff, -} from '../utils/datalayer-utils'; -import dotenv from 'dotenv'; -import { logger } from '../config/logger.cjs'; -import { sequelize, sequelizeMirror } from '../database'; -import { getConfig } from '../utils/config-loader'; -import { - assertDataLayerAvailable, - assertWalletIsSynced, -} from '../utils/data-assertions'; -import { mirrorDBEnabled } from '../database'; -import { - migrateToNewSync, - generateGenerationIndex, -} from '../utils/sync-migration-utils'; - -dotenv.config(); -const mutex = new Mutex(); -const CONFIG = getConfig().APP; - -const task = new Task('sync-registries', async () => { - if (!mutex.isLocked()) { - const releaseMutex = await mutex.acquire(); - try { - const hasMigratedToNewSyncMethod = await Meta.findOne({ - where: { metaKey: 'migratedToNewSync' }, - }); - - const hasMigratedToGenerationIndexSync = await Meta.findOne({ - where: { metaKey: 'migratedToIndexBasedSync' }, - }); - - if (hasMigratedToNewSyncMethod || CONFIG.USE_SIMULATOR) { - if (hasMigratedToGenerationIndexSync) { - await processJob(); - } else { - await generateGenerationIndex(); - } - } else { - await migrateToNewSync(); - } - } catch (error) { - logger.error(`Error during datasync: ${error.message}`); - - console.trace(error); - - // Log additional information if present in the error object - if (error.response && error.response.body) { - logger.error( - `Additional error details: ${JSON.stringify(error.response.body)}`, - ); - } - } finally { - releaseMutex(); - } - } -}); - -const job = new SimpleIntervalJob( - { - seconds: 10, - runImmediately: true, - }, - task, - { id: 'sync-registries', preventOverrun: true }, -); - -const processJob = async () => { - await assertDataLayerAvailable(); - await assertWalletIsSynced(); - - const organizations = await Organization.findAll({ - where: { subscribed: true }, - raw: true, - }); - - for (const organization of organizations) { - await syncOrganizationAudit(organization); - } -}; - -async function createTransaction(callback, afterCommitCallbacks) { - let result = null; - - let transaction; - let mirrorTransaction; - - try { - logger.info('Starting transaction'); - // Start a transaction - transaction = await sequelize.transaction(); - - if (mirrorDBEnabled()) { - mirrorTransaction = await sequelizeMirror.transaction(); - } - - // Execute the provided callback with the transaction - result = await callback(transaction, mirrorTransaction); - - // Commit the transaction if the callback completes without errors - await transaction.commit(); - - if (mirrorDBEnabled()) { - await mirrorTransaction.commit(); - } - - for (const afterCommitCallback of afterCommitCallbacks) { - await afterCommitCallback(); - } - - logger.info('Commited transaction'); - - return result; - } catch (error) { - // Roll back the transaction if an error occurs - if (transaction) { - logger.error('Rolling back transaction'); - console.error(error); - await transaction.rollback(); - } - } -} - -const tryParseJSON = (jsonString, defaultValue) => { - try { - return JSON.parse(jsonString); - } catch (error) { - return defaultValue; - } -}; - -const truncateStaging = async () => { - logger.info(`ATTEMPTING TO TRUNCATE STAGING TABLE`); - - let success = false; - let attempts = 0; - const maxAttempts = 5; // Set a maximum number of attempts to avoid infinite loops - - while (!success && attempts < maxAttempts) { - try { - await Staging.truncate(); - success = true; // If truncate succeeds, set success to true to exit the loop - logger.info('STAGING TABLE TRUNCATED SUCCESSFULLY'); - } catch (error) { - attempts++; - logger.error( - `TRUNCATION FAILED ON ATTEMPT ${attempts}: ${error.message}`, - ); - if (attempts < maxAttempts) { - logger.info('WAITING 1 SECOND BEFORE RETRYING...'); - await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait for 1 second - } else { - logger.error('MAXIMUM TRUNCATION ATTEMPTS REACHED, GIVING UP'); - } - } - } -}; - -const syncOrganizationAudit = async (organization) => { - try { - let afterCommitCallbacks = []; - - const homeOrg = await Organization.getHomeOrg(); - const rootHistory = await datalayer.getRootHistory(organization.registryId); - - if (!rootHistory.length) { - logger.info(`No root history found for ${organization.name}`); - return; - } - - let lastRootSaved; - - if (CONFIG.USE_SIMULATOR) { - console.log('USING MOCK ROOT HISTORY'); - lastRootSaved = rootHistory[0]; - lastRootSaved.rootHash = lastRootSaved.root_hash; - lastRootSaved.generation = 0; - } else { - lastRootSaved = await Audit.findOne({ - where: { registryId: organization.registryId }, - order: [['generation', 'DESC']], - raw: true, - }); - - if (lastRootSaved) { - // There was an oversight in the audit model where we named it onChainConfirmationTimeStamp but - // the RPC result calls in timestamp. This is a temporary fix to ensure that we can still sync - lastRootSaved.timestamp = Number( - lastRootSaved?.onchainConfirmationTimeStamp || 0, - ); - lastRootSaved.root_hash = lastRootSaved.rootHash; - } - } - - let currentGeneration = _.get(rootHistory, '[0]'); - - if (!lastRootSaved) { - logger.info(`Syncing new registry ${organization.name}`); - - await Audit.create({ - orgUid: organization.orgUid, - registryId: organization.registryId, - rootHash: currentGeneration.root_hash, - type: 'CREATE REGISTRY', - generation: 0, - change: null, - table: null, - onchainConfirmationTimeStamp: currentGeneration.timestamp.toString(), - }); - - // Destroy existing records for this singleton - // On a fresh db this does nothing, but when the audit table - // is reset this will ensure that this organizations registry data is - // cleaned up on both the local db and mirror db and ready to resync - await Promise.all( - Object.keys(ModelKeys).map(async (modelKey) => { - ModelKeys[modelKey].destroy({ - where: { - orgUid: organization.orgUid, - }, - }); - }), - ); - - return; - } else { - currentGeneration = lastRootSaved; - } - - const lastProcessedIndex = currentGeneration.generation; - logger.debug(`1 Last processed index: ${lastProcessedIndex}`); - - if (lastProcessedIndex > rootHistory.length) { - logger.error( - `Could not find root history for ${organization.name} with timestamp ${currentGeneration.timestamp}, something is wrong and the sync for this organization will be paused until this is resolved.`, - ); - } - - const rootHistoryZeroBasedCount = rootHistory.length - 1; - const syncRemaining = rootHistoryZeroBasedCount - lastProcessedIndex; - const isSynced = syncRemaining === 0; - - await Organization.update( - { - synced: isSynced, - sync_remaining: syncRemaining, - }, - { where: { orgUid: organization.orgUid } }, - ); - - if (process.env.NODE_ENV !== 'test' && isSynced) { - logger.debug(`3 Last processed index: ${lastProcessedIndex}`); - return; - } - - const toBeProcessedIndex = lastProcessedIndex + 1; - logger.debug(`3 Last processed index: ${lastProcessedIndex}`); - logger.debug(`4 To be processed index: ${toBeProcessedIndex}`); - - // Organization not synced, sync it - logger.info(' '); - logger.info( - `Syncing ${organization.name} generation ${toBeProcessedIndex}`, - ); - logger.info( - `${organization.name} is ${syncRemaining} DataLayer generations away from being fully synced.`, - ); - - if (!CONFIG.USE_SIMULATOR) { - await new Promise((resolve) => setTimeout(resolve, 30000)); - - const { sync_status } = await datalayer.getSyncStatus( - organization.registryId, - ); - - if (toBeProcessedIndex > sync_status.generation) { - const warningMsg = [ - `No data found for ${organization.name} in the current datalayer generation.`, - `DataLayer not yet caught up to generation ${toBeProcessedIndex}. The current processed generation is ${sync_status.generation}.`, - `This issue is often temporary and could be due to a lag in data propagation.`, - 'Syncing for this organization will be paused until this is resolved.', - 'For ongoing issues, please contact the organization.', - ].join(' '); - - logger.warn(warningMsg); - return; - } - } - - logger.debug(`5 Last processed index: ${lastProcessedIndex}`); - const root1 = _.get(rootHistory, `[${lastProcessedIndex}]`); - logger.debug(`6 To be processed index: ${toBeProcessedIndex}`); - const root2 = _.get(rootHistory, `[${toBeProcessedIndex}]`); - - logger.info(`ROOT 1 ${JSON.stringify(root1)}`); - logger.info(`ROOT 2', ${JSON.stringify(root2)}`); - - if (!_.get(root2, 'confirmed')) { - logger.info( - `Waiting for the latest root for ${organization.name} to confirm`, - ); - return; - } - - logger.debug(`7 Last processed index: ${lastProcessedIndex}`); - logger.debug(`8 To be processed index: ${toBeProcessedIndex}`); - - const kvDiff = await datalayer.getRootDiff( - organization.registryId, - root1.root_hash, - root2.root_hash, - ); - - const comment = kvDiff.filter( - (diff) => - (diff.key === encodeHex('comment') || - diff.key === `0x${encodeHex('comment')}`) && - diff.type === 'INSERT', - ); - - const author = kvDiff.filter( - (diff) => - (diff.key === encodeHex('author') || - diff.key === `0x${encodeHex('author')}`) && - diff.type === 'INSERT', - ); - - // This optimizedKvDiff will remove all the DELETES that have corresponding INSERTS - // This is because we treat INSERTS as UPSERTS and we can save time and reduce DB thrashing - // by not processing the DELETE for that record. - const optimizedKvDiff = optimizeAndSortKvDiff(kvDiff); - - const updateTransaction = async (transaction, mirrorTransaction) => { - logger.info( - `Syncing ${organization.name} generation ${toBeProcessedIndex}`, - ); - if (_.isEmpty(optimizedKvDiff)) { - const auditData = { - orgUid: organization.orgUid, - registryId: organization.registryId, - rootHash: root2.root_hash, - type: 'NO CHANGE', - table: null, - change: null, - onchainConfirmationTimeStamp: root2.timestamp, - generation: toBeProcessedIndex, - comment: '', - author: '', - }; - - await Audit.create(auditData, { transaction, mirrorTransaction }); - } else { - for (const diff of optimizedKvDiff) { - const key = decodeHex(diff.key); - const modelKey = key.split('|')[0]; - - const auditData = { - orgUid: organization.orgUid, - registryId: organization.registryId, - rootHash: root2.root_hash, - type: diff.type, - table: modelKey, - change: decodeHex(diff.value), - onchainConfirmationTimeStamp: root2.timestamp, - generation: toBeProcessedIndex, - comment: _.get( - tryParseJSON( - decodeHex(_.get(comment, '[0].value', encodeHex('{}'))), - ), - 'comment', - '', - ), - author: _.get( - tryParseJSON( - decodeHex(_.get(author, '[0].value', encodeHex('{}'))), - ), - 'author', - '', - ), - }; - - if (modelKey && Object.keys(ModelKeys).includes(modelKey)) { - const record = JSON.parse(decodeHex(diff.value)); - const primaryKeyValue = - record[ModelKeys[modelKey].primaryKeyAttributes[0]]; - - if (diff.type === 'INSERT') { - logger.info(`UPSERTING: ${modelKey} - ${primaryKeyValue}`); - - // Remove updatedAt fields if they exist - // This is because the db will update this field automatically and its not allowed to be null - delete record.updatedAt; - - // if createdAt is null, remove it, so that the db will update it automatically - // this field is also not allowed to be null - if (_.isNil(record.createdAt)) { - delete record.createdAt; - } - - await ModelKeys[modelKey].upsert(record, { - transaction, - mirrorTransaction, - }); - } else if (diff.type === 'DELETE') { - logger.info(`DELETING: ${modelKey} - ${primaryKeyValue}`); - await ModelKeys[modelKey].destroy({ - where: { - [ModelKeys[modelKey].primaryKeyAttributes[0]]: - primaryKeyValue, - }, - transaction, - mirrorTransaction, - }); - } - } - - // Create the Audit record - await Audit.create(auditData, { transaction, mirrorTransaction }); - await Organization.update( - { registryHash: root2.root_hash }, - { - where: { orgUid: organization.orgUid }, - transaction, - mirrorTransaction, - }, - ); - } - } - }; - - if (organization.orgUid === homeOrg?.orgUid) { - afterCommitCallbacks.push(truncateStaging); - } - - await createTransaction(updateTransaction, afterCommitCallbacks); - } catch (error) { - logger.error('Error syncing org audit', error); - } -}; - -export default job; From f46384d80815edbc95e4bf7dd0d8817e01150a0e Mon Sep 17 00:00:00 2001 From: Zachary Brown Date: Tue, 21 May 2024 11:07:22 -0700 Subject: [PATCH 06/24] fix: add storeId to log messages that previously only had store name --- package-lock.json | 86 ++++++++++++++++++------------------ src/tasks/sync-registries.js | 20 +++++---- 2 files changed, 54 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index f82de717..920d2595 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,5 @@ { "name": "cadt", - "version": "1.7.15", "lockfileVersion": 3, "requires": true, @@ -2178,9 +2177,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", - "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2231,9 +2230,9 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/@eslint/js": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", - "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", + "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -2288,9 +2287,9 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" }, "node_modules/@humanwhocodes/retry": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz", - "integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", "engines": { "node": ">=18.18" }, @@ -2564,9 +2563,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.12.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", - "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2602,11 +2601,6 @@ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==" }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2773,6 +2767,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "delegates": "^1.0.0", @@ -3099,12 +3094,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3318,9 +3313,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001617", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", - "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", + "version": "1.0.30001620", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", + "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==", "funding": [ { "type": "opencollective", @@ -4697,9 +4692,9 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, "node_modules/core-js-compat": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", - "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { "browserslist": "^4.23.0" @@ -5132,9 +5127,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.764", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.764.tgz", - "integrity": "sha512-ZXbPV46Y4dNCA+k7YHB+BYlzcoMtZ1yH6V0tQ1ul0wmA7RiwJfS29LSdRlE1myWBXRzEgm/Lz6tryj5WVQiLmg==" + "version": "1.4.777", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.777.tgz", + "integrity": "sha512-n02NCwLJ3wexLfK/yQeqfywCblZqLcXphzmid5e8yVPdtEcida7li0A5WQKghHNG0FeOMCzeFOzEbtAh5riXFw==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5297,17 +5292,17 @@ } }, "node_modules/eslint": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz", - "integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.3.0.tgz", + "integrity": "sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.0.2", - "@eslint/js": "9.2.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.3.0", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.2.3", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", @@ -5937,9 +5932,9 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -6156,6 +6151,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -8590,6 +8586,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "are-we-there-yet": "^3.0.0", @@ -11095,9 +11092,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", - "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "funding": [ { "type": "opencollective", @@ -11114,7 +11111,7 @@ ], "dependencies": { "escalade": "^3.1.2", - "picocolors": "^1.0.0" + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -11398,6 +11395,7 @@ "version": "0.19.3", "resolved": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz", "integrity": "sha512-8IfgFctB7fkvqkTGF2MnrDrC6vzE28Wcc1aSbdDQ+4/WFtzfS73YuapbuaPZwGqpR2e0EeDMIrFOJubQVLWFNA==", + "license": "Apache-2.0", "bin": { "xlsx": "bin/xlsx.njs" }, diff --git a/src/tasks/sync-registries.js b/src/tasks/sync-registries.js index 11d251d4..082f3c1c 100644 --- a/src/tasks/sync-registries.js +++ b/src/tasks/sync-registries.js @@ -173,7 +173,9 @@ const syncOrganizationAudit = async (organization) => { const rootHistory = await datalayer.getRootHistory(organization.registryId); if (!rootHistory.length) { - logger.info(`No root history found for ${organization.name}`); + logger.info( + `No root history found for ${organization.name} (store ${organization.orgUid})`, + ); return; } @@ -204,7 +206,9 @@ const syncOrganizationAudit = async (organization) => { let currentGeneration = _.get(rootHistory, '[0]'); if (!lastRootSaved) { - logger.info(`Syncing new registry ${organization.name}`); + logger.info( + `Syncing new registry ${organization.name} (store ${organization.orgUid})`, + ); await Audit.create({ orgUid: organization.orgUid, @@ -241,7 +245,7 @@ const syncOrganizationAudit = async (organization) => { if (lastProcessedIndex > rootHistory.length) { logger.error( - `Could not find root history for ${organization.name} with timestamp ${currentGeneration.timestamp}, something is wrong and the sync for this organization will be paused until this is resolved.`, + `Could not find root history for ${organization.name} (store ${organization.orgUid}) with timestamp ${currentGeneration.timestamp}, something is wrong and the sync for this organization will be paused until this is resolved.`, ); } @@ -269,10 +273,10 @@ const syncOrganizationAudit = async (organization) => { // Organization not synced, sync it logger.info(' '); logger.info( - `Syncing ${organization.name} generation ${toBeProcessedIndex}`, + `Syncing ${organization.name} generation ${toBeProcessedIndex} (store ${organization.orgUid})`, ); logger.info( - `${organization.name} is ${syncRemaining} DataLayer generations away from being fully synced.`, + `${organization.name} is ${syncRemaining} DataLayer generations away from being fully synced (store ${organization.orgUid}).`, ); if (!CONFIG.USE_SIMULATOR) { @@ -284,7 +288,7 @@ const syncOrganizationAudit = async (organization) => { if (lastProcessedIndex > sync_status.generation) { const warningMsg = [ - `No data found for ${organization.name} in the current datalayer generation.`, + `No data found for ${organization.name} (store ${organization.orgUid}) in the current datalayer generation.`, `DataLayer not yet caught up to generation ${lastProcessedIndex}. The current processed generation is ${sync_status.generation}.`, `This issue is often temporary and could be due to a lag in data propagation.`, 'Syncing for this organization will be paused until this is resolved.', @@ -306,7 +310,7 @@ const syncOrganizationAudit = async (organization) => { if (!_.get(root2, 'confirmed')) { logger.info( - `Waiting for the latest root for ${organization.name} to confirm`, + `Waiting for the latest root for ${organization.name} to confirm (store ${organization.orgUid})`, ); return; } @@ -341,7 +345,7 @@ const syncOrganizationAudit = async (organization) => { const updateTransaction = async (transaction, mirrorTransaction) => { logger.info( - `Syncing ${organization.name} generation ${toBeProcessedIndex}`, + `Syncing ${organization.name} generation ${toBeProcessedIndex} (store ${organization.orgUid})`, ); if (_.isEmpty(optimizedKvDiff)) { const auditData = { From 8510dc940febd2957a815fabe3786038555ff05c Mon Sep 17 00:00:00 2001 From: Zachary Brown Date: Tue, 21 May 2024 11:16:11 -0700 Subject: [PATCH 07/24] fix: add storeId to log messages that previously only had store name --- package-lock.json | 202 ++++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 126 insertions(+), 78 deletions(-) diff --git a/package-lock.json b/package-lock.json index 920d2595..587aa45f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "babel-plugin-module-resolver": "^5.0.2", "chai": "^5.1.1", "chai-http": "^4.4.0", - "eslint": "^9.2.0", + "eslint": "^8.0.0", "eslint-plugin-es": "^4.1.0", "eslint-plugin-mocha": "^10.4.3", "husky": "^9.0.11", @@ -2177,14 +2177,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2192,7 +2192,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2214,11 +2214,14 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2229,12 +2232,23 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", - "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@gar/promisify": { @@ -2257,11 +2271,11 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", + "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -2286,18 +2300,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", @@ -2601,6 +2603,11 @@ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==" }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -5019,6 +5026,17 @@ "node": ">=0.3.1" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -5292,36 +5310,40 @@ } }, "node_modules/eslint": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.3.0.tgz", - "integrity": "sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.3.0", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", + "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.1", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.1", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -5335,7 +5357,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5538,26 +5560,26 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5597,6 +5619,20 @@ "node": ">=10.13.0" } }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5663,6 +5699,17 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -5675,27 +5722,27 @@ } }, "node_modules/espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5908,14 +5955,14 @@ } }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/file-stream-rotator": { @@ -6033,15 +6080,16 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { @@ -6122,8 +6170,7 @@ "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==", - "devOptional": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -6598,7 +6645,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6666,6 +6712,11 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "devOptional": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -6988,7 +7039,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8783,7 +8833,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -9622,7 +9671,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, "dependencies": { "glob": "^7.1.3" }, diff --git a/package.json b/package.json index 801f6dd4..52153d0d 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "babel-plugin-module-resolver": "^5.0.2", "chai": "^5.1.1", "chai-http": "^4.4.0", - "eslint": "^9.2.0", + "eslint": "^8.0.0", "eslint-plugin-es": "^4.1.0", "eslint-plugin-mocha": "^10.4.3", "husky": "^9.0.11", From bcfb66f37c9ba1e880343abacb01b5dd8532404b Mon Sep 17 00:00:00 2001 From: Zachary Brown Date: Thu, 23 May 2024 14:41:33 -0700 Subject: [PATCH 08/24] chore: bump version to 1.7.16 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52153d0d..e797dba5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cadt", - "version": "1.7.15", + "version": "1.7.16", "_comment": "DONT CHANGE MAJOR UNLESS DATAMODEL CHANGES: The major version corresponds to the datamodel version your using, so 2.0.0 means it'll use datamodel v2", "private": true, "bin": "build/server.js", From aa851b9d2f2ce8402cb9de2235f087ca8a536706 Mon Sep 17 00:00:00 2001 From: William Wills Date: Fri, 24 May 2024 16:32:42 -0400 Subject: [PATCH 09/24] feat: added resetToGeneration audit endpoint --- package-lock.json | 1425 +++++++++++++------------- package.json | 38 +- src/controllers/audit.controller.js | 28 +- src/models/audit/audit.model.js | 19 +- src/routes/v1/resources/audit.js | 13 +- src/validations/audit.validations.js | 5 + 6 files changed, 805 insertions(+), 723 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb0c3988..4f30723a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,53 +8,53 @@ "name": "cadt", "version": "1.7.13", "dependencies": { - "@babel/eslint-parser": "^7.23.10", + "@babel/eslint-parser": "^7.24.6", "async-mutex": "^0.4.1", "body-parser": "^1.20.2", "cli-spinner": "^0.2.10", "cors": "^2.8.5", "csvtojson": "^2.0.10", - "dotenv": "^16.4.1", - "express": "^4.18.2", + "dotenv": "^16.4.5", + "express": "^4.19.2", "express-joi-validation": "^5.0.1", - "joi": "^17.12.1", + "joi": "^17.13.1", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "log-update": "^4.0.0", "multer": "^1.4.5-lts.1", - "mysql2": "^3.9.3", + "mysql2": "^3.9.7", "node-xlsx": "^0.23.0", "regenerator-runtime": "^0.13.11", "rxjs": "^7.8.1", - "sequelize": "^6.36.0", - "socket.io": "^4.7.4", + "sequelize": "^6.37.3", + "socket.io": "^4.7.5", "sqlite3": "^5.1.7", "superagent": "^8.1.2", "toad-scheduler": "^3.0.1", "uuidv4": "^6.2.13", - "winston": "^3.11.0", + "winston": "^3.13.0", "winston-daily-rotate-file": "^4.7.1" }, "bin": { "cadt": "build/server.js" }, "devDependencies": { - "@babel/cli": "^7.24.1", - "@babel/core": "^7.24.4", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/preset-env": "^7.24.4", - "@babel/register": "^7.23.7", - "@commitlint/cli": "^19.2.1", - "@commitlint/config-conventional": "^19.1.0", - "babel-plugin-module-resolver": "^5.0.0", - "chai": "^5.1.0", + "@babel/cli": "^7.24.6", + "@babel/core": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", + "@babel/preset-env": "^7.24.6", + "@babel/register": "^7.24.6", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", + "babel-plugin-module-resolver": "^5.0.2", + "chai": "^5.1.1", "chai-http": "^4.4.0", "eslint": "^8.57.0", "eslint-plugin-es": "^4.1.0", - "eslint-plugin-mocha": "^10.4.1", + "eslint-plugin-mocha": "^10.4.3", "husky": "^9.0.11", "mocha": "^10.4.0", - "semver": "^7.6.0", + "semver": "^7.6.2", "sinon": "^17.0.1", "socket.io-client": "^4.7.5", "standard-version": "^9.5.0", @@ -64,14 +64,6 @@ "node": ">=16.13" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -85,13 +77,13 @@ } }, "node_modules/@babel/cli": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.1.tgz", - "integrity": "sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.6.tgz", + "integrity": "sha512-Sm/YhG/0REw9SKByFHDf4hkk7PYsjcsOyZgHGz1nvab4tUTQ9N4XVv+ykK0Y+VCJ3OshA/7EDyxnwCd8NEP/mQ==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", - "commander": "^4.0.1", + "commander": "^6.2.0", "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", "glob": "^7.2.0", @@ -114,11 +106,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.6", "picocolors": "^1.0.0" }, "engines": { @@ -126,28 +118,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -171,9 +163,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.6.tgz", + "integrity": "sha512-Q1BfQX42zXHx732PLW0w4+Y3wJjoZKEMaatFUEAmQ7Z+jCXxinzeqX9bvv2Q8xNPes/H6F0I23oGkcgjaItmLw==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -184,7 +176,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/semver": { @@ -196,11 +188,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -210,36 +202,36 @@ } }, "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==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", + "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", + "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -257,19 +249,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", + "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "semver": "^6.3.1" }, "engines": { @@ -289,12 +281,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", + "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -315,9 +307,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -331,69 +323,69 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "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==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", + "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -403,35 +395,35 @@ } }, "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==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", + "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", + "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-wrap-function": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -441,14 +433,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", + "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -458,96 +450,95 @@ } }, "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==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "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==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", + "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "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==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", + "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -557,9 +548,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -568,13 +559,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", + "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -584,12 +575,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "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.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.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.24.6.tgz", + "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -599,14 +590,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", + "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -616,13 +607,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", + "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -707,12 +698,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", + "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -722,12 +713,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", + "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -879,12 +870,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", + "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -894,14 +885,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", + "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -912,14 +903,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", + "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -929,12 +920,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", + "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -944,12 +935,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", + "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -959,13 +950,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", + "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -975,13 +966,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", + "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -992,18 +983,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", + "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "globals": "^11.1.0" }, "engines": { @@ -1014,13 +1005,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", + "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/template": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1030,12 +1021,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", + "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1045,13 +1036,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", + "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1061,12 +1052,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", + "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1076,12 +1067,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", + "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1092,13 +1083,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", + "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1108,12 +1099,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", + "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1124,13 +1115,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", + "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1140,14 +1131,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", + "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1157,12 +1148,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", + "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1173,12 +1164,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", + "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1188,12 +1179,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", + "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1204,12 +1195,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", + "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1219,13 +1210,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", + "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1235,14 +1226,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", + "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1252,15 +1243,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", + "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1270,13 +1261,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", + "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1286,13 +1277,13 @@ } }, "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==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", + "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1302,12 +1293,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", + "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1317,12 +1308,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", + "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1333,12 +1324,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", + "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1349,15 +1340,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", + "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1367,13 +1358,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", + "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1383,12 +1374,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", + "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1399,13 +1390,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", + "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1416,12 +1407,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", + "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1431,13 +1422,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", + "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1447,14 +1438,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", + "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1465,12 +1456,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", + "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1480,12 +1471,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", + "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1496,12 +1487,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", + "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1511,12 +1502,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", + "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1526,13 +1517,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", + "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1542,12 +1533,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", + "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1557,12 +1548,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", + "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1572,12 +1563,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", + "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1587,12 +1578,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", + "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1602,13 +1593,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", + "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1618,13 +1609,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", + "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1634,13 +1625,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", + "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1650,27 +1641,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", + "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", "@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.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", "@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", @@ -1682,54 +1673,54 @@ "@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.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.6", + "@babel/plugin-transform-async-generator-functions": "^7.24.6", + "@babel/plugin-transform-async-to-generator": "^7.24.6", + "@babel/plugin-transform-block-scoped-functions": "^7.24.6", + "@babel/plugin-transform-block-scoping": "^7.24.6", + "@babel/plugin-transform-class-properties": "^7.24.6", + "@babel/plugin-transform-class-static-block": "^7.24.6", + "@babel/plugin-transform-classes": "^7.24.6", + "@babel/plugin-transform-computed-properties": "^7.24.6", + "@babel/plugin-transform-destructuring": "^7.24.6", + "@babel/plugin-transform-dotall-regex": "^7.24.6", + "@babel/plugin-transform-duplicate-keys": "^7.24.6", + "@babel/plugin-transform-dynamic-import": "^7.24.6", + "@babel/plugin-transform-exponentiation-operator": "^7.24.6", + "@babel/plugin-transform-export-namespace-from": "^7.24.6", + "@babel/plugin-transform-for-of": "^7.24.6", + "@babel/plugin-transform-function-name": "^7.24.6", + "@babel/plugin-transform-json-strings": "^7.24.6", + "@babel/plugin-transform-literals": "^7.24.6", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", + "@babel/plugin-transform-member-expression-literals": "^7.24.6", + "@babel/plugin-transform-modules-amd": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-modules-systemjs": "^7.24.6", + "@babel/plugin-transform-modules-umd": "^7.24.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", + "@babel/plugin-transform-new-target": "^7.24.6", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", + "@babel/plugin-transform-numeric-separator": "^7.24.6", + "@babel/plugin-transform-object-rest-spread": "^7.24.6", + "@babel/plugin-transform-object-super": "^7.24.6", + "@babel/plugin-transform-optional-catch-binding": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6", + "@babel/plugin-transform-parameters": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.24.6", + "@babel/plugin-transform-private-property-in-object": "^7.24.6", + "@babel/plugin-transform-property-literals": "^7.24.6", + "@babel/plugin-transform-regenerator": "^7.24.6", + "@babel/plugin-transform-reserved-words": "^7.24.6", + "@babel/plugin-transform-shorthand-properties": "^7.24.6", + "@babel/plugin-transform-spread": "^7.24.6", + "@babel/plugin-transform-sticky-regex": "^7.24.6", + "@babel/plugin-transform-template-literals": "^7.24.6", + "@babel/plugin-transform-typeof-symbol": "^7.24.6", + "@babel/plugin-transform-unicode-escapes": "^7.24.6", + "@babel/plugin-transform-unicode-property-regex": "^7.24.6", + "@babel/plugin-transform-unicode-regex": "^7.24.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -1768,9 +1759,9 @@ } }, "node_modules/@babel/register": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", - "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", + "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -1793,9 +1784,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1811,31 +1802,31 @@ "dev": true }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1844,12 +1835,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1865,13 +1856,13 @@ } }, "node_modules/@commitlint/cli": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.2.1.tgz", - "integrity": "sha512-cbkYUJsLqRomccNxvoJTyv5yn0bSy05BBizVyIcLACkRbVUqYorC351Diw/XFSWC/GtpwiwT2eOvQgFZa374bg==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", + "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", "dev": true, "dependencies": { - "@commitlint/format": "^19.0.3", - "@commitlint/lint": "^19.1.0", + "@commitlint/format": "^19.3.0", + "@commitlint/lint": "^19.2.2", "@commitlint/load": "^19.2.0", "@commitlint/read": "^19.2.1", "@commitlint/types": "^19.0.3", @@ -1886,9 +1877,9 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.1.0.tgz", - "integrity": "sha512-KIKD2xrp6Uuk+dcZVj3++MlzIr/Su6zLE8crEDQCZNvWHNQSeeGbzOlNtsR32TUy6H3JbP7nWgduAHCaiGQ6EA==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -1938,9 +1929,9 @@ } }, "node_modules/@commitlint/format": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.0.3.tgz", - "integrity": "sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", + "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -1963,9 +1954,9 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.0.3.tgz", - "integrity": "sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", + "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -1976,12 +1967,12 @@ } }, "node_modules/@commitlint/lint": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.1.0.tgz", - "integrity": "sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", + "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^19.0.3", + "@commitlint/is-ignored": "^19.2.2", "@commitlint/parse": "^19.0.3", "@commitlint/rules": "^19.0.3", "@commitlint/types": "^19.0.3" @@ -2506,9 +2497,9 @@ "dev": true }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, "node_modules/@tootallnate/once": { "version": "1.1.2", @@ -2520,9 +2511,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz", - "integrity": "sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==", + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", "dev": true }, "node_modules/@types/conventional-commits-parser": { @@ -2573,9 +2564,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", - "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2607,9 +2598,9 @@ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" }, "node_modules/@types/validator": { - "version": "13.11.9", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", - "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" + "version": "13.11.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", + "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", @@ -2697,15 +2688,15 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -2782,6 +2773,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "delegates": "^1.0.0", @@ -2871,19 +2863,16 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/babel-plugin-module-resolver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.0.tgz", - "integrity": "sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz", + "integrity": "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg==", "dev": true, "dependencies": { - "find-babel-config": "^2.0.0", - "glob": "^8.0.3", + "find-babel-config": "^2.1.1", + "glob": "^9.3.3", "pkg-up": "^3.1.0", "reselect": "^4.1.7", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">= 16" + "resolve": "^1.22.8" } }, "node_modules/babel-plugin-module-resolver/node_modules/brace-expansion": { @@ -2896,44 +2885,55 @@ } }, "node_modules/babel-plugin-module-resolver/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/babel-plugin-module-resolver/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -2963,12 +2963,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3100,12 +3100,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3319,9 +3319,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001606", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz", - "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==", + "version": "1.0.30001621", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", + "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==", "funding": [ { "type": "opencollective", @@ -3338,13 +3338,13 @@ ] }, "node_modules/chai": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.0.tgz", - "integrity": "sha512-kDZ7MZyM6Q1DhR9jy7dalKohXQ2yrlXkk59CR52aRKxJrobmlBNqnFQxX9xOX8w+4mz8SYlKJa/7D7ddltFXCw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, "dependencies": { "assertion-error": "^2.0.1", - "check-error": "^2.0.0", + "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" @@ -3373,9 +3373,9 @@ } }, "node_modules/chai-http/node_modules/qs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", - "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dev": true, "dependencies": { "side-channel": "^1.0.6" @@ -3410,9 +3410,9 @@ } }, "node_modules/check-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.0.0.tgz", - "integrity": "sha512-tjLAOBHKVxtPoHe/SA7kNOMvhCRdCJ3vETdeY0RuAc9popf+hyaSV6ZEg9hr4cpWF7jmo/JSWEnLDrnijS9Tog==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "engines": { "node": ">= 16" @@ -3618,9 +3618,9 @@ } }, "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, "engines": { "node": ">= 6" @@ -4698,9 +4698,9 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { "browserslist": "^4.23.0" @@ -5144,9 +5144,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.729", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz", - "integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==" + "version": "1.4.783", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.783.tgz", + "integrity": "sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5382,9 +5382,9 @@ } }, "node_modules/eslint-plugin-mocha": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.1.tgz", - "integrity": "sha512-G85ALUgKaLzuEuHhoW3HVRgPTmia6njQC3qCG6CEvA8/Ja9PDZnRZOuzekMki+HaViEQXINuYsmhp5WR5/4MfA==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz", + "integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==", "dev": true, "dependencies": { "eslint-utils": "^3.0.0", @@ -5978,9 +5978,9 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -6020,16 +6020,13 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-babel-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.0.0.tgz", - "integrity": "sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.1.1.tgz", + "integrity": "sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==", "dev": true, "dependencies": { - "json5": "^2.1.1", + "json5": "^2.2.3", "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" } }, "node_modules/find-cache-dir": { @@ -6200,6 +6197,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -6996,9 +6994,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, "funding": { "type": "github", @@ -7040,6 +7038,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7286,9 +7285,9 @@ } }, "node_modules/joi": { - "version": "17.12.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.3.tgz", - "integrity": "sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==", + "version": "17.13.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", + "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -7708,9 +7707,9 @@ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/loupe": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.0.tgz", - "integrity": "sha512-qKl+FrLXUhFuHUoDJG7f8P8gEMHq9NFS0c6ghXG1J0rldmZFQZoNVv/vyirE9qwCIhWZDsvEFd1sbFu3GvRQFg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, "dependencies": { "get-func-name": "^2.0.1" @@ -8407,9 +8406,9 @@ } }, "node_modules/mysql2": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.3.tgz", - "integrity": "sha512-+ZaoF0llESUy7BffccHG+urErHcWPZ/WuzYAA9TEeLaDYyke3/3D+VQDzK9xzRnXpd0eMtRf0WNOeo4Q1Baung==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz", + "integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -8500,15 +8499,15 @@ } }, "node_modules/nise/node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", "dev": true }, "node_modules/node-abi": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.57.0.tgz", - "integrity": "sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==", + "version": "3.62.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz", + "integrity": "sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==", "dependencies": { "semver": "^7.3.5" }, @@ -8637,6 +8636,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "are-we-there-yet": "^3.0.0", @@ -8715,16 +8715,16 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -8851,6 +8851,40 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -8892,9 +8926,9 @@ "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -9710,12 +9744,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -9723,22 +9754,6 @@ "node": ">=10" } }, - "node_modules/semver/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==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/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/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -9786,9 +9801,9 @@ "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "node_modules/sequelize": { - "version": "6.37.2", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.2.tgz", - "integrity": "sha512-bnb7swGANONXCTrVyebpOOZssLwQrVkYX2tcC6qOIvH+P+OhsoMBi7c3GXI5bC+Z4b4tOl+kQy6yeqLCZ1YQAQ==", + "version": "6.37.3", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.3.tgz", + "integrity": "sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A==", "funding": [ { "type": "opencollective", @@ -10187,9 +10202,9 @@ } }, "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "optional": true, "dependencies": { "ip-address": "^9.0.5", @@ -10260,9 +10275,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/split": { @@ -10647,6 +10662,7 @@ "version": "8.1.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", @@ -10968,9 +10984,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "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, "peer": true, "bin": { @@ -11078,9 +11094,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "funding": [ { "type": "opencollective", @@ -11096,8 +11112,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -11155,9 +11171,9 @@ } }, "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { "node": ">= 0.10" } @@ -11289,6 +11305,14 @@ "@types/node": "*" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -11373,6 +11397,7 @@ "version": "0.19.3", "resolved": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz", "integrity": "sha512-8IfgFctB7fkvqkTGF2MnrDrC6vzE28Wcc1aSbdDQ+4/WFtzfS73YuapbuaPZwGqpR2e0EeDMIrFOJubQVLWFNA==", + "license": "Apache-2.0", "bin": { "xlsx": "bin/xlsx.njs" }, diff --git a/package.json b/package.json index ff074c7a..3f197063 100644 --- a/package.json +++ b/package.json @@ -31,50 +31,50 @@ "assets": "package.json" }, "dependencies": { - "@babel/eslint-parser": "^7.23.10", + "@babel/eslint-parser": "^7.24.6", "async-mutex": "^0.4.1", "body-parser": "^1.20.2", "cli-spinner": "^0.2.10", "cors": "^2.8.5", "csvtojson": "^2.0.10", - "dotenv": "^16.4.1", - "express": "^4.18.2", + "dotenv": "^16.4.5", + "express": "^4.19.2", "express-joi-validation": "^5.0.1", - "joi": "^17.12.1", + "joi": "^17.13.1", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "log-update": "^4.0.0", "multer": "^1.4.5-lts.1", - "mysql2": "^3.9.3", + "mysql2": "^3.9.7", "node-xlsx": "^0.23.0", "regenerator-runtime": "^0.13.11", "rxjs": "^7.8.1", - "sequelize": "^6.36.0", - "socket.io": "^4.7.4", + "sequelize": "^6.37.3", + "socket.io": "^4.7.5", "sqlite3": "^5.1.7", "superagent": "^8.1.2", "toad-scheduler": "^3.0.1", "uuidv4": "^6.2.13", - "winston": "^3.11.0", + "winston": "^3.13.0", "winston-daily-rotate-file": "^4.7.1" }, "devDependencies": { - "@babel/cli": "^7.24.1", - "@babel/core": "^7.24.4", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/preset-env": "^7.24.4", - "@babel/register": "^7.23.7", - "@commitlint/cli": "^19.2.1", - "@commitlint/config-conventional": "^19.1.0", - "babel-plugin-module-resolver": "^5.0.0", - "chai": "^5.1.0", + "@babel/cli": "^7.24.6", + "@babel/core": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", + "@babel/preset-env": "^7.24.6", + "@babel/register": "^7.24.6", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", + "babel-plugin-module-resolver": "^5.0.2", + "chai": "^5.1.1", "chai-http": "^4.4.0", "eslint": "^8.57.0", "eslint-plugin-es": "^4.1.0", - "eslint-plugin-mocha": "^10.4.1", + "eslint-plugin-mocha": "^10.4.3", "husky": "^9.0.11", "mocha": "^10.4.0", - "semver": "^7.6.0", + "semver": "^7.6.2", "sinon": "^17.0.1", "socket.io-client": "^4.7.5", "standard-version": "^9.5.0", diff --git a/src/controllers/audit.controller.js b/src/controllers/audit.controller.js index 2716df9c..51569244 100644 --- a/src/controllers/audit.controller.js +++ b/src/controllers/audit.controller.js @@ -4,6 +4,7 @@ import { paginationParams, optionallyPaginatedResponse, } from '../utils/helpers'; +import _ from 'lodash'; export const findAll = async (req, res) => { try { @@ -20,7 +21,7 @@ export const findAll = async (req, res) => { return res.json(optionallyPaginatedResponse(auditResults, page, limit)); } catch (error) { res.status(400).json({ - message: 'Can not retreive audit data', + message: 'Can not retrieve audit data', error: error.message, success: false, }); @@ -32,7 +33,30 @@ export const findConflicts = async (req, res) => { return res.json(await Audit.findConflicts()); } catch (error) { res.status(400).json({ - message: 'Can not retreive audit data', + message: 'Can not retrieve audit data', + error: error.message, + success: false, + }); + } +}; + +export const resetToGeneration = async (req, res) => { + try { + const { generation, orgUid } = req.body; + const result = await Audit.resetToGeneration(generation, orgUid); + if (_.isNil(result)) { + throw new Error('query failed'); + } + return res.json({ + message: result + ? 'reset to generation ' + String(generation) + : 'no matching records', + recordsDeleted: result, + success: true, + }); + } catch (error) { + res.status(400).json({ + message: 'failed to change generation', error: error.message, success: false, }); diff --git a/src/models/audit/audit.model.js b/src/models/audit/audit.model.js index 4851504a..8b671201 100644 --- a/src/models/audit/audit.model.js +++ b/src/models/audit/audit.model.js @@ -1,6 +1,6 @@ 'use strict'; -import Sequelize from 'sequelize'; +import Sequelize, { Op } from 'sequelize'; const { Model } = Sequelize; import { sequelize, safeMirrorDbHandler } from '../../database'; import { AuditMirror } from './audit.model.mirror'; @@ -45,6 +45,23 @@ class Audit extends Model { const [results] = await sequelize.query(findDuplicateIssuancesSql); return results; } + + static async resetToGeneration(generation, orgUid) { + if (orgUid) { + return await Audit.destroy({ + where: { + orgUid: orgUid, + generation: { [Op.gt]: generation }, + }, + }); + } else { + return await Audit.destroy({ + where: { + generation: { [Op.gt]: generation }, + }, + }); + } + } } Audit.init(ModelTypes, { diff --git a/src/routes/v1/resources/audit.js b/src/routes/v1/resources/audit.js index 0a485eed..33cd6a35 100644 --- a/src/routes/v1/resources/audit.js +++ b/src/routes/v1/resources/audit.js @@ -4,7 +4,10 @@ import express from 'express'; import joiExpress from 'express-joi-validation'; import { AuditController } from '../../../controllers'; -import { auditGetSchema } from '../../../validations'; +import { + auditGetSchema, + auditResetGenerationSchema, +} from '../../../validations'; const validator = joiExpress.createValidator({ passError: true }); const AuditRouter = express.Router(); @@ -17,4 +20,12 @@ AuditRouter.get('/findConflicts', (req, res) => { return AuditController.findConflicts(req, res); }); +AuditRouter.post( + '/resetToGeneration', + validator.body(auditResetGenerationSchema), + (req, res) => { + return AuditController.resetToGeneration(req, res); + }, +); + export { AuditRouter }; diff --git a/src/validations/audit.validations.js b/src/validations/audit.validations.js index df44011d..c811ef44 100644 --- a/src/validations/audit.validations.js +++ b/src/validations/audit.validations.js @@ -9,3 +9,8 @@ export const auditGetSchema = Joi.object() }) .with('page', 'limit') .with('limit', 'page'); + +export const auditResetGenerationSchema = Joi.object().keys({ + generation: Joi.number(), + orgUid: Joi.string().optional(), +}); From 69733fc4128402d370b7dd2b87d4b7753061a316 Mon Sep 17 00:00:00 2001 From: William Wills Date: Mon, 27 May 2024 16:56:59 -0400 Subject: [PATCH 10/24] feat: added resetToDate audit endpoint --- src/controllers/audit.controller.js | 26 +++++++++++++++++++++- src/models/audit/audit.model.js | 33 ++++++++++++++++++++++++++++ src/routes/v1/resources/audit.js | 13 +++++++++-- src/validations/audit.validations.js | 7 +++++- 4 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/controllers/audit.controller.js b/src/controllers/audit.controller.js index 51569244..c333ba82 100644 --- a/src/controllers/audit.controller.js +++ b/src/controllers/audit.controller.js @@ -5,7 +5,6 @@ import { optionallyPaginatedResponse, } from '../utils/helpers'; import _ from 'lodash'; - export const findAll = async (req, res) => { try { let { page, limit, orgUid, order } = req.query; @@ -43,6 +42,7 @@ export const findConflicts = async (req, res) => { export const resetToGeneration = async (req, res) => { try { const { generation, orgUid } = req.body; + const result = await Audit.resetToGeneration(generation, orgUid); if (_.isNil(result)) { throw new Error('query failed'); @@ -62,3 +62,27 @@ export const resetToGeneration = async (req, res) => { }); } }; + +export const resetToDate = async (req, res) => { + try { + const { date, orgUid } = req.body; + + const result = orgUid + ? await Audit.resetOrgToDate(date, orgUid) + : await Audit.resetToDate(date); + if (_.isNil(result)) { + throw new Error('query failed'); + } + return res.json({ + message: result ? 'reset to date ' + String(date) : 'no matching records', + recordsDeleted: result, + success: true, + }); + } catch (error) { + res.status(400).json({ + message: 'failed to reset to date', + error: error.message, + success: false, + }); + } +}; diff --git a/src/models/audit/audit.model.js b/src/models/audit/audit.model.js index 8b671201..fc8e034e 100644 --- a/src/models/audit/audit.model.js +++ b/src/models/audit/audit.model.js @@ -62,6 +62,39 @@ class Audit extends Model { }); } } + + static async resetToDate(date) { + const parsedDate = Math.round(date.valueOf() / 1000); + + return await Audit.destroy({ + where: sequelize.where( + sequelize.cast( + sequelize.col('onChainConfirmationTimeStamp'), + 'UNSIGNED', + ), + { + [Sequelize.Op.gte]: parsedDate, + }, + ), + }); + } + + static async resetOrgToDate(date, orgUid) { + const parsedDate = Math.round(date.valueOf() / 1000); + + return await Audit.destroy({ + where: { + orgUid: orgUid, + [Sequelize.Op.and]: sequelize.where( + sequelize.cast( + sequelize.col('onchainConfirmationTimeStamp'), + 'UNSIGNED', + ), + { [Sequelize.Op.gte]: parsedDate }, + ), + }, + }); + } } Audit.init(ModelTypes, { diff --git a/src/routes/v1/resources/audit.js b/src/routes/v1/resources/audit.js index 33cd6a35..60bed495 100644 --- a/src/routes/v1/resources/audit.js +++ b/src/routes/v1/resources/audit.js @@ -6,7 +6,8 @@ import joiExpress from 'express-joi-validation'; import { AuditController } from '../../../controllers'; import { auditGetSchema, - auditResetGenerationSchema, + auditResetToDateSchema, + auditResetToGenerationSchema, } from '../../../validations'; const validator = joiExpress.createValidator({ passError: true }); @@ -22,10 +23,18 @@ AuditRouter.get('/findConflicts', (req, res) => { AuditRouter.post( '/resetToGeneration', - validator.body(auditResetGenerationSchema), + validator.body(auditResetToGenerationSchema), (req, res) => { return AuditController.resetToGeneration(req, res); }, ); +AuditRouter.post( + '/resetToDate', + validator.body(auditResetToDateSchema), + (req, res) => { + return AuditController.resetToDate(req, res); + }, +); + export { AuditRouter }; diff --git a/src/validations/audit.validations.js b/src/validations/audit.validations.js index c811ef44..2bb8475c 100644 --- a/src/validations/audit.validations.js +++ b/src/validations/audit.validations.js @@ -10,7 +10,12 @@ export const auditGetSchema = Joi.object() .with('page', 'limit') .with('limit', 'page'); -export const auditResetGenerationSchema = Joi.object().keys({ +export const auditResetToGenerationSchema = Joi.object().keys({ generation: Joi.number(), orgUid: Joi.string().optional(), }); + +export const auditResetToDateSchema = Joi.object().keys({ + date: Joi.date(), + orgUid: Joi.string().optional(), +}); From f94fe1ee6086b2e97cc131cde45aff11671bc014 Mon Sep 17 00:00:00 2001 From: William Wills Date: Tue, 28 May 2024 10:11:08 -0400 Subject: [PATCH 11/24] fix: reset to date endpoint query fix: handled data base is locked error --- src/controllers/audit.controller.js | 36 +++++++++++++++++++++-------- src/models/audit/audit.model.js | 4 ++-- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/controllers/audit.controller.js b/src/controllers/audit.controller.js index c333ba82..a0f427e8 100644 --- a/src/controllers/audit.controller.js +++ b/src/controllers/audit.controller.js @@ -55,11 +55,19 @@ export const resetToGeneration = async (req, res) => { success: true, }); } catch (error) { - res.status(400).json({ - message: 'failed to change generation', - error: error.message, - success: false, - }); + if (error.message === 'SQLITE_BUSY: database is locked') { + res.status(400).json({ + message: 'failed to change generation', + error: 'cadt is currently syncing, please try again later', + success: false, + }); + } else { + res.status(400).json({ + message: 'failed to change generation', + error: error.message, + success: false, + }); + } } }; @@ -79,10 +87,18 @@ export const resetToDate = async (req, res) => { success: true, }); } catch (error) { - res.status(400).json({ - message: 'failed to reset to date', - error: error.message, - success: false, - }); + if (error.message === 'SQLITE_BUSY: database is locked') { + res.status(400).json({ + message: 'failed to reset to date', + error: 'cadt is currently syncing, please try again later', + success: false, + }); + } else { + res.status(400).json({ + message: 'failed to reset to date', + error: error.message, + success: false, + }); + } } }; diff --git a/src/models/audit/audit.model.js b/src/models/audit/audit.model.js index fc8e034e..d112de46 100644 --- a/src/models/audit/audit.model.js +++ b/src/models/audit/audit.model.js @@ -73,7 +73,7 @@ class Audit extends Model { 'UNSIGNED', ), { - [Sequelize.Op.gte]: parsedDate, + [Sequelize.Op.gt]: parsedDate, }, ), }); @@ -90,7 +90,7 @@ class Audit extends Model { sequelize.col('onchainConfirmationTimeStamp'), 'UNSIGNED', ), - { [Sequelize.Op.gte]: parsedDate }, + { [Sequelize.Op.gt]: parsedDate }, ), }, }); From c813bf50335de37a1c8665ee4fdebb47da3b7f50 Mon Sep 17 00:00:00 2001 From: William Wills Date: Tue, 28 May 2024 11:43:44 -0400 Subject: [PATCH 12/24] chore: addressed PR comments --- src/controllers/audit.controller.js | 6 ++---- src/models/audit/audit.model.js | 19 +++++++------------ 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/controllers/audit.controller.js b/src/controllers/audit.controller.js index a0f427e8..e3eb007a 100644 --- a/src/controllers/audit.controller.js +++ b/src/controllers/audit.controller.js @@ -1,10 +1,10 @@ import { Audit } from '../models'; - +import _ from 'lodash'; import { paginationParams, optionallyPaginatedResponse, } from '../utils/helpers'; -import _ from 'lodash'; + export const findAll = async (req, res) => { try { let { page, limit, orgUid, order } = req.query; @@ -51,7 +51,6 @@ export const resetToGeneration = async (req, res) => { message: result ? 'reset to generation ' + String(generation) : 'no matching records', - recordsDeleted: result, success: true, }); } catch (error) { @@ -83,7 +82,6 @@ export const resetToDate = async (req, res) => { } return res.json({ message: result ? 'reset to date ' + String(date) : 'no matching records', - recordsDeleted: result, success: true, }); } catch (error) { diff --git a/src/models/audit/audit.model.js b/src/models/audit/audit.model.js index d112de46..c77a4ffc 100644 --- a/src/models/audit/audit.model.js +++ b/src/models/audit/audit.model.js @@ -47,20 +47,15 @@ class Audit extends Model { } static async resetToGeneration(generation, orgUid) { + const where = { + generation: { [Op.gt]: generation }, + }; + if (orgUid) { - return await Audit.destroy({ - where: { - orgUid: orgUid, - generation: { [Op.gt]: generation }, - }, - }); - } else { - return await Audit.destroy({ - where: { - generation: { [Op.gt]: generation }, - }, - }); + where.orgUid = orgUid; } + + return await Audit.destroy({ where }); } static async resetToDate(date) { From 93a90dfd16a618ceb31282c1603ef9a6bae128f5 Mon Sep 17 00:00:00 2001 From: William Wills Date: Tue, 28 May 2024 11:43:44 -0400 Subject: [PATCH 13/24] chore: addressed PR comments --- src/controllers/audit.controller.js | 6 ++---- src/models/audit/audit.model.js | 19 +++++++------------ src/validations/audit.validations.js | 2 +- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/controllers/audit.controller.js b/src/controllers/audit.controller.js index a0f427e8..e3eb007a 100644 --- a/src/controllers/audit.controller.js +++ b/src/controllers/audit.controller.js @@ -1,10 +1,10 @@ import { Audit } from '../models'; - +import _ from 'lodash'; import { paginationParams, optionallyPaginatedResponse, } from '../utils/helpers'; -import _ from 'lodash'; + export const findAll = async (req, res) => { try { let { page, limit, orgUid, order } = req.query; @@ -51,7 +51,6 @@ export const resetToGeneration = async (req, res) => { message: result ? 'reset to generation ' + String(generation) : 'no matching records', - recordsDeleted: result, success: true, }); } catch (error) { @@ -83,7 +82,6 @@ export const resetToDate = async (req, res) => { } return res.json({ message: result ? 'reset to date ' + String(date) : 'no matching records', - recordsDeleted: result, success: true, }); } catch (error) { diff --git a/src/models/audit/audit.model.js b/src/models/audit/audit.model.js index d112de46..c77a4ffc 100644 --- a/src/models/audit/audit.model.js +++ b/src/models/audit/audit.model.js @@ -47,20 +47,15 @@ class Audit extends Model { } static async resetToGeneration(generation, orgUid) { + const where = { + generation: { [Op.gt]: generation }, + }; + if (orgUid) { - return await Audit.destroy({ - where: { - orgUid: orgUid, - generation: { [Op.gt]: generation }, - }, - }); - } else { - return await Audit.destroy({ - where: { - generation: { [Op.gt]: generation }, - }, - }); + where.orgUid = orgUid; } + + return await Audit.destroy({ where }); } static async resetToDate(date) { diff --git a/src/validations/audit.validations.js b/src/validations/audit.validations.js index 2bb8475c..fbde7001 100644 --- a/src/validations/audit.validations.js +++ b/src/validations/audit.validations.js @@ -16,6 +16,6 @@ export const auditResetToGenerationSchema = Joi.object().keys({ }); export const auditResetToDateSchema = Joi.object().keys({ - date: Joi.date(), + date: Joi.date().timestamp(), orgUid: Joi.string().optional(), }); From 75f05ef60acc893203795d1c5d2d47a78301ae88 Mon Sep 17 00:00:00 2001 From: William Wills Date: Tue, 28 May 2024 19:02:03 -0400 Subject: [PATCH 14/24] feat: added option to exclude home org feat: added reset-audit-table task --- src/controllers/audit.controller.js | 20 +++++++---- src/models/audit/audit.model.js | 37 ++++++++++++------- src/routes/v1/resources/audit.js | 8 ++--- src/tasks/reset-audit-table.js | 54 ++++++++++++++++++++++++++++ src/utils/defaultConfig.js | 1 + src/validations/audit.validations.js | 5 +-- 6 files changed, 100 insertions(+), 25 deletions(-) create mode 100644 src/tasks/reset-audit-table.js diff --git a/src/controllers/audit.controller.js b/src/controllers/audit.controller.js index e3eb007a..b3a6415c 100644 --- a/src/controllers/audit.controller.js +++ b/src/controllers/audit.controller.js @@ -41,9 +41,13 @@ export const findConflicts = async (req, res) => { export const resetToGeneration = async (req, res) => { try { - const { generation, orgUid } = req.body; + const { generation, orgUid, includeHomeOrg } = req.body; - const result = await Audit.resetToGeneration(generation, orgUid); + const result = await Audit.resetToGeneration( + generation, + orgUid, + includeHomeOrg, + ); if (_.isNil(result)) { throw new Error('query failed'); } @@ -70,18 +74,20 @@ export const resetToGeneration = async (req, res) => { } }; -export const resetToDate = async (req, res) => { +export const resetToTimestamp = async (req, res) => { try { - const { date, orgUid } = req.body; + const { timestamp, orgUid, includeHomeOrg } = req.body; const result = orgUid - ? await Audit.resetOrgToDate(date, orgUid) - : await Audit.resetToDate(date); + ? await Audit.resetOrgToTimestamp(timestamp, orgUid) + : await Audit.resetToTimestamp(timestamp, includeHomeOrg); if (_.isNil(result)) { throw new Error('query failed'); } return res.json({ - message: result ? 'reset to date ' + String(date) : 'no matching records', + message: result + ? 'reset to date ' + String(timestamp) + : 'no matching records', success: true, }); } catch (error) { diff --git a/src/models/audit/audit.model.js b/src/models/audit/audit.model.js index c77a4ffc..91834407 100644 --- a/src/models/audit/audit.model.js +++ b/src/models/audit/audit.model.js @@ -6,6 +6,7 @@ import { sequelize, safeMirrorDbHandler } from '../../database'; import { AuditMirror } from './audit.model.mirror'; import ModelTypes from './audit.modeltypes.cjs'; import findDuplicateIssuancesSql from './sql/find-duplicate-issuances.sql.js'; +import { Organization } from '../organizations/index.js'; class Audit extends Model { static async create(values, options) { @@ -46,11 +47,18 @@ class Audit extends Model { return results; } - static async resetToGeneration(generation, orgUid) { + static async resetToGeneration(generation, orgUid, includeHomeOrg) { + const homeOrg = Organization.getHomeOrg(); + const homeOrgUid = homeOrg?.uid; + const where = { generation: { [Op.gt]: generation }, }; + if (!includeHomeOrg && homeOrgUid && orgUid !== homeOrgUid) { + where.orgUid = { [Op.ne]: homeOrgUid }; + } + if (orgUid) { where.orgUid = orgUid; } @@ -58,24 +66,29 @@ class Audit extends Model { return await Audit.destroy({ where }); } - static async resetToDate(date) { - const parsedDate = Math.round(date.valueOf() / 1000); + static async resetToTimestamp(timestamp, includeHomeOrg) { + const timestampInSeconds = Math.round(timestamp.valueOf() / 1000); + const homeOrgUid = Organization.getHomeOrg()?.uid; - return await Audit.destroy({ - where: sequelize.where( + const conditions = [ + sequelize.where( sequelize.cast( sequelize.col('onChainConfirmationTimeStamp'), 'UNSIGNED', ), - { - [Sequelize.Op.gt]: parsedDate, - }, + { [Sequelize.Op.gt]: timestampInSeconds }, ), - }); + ]; + + if (!includeHomeOrg && homeOrgUid) { + conditions.push({ orguid: { [Sequelize.Op.ne]: homeOrgUid } }); + } + + return await Audit.destroy({ where: { [Sequelize.Op.and]: conditions } }); } - static async resetOrgToDate(date, orgUid) { - const parsedDate = Math.round(date.valueOf() / 1000); + static async resetOrgToTimestamp(timestamp, orgUid) { + const timestampInSeconds = Math.round(timestamp.valueOf() / 1000); return await Audit.destroy({ where: { @@ -85,7 +98,7 @@ class Audit extends Model { sequelize.col('onchainConfirmationTimeStamp'), 'UNSIGNED', ), - { [Sequelize.Op.gt]: parsedDate }, + { [Sequelize.Op.gt]: timestampInSeconds }, ), }, }); diff --git a/src/routes/v1/resources/audit.js b/src/routes/v1/resources/audit.js index 60bed495..211b991c 100644 --- a/src/routes/v1/resources/audit.js +++ b/src/routes/v1/resources/audit.js @@ -6,7 +6,7 @@ import joiExpress from 'express-joi-validation'; import { AuditController } from '../../../controllers'; import { auditGetSchema, - auditResetToDateSchema, + auditResetToTimestampSchema, auditResetToGenerationSchema, } from '../../../validations'; @@ -30,10 +30,10 @@ AuditRouter.post( ); AuditRouter.post( - '/resetToDate', - validator.body(auditResetToDateSchema), + '/resetToTimestamp', + validator.body(auditResetToTimestampSchema), (req, res) => { - return AuditController.resetToDate(req, res); + return AuditController.resetToTimestamp(req, res); }, ); diff --git a/src/tasks/reset-audit-table.js b/src/tasks/reset-audit-table.js new file mode 100644 index 00000000..0b68c1c6 --- /dev/null +++ b/src/tasks/reset-audit-table.js @@ -0,0 +1,54 @@ +import { SimpleIntervalJob, Task } from 'toad-scheduler'; +import { Audit, Meta } from '../models'; +import { logger } from '../config/logger.cjs'; +import { getConfig } from '../utils/config-loader'; +const CONFIG = getConfig().APP; + +import dotenv from 'dotenv'; +dotenv.config(); + +const task = new Task('reset-audit-table', async () => { + try { + const taskHasRun = await Meta.findOne({ + where: { + metaKey: 'may2024AuditResetTaskHasRun', + }, + attributes: ['metaValue'], + }); + + console.log(taskHasRun); + + if (taskHasRun === 'true') { + return; + } + + logger.info('performing audit table reset'); + + const where = { type: 'NO CHANGE' }; + const noChangeEntries = Audit.findAll({ where }); + + if (noChangeEntries) { + return; + } + + await Audit.resetToTimestamp('1715385600000'); // ms timestamp for 5/11/2024 + } catch (error) { + logger.error( + `Retrying in ${ + CONFIG?.TASKS?.GOVERNANCE_SYNC_TASK_INTERVAL || 30 + } seconds`, + error, + ); + } +}); + +const job = new SimpleIntervalJob( + { + seconds: CONFIG?.TASKS?.RESET_AUDIT_TASK_INTERVAL || 30, + runImmediately: true, + }, + task, + { id: 'reset-audit-table', preventOverrun: true }, +); + +export default job; diff --git a/src/utils/defaultConfig.js b/src/utils/defaultConfig.js index 3dd45889..c75a45e5 100644 --- a/src/utils/defaultConfig.js +++ b/src/utils/defaultConfig.js @@ -27,6 +27,7 @@ export const defaultConfig = { ORGANIZATION_META_SYNC_TASK_INTERVAL: 300, PICKLIST_SYNC_TASK_INTERVAL: 60, MIRROR_CHECK_TASK_INTERVAL: 86460, + RESET_AUDIT_TASK_INTERVAL: 300, }, }, GOVERNANCE: { diff --git a/src/validations/audit.validations.js b/src/validations/audit.validations.js index fbde7001..60ce4874 100644 --- a/src/validations/audit.validations.js +++ b/src/validations/audit.validations.js @@ -15,7 +15,8 @@ export const auditResetToGenerationSchema = Joi.object().keys({ orgUid: Joi.string().optional(), }); -export const auditResetToDateSchema = Joi.object().keys({ - date: Joi.date().timestamp(), +export const auditResetToTimestampSchema = Joi.object().keys({ + timestamp: Joi.date().timestamp(), orgUid: Joi.string().optional(), + includeHomeOrg: Joi.bool().optional(), }); From 10285f2554d049eff05203de16fc7fc11c9d5c71 Mon Sep 17 00:00:00 2001 From: William Wills Date: Wed, 29 May 2024 12:07:37 -0400 Subject: [PATCH 15/24] fix: reset audit table task --- src/tasks/index.js | 2 ++ src/tasks/reset-audit-table.js | 28 ++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/tasks/index.js b/src/tasks/index.js index 4ce68209..ac6c0efe 100644 --- a/src/tasks/index.js +++ b/src/tasks/index.js @@ -6,6 +6,7 @@ import syncRegistries from './sync-registries'; import syncOrganizationMeta from './sync-organization-meta'; import syncGovernanceBody from './sync-governance-body'; import mirrorCheck from './mirror-check'; +import resetAuditTable from './reset-audit-table'; const scheduler = new ToadScheduler(); @@ -25,6 +26,7 @@ const start = () => { syncRegistries, syncOrganizationMeta, mirrorCheck, + resetAuditTable, ]; defaultJobs.forEach((defaultJob) => { jobRegistry[defaultJob.id] = defaultJob; diff --git a/src/tasks/reset-audit-table.js b/src/tasks/reset-audit-table.js index 0b68c1c6..7afea1b0 100644 --- a/src/tasks/reset-audit-table.js +++ b/src/tasks/reset-audit-table.js @@ -16,8 +16,6 @@ const task = new Task('reset-audit-table', async () => { attributes: ['metaValue'], }); - console.log(taskHasRun); - if (taskHasRun === 'true') { return; } @@ -25,13 +23,31 @@ const task = new Task('reset-audit-table', async () => { logger.info('performing audit table reset'); const where = { type: 'NO CHANGE' }; - const noChangeEntries = Audit.findAll({ where }); + const noChangeEntries = await Audit.findAll({ where }); - if (noChangeEntries) { - return; + if (noChangeEntries.length) { + const result = await Audit.resetToTimestamp('1715385600000'); // ms timestamp for 5/11/2024 + logger.info( + 'audit table has been reset, records modified: ' + String(result), + ); } - await Audit.resetToTimestamp('1715385600000'); // ms timestamp for 5/11/2024 + if (taskHasRun === null) { + await Meta.create({ + metaKey: 'may2024AuditResetTaskHasRun', + metaValue: 'true', + }); + } else { + await Meta.update( + { metavalue: 'true' }, + { + where: { + metakey: 'may2024AuditResetTaskHasRun', + }, + returning: true, + }, + ); + } } catch (error) { logger.error( `Retrying in ${ From 819ebb0c6be50abfc6ae52f93a638eaa5124d6e1 Mon Sep 17 00:00:00 2001 From: William Wills Date: Wed, 29 May 2024 12:07:37 -0400 Subject: [PATCH 16/24] fix: reset audit table task --- src/tasks/index.js | 2 ++ src/tasks/reset-audit-table.js | 28 ++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/tasks/index.js b/src/tasks/index.js index 4ce68209..ac6c0efe 100644 --- a/src/tasks/index.js +++ b/src/tasks/index.js @@ -6,6 +6,7 @@ import syncRegistries from './sync-registries'; import syncOrganizationMeta from './sync-organization-meta'; import syncGovernanceBody from './sync-governance-body'; import mirrorCheck from './mirror-check'; +import resetAuditTable from './reset-audit-table'; const scheduler = new ToadScheduler(); @@ -25,6 +26,7 @@ const start = () => { syncRegistries, syncOrganizationMeta, mirrorCheck, + resetAuditTable, ]; defaultJobs.forEach((defaultJob) => { jobRegistry[defaultJob.id] = defaultJob; diff --git a/src/tasks/reset-audit-table.js b/src/tasks/reset-audit-table.js index 0b68c1c6..7afea1b0 100644 --- a/src/tasks/reset-audit-table.js +++ b/src/tasks/reset-audit-table.js @@ -16,8 +16,6 @@ const task = new Task('reset-audit-table', async () => { attributes: ['metaValue'], }); - console.log(taskHasRun); - if (taskHasRun === 'true') { return; } @@ -25,13 +23,31 @@ const task = new Task('reset-audit-table', async () => { logger.info('performing audit table reset'); const where = { type: 'NO CHANGE' }; - const noChangeEntries = Audit.findAll({ where }); + const noChangeEntries = await Audit.findAll({ where }); - if (noChangeEntries) { - return; + if (noChangeEntries.length) { + const result = await Audit.resetToTimestamp('1715385600000'); // ms timestamp for 5/11/2024 + logger.info( + 'audit table has been reset, records modified: ' + String(result), + ); } - await Audit.resetToTimestamp('1715385600000'); // ms timestamp for 5/11/2024 + if (taskHasRun === null) { + await Meta.create({ + metaKey: 'may2024AuditResetTaskHasRun', + metaValue: 'true', + }); + } else { + await Meta.update( + { metavalue: 'true' }, + { + where: { + metakey: 'may2024AuditResetTaskHasRun', + }, + returning: true, + }, + ); + } } catch (error) { logger.error( `Retrying in ${ From 4541b1b00dad277b1c91bee6c44d8a5030a08665 Mon Sep 17 00:00:00 2001 From: William Wills Date: Wed, 29 May 2024 12:53:39 -0400 Subject: [PATCH 17/24] fix: reset to generation validation schema --- src/validations/audit.validations.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/validations/audit.validations.js b/src/validations/audit.validations.js index 60ce4874..06235c06 100644 --- a/src/validations/audit.validations.js +++ b/src/validations/audit.validations.js @@ -13,6 +13,7 @@ export const auditGetSchema = Joi.object() export const auditResetToGenerationSchema = Joi.object().keys({ generation: Joi.number(), orgUid: Joi.string().optional(), + includeHomeOrg: Joi.bool().optional(), }); export const auditResetToTimestampSchema = Joi.object().keys({ From 729e79dc3e2fcf5ba3af18b20ed06e15b901daae Mon Sep 17 00:00:00 2001 From: William Wills Date: Wed, 29 May 2024 14:20:22 -0400 Subject: [PATCH 18/24] fix: task meta data retrieval --- src/tasks/reset-audit-table.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tasks/reset-audit-table.js b/src/tasks/reset-audit-table.js index 7afea1b0..e16bf350 100644 --- a/src/tasks/reset-audit-table.js +++ b/src/tasks/reset-audit-table.js @@ -9,11 +9,12 @@ dotenv.config(); const task = new Task('reset-audit-table', async () => { try { - const taskHasRun = await Meta.findOne({ + const { metaValue: taskHasRun } = await Meta.findOne({ where: { metaKey: 'may2024AuditResetTaskHasRun', }, attributes: ['metaValue'], + raw: true, }); if (taskHasRun === 'true') { From 5b8bcbe51fbb6a8ce6059977a2e23086550bdf56 Mon Sep 17 00:00:00 2001 From: William Wills Date: Wed, 29 May 2024 15:11:44 -0400 Subject: [PATCH 19/24] fix: task meta data retrieval feat: renamed resetToTimestamp to resetToDate feat: made orgUid mandatory for reset to generation --- src/controllers/audit.controller.js | 16 +++++++--------- src/models/audit/audit.model.js | 4 ++-- src/routes/v1/resources/audit.js | 8 ++++---- src/tasks/reset-audit-table.js | 9 ++++++--- src/validations/audit.validations.js | 6 +++--- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/controllers/audit.controller.js b/src/controllers/audit.controller.js index 015576a7..131637e3 100644 --- a/src/controllers/audit.controller.js +++ b/src/controllers/audit.controller.js @@ -74,32 +74,30 @@ export const resetToGeneration = async (req, res) => { } }; -export const resetToTimestamp = async (req, res) => { +export const resetToDate = async (req, res) => { try { - const { timestamp, orgUid, includeHomeOrg } = req.body; + const { date, orgUid, includeHomeOrg } = req.body; const result = orgUid - ? await Audit.resetOrgToTimestamp(timestamp, orgUid) - : await Audit.resetToTimestamp(timestamp, includeHomeOrg); + ? await Audit.resetOrgToDate(date, orgUid) + : await Audit.resetToDate(date, includeHomeOrg); if (_.isNil(result)) { throw new Error('query failed'); } return res.json({ - message: result - ? 'reset to timestamp ' + String(timestamp) - : 'no matching records', + message: result ? 'reset to date ' + String(date) : 'no matching records', success: true, }); } catch (error) { if (error.message === 'SQLITE_BUSY: database is locked') { res.status(400).json({ - message: 'failed to reset to timestamp', + message: 'failed to reset to date', error: 'cadt is currently syncing, please try again later', success: false, }); } else { res.status(400).json({ - message: 'failed to reset to timestamp', + message: 'failed to reset to date', error: error.message, success: false, }); diff --git a/src/models/audit/audit.model.js b/src/models/audit/audit.model.js index d35474fd..1cb0f747 100644 --- a/src/models/audit/audit.model.js +++ b/src/models/audit/audit.model.js @@ -66,7 +66,7 @@ class Audit extends Model { return await Audit.destroy({ where }); } - static async resetToTimestamp(timestamp, includeHomeOrg) { + static async resetToDate(timestamp, includeHomeOrg) { const timestampInSeconds = Math.round(timestamp.valueOf() / 1000); const homeOrgUid = Organization.getHomeOrg()?.uid; @@ -87,7 +87,7 @@ class Audit extends Model { return await Audit.destroy({ where: { [Sequelize.Op.and]: conditions } }); } - static async resetOrgToTimestamp(timestamp, orgUid) { + static async resetOrgToDate(timestamp, orgUid) { const timestampInSeconds = Math.round(timestamp.valueOf() / 1000); return await Audit.destroy({ diff --git a/src/routes/v1/resources/audit.js b/src/routes/v1/resources/audit.js index 211b991c..60bed495 100644 --- a/src/routes/v1/resources/audit.js +++ b/src/routes/v1/resources/audit.js @@ -6,7 +6,7 @@ import joiExpress from 'express-joi-validation'; import { AuditController } from '../../../controllers'; import { auditGetSchema, - auditResetToTimestampSchema, + auditResetToDateSchema, auditResetToGenerationSchema, } from '../../../validations'; @@ -30,10 +30,10 @@ AuditRouter.post( ); AuditRouter.post( - '/resetToTimestamp', - validator.body(auditResetToTimestampSchema), + '/resetToDate', + validator.body(auditResetToDateSchema), (req, res) => { - return AuditController.resetToTimestamp(req, res); + return AuditController.resetToDate(req, res); }, ); diff --git a/src/tasks/reset-audit-table.js b/src/tasks/reset-audit-table.js index e16bf350..ea601f04 100644 --- a/src/tasks/reset-audit-table.js +++ b/src/tasks/reset-audit-table.js @@ -5,11 +5,12 @@ import { getConfig } from '../utils/config-loader'; const CONFIG = getConfig().APP; import dotenv from 'dotenv'; +import _ from 'lodash'; dotenv.config(); const task = new Task('reset-audit-table', async () => { try { - const { metaValue: taskHasRun } = await Meta.findOne({ + const metaResult = await Meta.findOne({ where: { metaKey: 'may2024AuditResetTaskHasRun', }, @@ -17,6 +18,8 @@ const task = new Task('reset-audit-table', async () => { raw: true, }); + const taskHasRun = metaResult?.metaValue; + if (taskHasRun === 'true') { return; } @@ -27,13 +30,13 @@ const task = new Task('reset-audit-table', async () => { const noChangeEntries = await Audit.findAll({ where }); if (noChangeEntries.length) { - const result = await Audit.resetToTimestamp('1715385600000'); // ms timestamp for 5/11/2024 + const result = await Audit.resetToDate('2024-05-11'); logger.info( 'audit table has been reset, records modified: ' + String(result), ); } - if (taskHasRun === null) { + if (_.isNil(taskHasRun)) { await Meta.create({ metaKey: 'may2024AuditResetTaskHasRun', metaValue: 'true', diff --git a/src/validations/audit.validations.js b/src/validations/audit.validations.js index 06235c06..295cb5e0 100644 --- a/src/validations/audit.validations.js +++ b/src/validations/audit.validations.js @@ -12,12 +12,12 @@ export const auditGetSchema = Joi.object() export const auditResetToGenerationSchema = Joi.object().keys({ generation: Joi.number(), - orgUid: Joi.string().optional(), + orgUid: Joi.string(), includeHomeOrg: Joi.bool().optional(), }); -export const auditResetToTimestampSchema = Joi.object().keys({ - timestamp: Joi.date().timestamp(), +export const auditResetToDateSchema = Joi.object().keys({ + date: Joi.date(), orgUid: Joi.string().optional(), includeHomeOrg: Joi.bool().optional(), }); From 4a5845d8eaa880500739903452ef04f954bccfd1 Mon Sep 17 00:00:00 2001 From: William Wills Date: Wed, 29 May 2024 15:58:38 -0400 Subject: [PATCH 20/24] fix: reset to date fix: reset org to date --- src/models/audit/audit.model.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/models/audit/audit.model.js b/src/models/audit/audit.model.js index 1cb0f747..54c7d8bc 100644 --- a/src/models/audit/audit.model.js +++ b/src/models/audit/audit.model.js @@ -66,8 +66,8 @@ class Audit extends Model { return await Audit.destroy({ where }); } - static async resetToDate(timestamp, includeHomeOrg) { - const timestampInSeconds = Math.round(timestamp.valueOf() / 1000); + static async resetToDate(date, includeHomeOrg) { + const timestampInSeconds = Math.round(new Date(date).valueOf() / 1000); const homeOrgUid = Organization.getHomeOrg()?.uid; const conditions = [ @@ -87,8 +87,8 @@ class Audit extends Model { return await Audit.destroy({ where: { [Sequelize.Op.and]: conditions } }); } - static async resetOrgToDate(timestamp, orgUid) { - const timestampInSeconds = Math.round(timestamp.valueOf() / 1000); + static async resetOrgToDate(date, orgUid) { + const timestampInSeconds = Math.round(new Date(date).valueOf() / 1000); return await Audit.destroy({ where: { From e23ccbac18dabbef4b2cb7cc606a4df4c7174bbb Mon Sep 17 00:00:00 2001 From: William Wills Date: Wed, 29 May 2024 16:27:40 -0400 Subject: [PATCH 21/24] chore: removed unnecessary option for reset to generation --- src/controllers/audit.controller.js | 8 ++------ src/models/audit/audit.model.js | 9 +-------- src/validations/audit.validations.js | 1 - 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/controllers/audit.controller.js b/src/controllers/audit.controller.js index 131637e3..da9ec7ab 100644 --- a/src/controllers/audit.controller.js +++ b/src/controllers/audit.controller.js @@ -41,13 +41,9 @@ export const findConflicts = async (req, res) => { export const resetToGeneration = async (req, res) => { try { - const { generation, orgUid, includeHomeOrg } = req.body; + const { generation, orgUid } = req.body; - const result = await Audit.resetToGeneration( - generation, - orgUid, - includeHomeOrg, - ); + const result = await Audit.resetToGeneration(generation, orgUid); if (_.isNil(result)) { throw new Error('query failed'); } diff --git a/src/models/audit/audit.model.js b/src/models/audit/audit.model.js index 54c7d8bc..e10057df 100644 --- a/src/models/audit/audit.model.js +++ b/src/models/audit/audit.model.js @@ -47,18 +47,11 @@ class Audit extends Model { return results; } - static async resetToGeneration(generation, orgUid, includeHomeOrg) { - const homeOrg = Organization.getHomeOrg(); - const homeOrgUid = homeOrg?.uid; - + static async resetToGeneration(generation, orgUid) { const where = { generation: { [Sequelize.Op.gt]: generation }, }; - if (!includeHomeOrg && homeOrgUid && orgUid !== homeOrgUid) { - where.orgUid = { [Sequelize.Op.ne]: homeOrgUid }; - } - if (orgUid) { where.orgUid = orgUid; } diff --git a/src/validations/audit.validations.js b/src/validations/audit.validations.js index 295cb5e0..9a017b69 100644 --- a/src/validations/audit.validations.js +++ b/src/validations/audit.validations.js @@ -13,7 +13,6 @@ export const auditGetSchema = Joi.object() export const auditResetToGenerationSchema = Joi.object().keys({ generation: Joi.number(), orgUid: Joi.string(), - includeHomeOrg: Joi.bool().optional(), }); export const auditResetToDateSchema = Joi.object().keys({ From 2b015c2f2b9de5330388b93b7c865eb83be7ad38 Mon Sep 17 00:00:00 2001 From: William Wills Date: Thu, 30 May 2024 16:43:48 -0400 Subject: [PATCH 22/24] feat: added read-only check to reset date and audit endpoints --- src/controllers/audit.controller.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/controllers/audit.controller.js b/src/controllers/audit.controller.js index da9ec7ab..eae5735e 100644 --- a/src/controllers/audit.controller.js +++ b/src/controllers/audit.controller.js @@ -4,6 +4,7 @@ import { paginationParams, optionallyPaginatedResponse, } from '../utils/helpers'; +import { assertIfReadOnlyMode } from '../utils/data-assertions.js'; export const findAll = async (req, res) => { try { @@ -41,6 +42,7 @@ export const findConflicts = async (req, res) => { export const resetToGeneration = async (req, res) => { try { + await assertIfReadOnlyMode(); const { generation, orgUid } = req.body; const result = await Audit.resetToGeneration(generation, orgUid); @@ -72,6 +74,7 @@ export const resetToGeneration = async (req, res) => { export const resetToDate = async (req, res) => { try { + await assertIfReadOnlyMode(); const { date, orgUid, includeHomeOrg } = req.body; const result = orgUid From b6e1c6c27dc85a11af67d72d7e865955835bc468 Mon Sep 17 00:00:00 2001 From: Chia Automation Date: Fri, 31 May 2024 16:02:33 +0000 Subject: [PATCH 23/24] Update dependabot --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6ce1d1e9..61032e39 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -54,3 +54,14 @@ updates: - javascript - "Changed" reviewers: ["cmmarslender", "emlowe"] + + - package-ecosystem: cargo + directory: / + schedule: + interval: "weekly" + day: "tuesday" + open-pull-requests-limit: 10 + labels: + - dependencies + - rust + - "Changed" From 7de1b68494ec77f4f90111741397998c7b0f4a96 Mon Sep 17 00:00:00 2001 From: William Wills Date: Fri, 31 May 2024 14:36:54 -0400 Subject: [PATCH 24/24] chore: removed reset task interval from config --- src/tasks/reset-audit-table.js | 12 ++---------- src/utils/defaultConfig.js | 1 - 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/tasks/reset-audit-table.js b/src/tasks/reset-audit-table.js index ea601f04..bf715819 100644 --- a/src/tasks/reset-audit-table.js +++ b/src/tasks/reset-audit-table.js @@ -1,9 +1,6 @@ import { SimpleIntervalJob, Task } from 'toad-scheduler'; import { Audit, Meta } from '../models'; import { logger } from '../config/logger.cjs'; -import { getConfig } from '../utils/config-loader'; -const CONFIG = getConfig().APP; - import dotenv from 'dotenv'; import _ from 'lodash'; dotenv.config(); @@ -53,18 +50,13 @@ const task = new Task('reset-audit-table', async () => { ); } } catch (error) { - logger.error( - `Retrying in ${ - CONFIG?.TASKS?.GOVERNANCE_SYNC_TASK_INTERVAL || 30 - } seconds`, - error, - ); + logger.error('Retrying in 600 seconds', error); } }); const job = new SimpleIntervalJob( { - seconds: CONFIG?.TASKS?.RESET_AUDIT_TASK_INTERVAL || 30, + seconds: 600, runImmediately: true, }, task, diff --git a/src/utils/defaultConfig.js b/src/utils/defaultConfig.js index c75a45e5..3dd45889 100644 --- a/src/utils/defaultConfig.js +++ b/src/utils/defaultConfig.js @@ -27,7 +27,6 @@ export const defaultConfig = { ORGANIZATION_META_SYNC_TASK_INTERVAL: 300, PICKLIST_SYNC_TASK_INTERVAL: 60, MIRROR_CHECK_TASK_INTERVAL: 86460, - RESET_AUDIT_TASK_INTERVAL: 300, }, }, GOVERNANCE: {