diff --git a/package-lock.json b/package-lock.json index 02b963db..f2abaa2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -673,12 +673,12 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -686,9 +686,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -761,25 +761,25 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", - "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", + "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==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -798,15 +798,15 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", - "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -842,9 +842,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "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==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -884,22 +884,36 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "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==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "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==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -918,40 +932,40 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "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==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@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.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -994,14 +1008,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "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==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1011,13 +1025,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -1073,58 +1087,86 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "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==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "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==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -1133,9 +1175,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1145,9 +1187,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1160,14 +1202,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1180,6 +1222,7 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -1210,6 +1253,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -1473,9 +1517,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", - "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", + "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -1523,9 +1567,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", - "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1554,12 +1598,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1571,18 +1615,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1622,9 +1666,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", - "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1668,9 +1712,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1700,9 +1744,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1716,9 +1760,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1748,9 +1792,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1779,9 +1823,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1810,12 +1854,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1826,12 +1870,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1843,15 +1887,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1908,9 +1952,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1924,9 +1968,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1940,16 +1984,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1975,9 +2019,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1991,9 +2035,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", - "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2008,9 +2052,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2039,13 +2083,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -2422,19 +2466,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", + "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@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.22.10", - "@babel/types": "^7.22.10", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2443,12 +2487,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -2470,13 +2514,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2869,9 +2913,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", - "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2923,9 +2967,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2968,18 +3012,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -3963,20 +4007,20 @@ } }, "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.3.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "engines": { "node": ">= 16" }, @@ -4435,7 +4479,7 @@ } }, "node_modules/@polkadapt/subsquid": { - "version": "1.0.0", + "version": "1.0.2", "resolved": "file:polkadapt/dist/subsquid", "license": "Apache-2.0", "dependencies": { @@ -4539,30 +4583,30 @@ } }, "node_modules/@polkadot/keyring": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-12.4.1.tgz", - "integrity": "sha512-raVOJ+xJSOFUou7LwQkNzPWwUXH0E5Y0ATds2blbKQxqNh9OWTA9HW3Z80mvqz2J7ltpaML/2zDuHAOYbo7l/A==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-12.5.1.tgz", + "integrity": "sha512-u6b+Q7wI6WY/vwmJS9uUHy/5hKZ226nTlVNmxjkj9GvrRsQvUSwS94163yHPJwiZJiIv5xK5m0rwCMyoYu+wjA==", "dependencies": { - "@polkadot/util": "12.4.1", - "@polkadot/util-crypto": "12.4.1", - "tslib": "^2.6.1" + "@polkadot/util": "12.5.1", + "@polkadot/util-crypto": "12.5.1", + "tslib": "^2.6.2" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@polkadot/util": "12.4.1", - "@polkadot/util-crypto": "12.4.1" + "@polkadot/util": "12.5.1", + "@polkadot/util-crypto": "12.5.1" } }, "node_modules/@polkadot/networks": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-12.4.1.tgz", - "integrity": "sha512-plVju5afj5vpa5qv2/2DKtmpGQSHxAjKJVpWf8x74IeesGEflaoyz1vISLPDor9U8X/MNmj5glSbqXeFVA10kA==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-12.5.1.tgz", + "integrity": "sha512-PP6UUdzz6iHHZH4q96cUEhTcydHj16+61sqeaYEJSF6Q9iY+5WVWQ26+rdjmre/EBdrMQkSS/CKy73mO5z/JkQ==", "dependencies": { - "@polkadot/util": "12.4.1", + "@polkadot/util": "12.5.1", "@substrate/ss58-registry": "^1.43.0", - "tslib": "^2.6.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=16" @@ -4727,43 +4771,43 @@ } }, "node_modules/@polkadot/util": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-12.4.1.tgz", - "integrity": "sha512-msKecQxYwi/1AEkBvvqE7SdbomDl/0xUe77jzhU9rtOlmHnUhTei5cOiFlXqMD3vxMH7hfh+80u2MnexXgeqHA==", - "dependencies": { - "@polkadot/x-bigint": "12.4.1", - "@polkadot/x-global": "12.4.1", - "@polkadot/x-textdecoder": "12.4.1", - "@polkadot/x-textencoder": "12.4.1", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-12.5.1.tgz", + "integrity": "sha512-fDBZL7D4/baMG09Qowseo884m3QBzErGkRWNBId1UjWR99kyex+cIY9fOSzmuQxo6nLdJlLHw1Nz2caN3+Bq0A==", + "dependencies": { + "@polkadot/x-bigint": "12.5.1", + "@polkadot/x-global": "12.5.1", + "@polkadot/x-textdecoder": "12.5.1", + "@polkadot/x-textencoder": "12.5.1", "@types/bn.js": "^5.1.1", "bn.js": "^5.2.1", - "tslib": "^2.6.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=16" } }, "node_modules/@polkadot/util-crypto": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-12.4.1.tgz", - "integrity": "sha512-An1OIenXThmEMjmbkP9oL8B/YCfQbjfERRegOPZ9QHFEEX90D7FAjl0JEBsR+h+Bh9Crxw8Cnfba0gqNwhcUQA==", - "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@polkadot/networks": "12.4.1", - "@polkadot/util": "12.4.1", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-12.5.1.tgz", + "integrity": "sha512-Y8ORbMcsM/VOqSG3DgqutRGQ8XXK+X9M3C8oOEI2Tji65ZsXbh9Yh+ryPLM0oBp/9vqOXjkLgZJbbVuQceOw0A==", + "dependencies": { + "@noble/curves": "^1.2.0", + "@noble/hashes": "^1.3.2", + "@polkadot/networks": "12.5.1", + "@polkadot/util": "12.5.1", "@polkadot/wasm-crypto": "^7.2.2", "@polkadot/wasm-util": "^7.2.2", - "@polkadot/x-bigint": "12.4.1", - "@polkadot/x-randomvalues": "12.4.1", - "@scure/base": "1.1.1", - "tslib": "^2.6.1" + "@polkadot/x-bigint": "12.5.1", + "@polkadot/x-randomvalues": "12.5.1", + "@scure/base": "^1.1.3", + "tslib": "^2.6.2" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@polkadot/util": "12.4.1" + "@polkadot/util": "12.5.1" } }, "node_modules/@polkadot/wasm-bridge": { @@ -4865,89 +4909,89 @@ } }, "node_modules/@polkadot/x-bigint": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-12.4.1.tgz", - "integrity": "sha512-Wc5udWkRvZJpdISNmnVEwgtyyb/cPHk2YyqdGv9OnEmrG/gLQpmfPVnoxCYNvxq2qyv4klgAdrKcPTG0XvBOTA==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-12.5.1.tgz", + "integrity": "sha512-Fw39eoN9v0sqxSzfSC5awaDVdzojIiE7d1hRSQgVSrES+8whWvtbYMR0qwbVhTuW7DvogHmye41P9xKMlXZysg==", "dependencies": { - "@polkadot/x-global": "12.4.1", - "tslib": "^2.6.1" + "@polkadot/x-global": "12.5.1", + "tslib": "^2.6.2" }, "engines": { "node": ">=16" } }, "node_modules/@polkadot/x-fetch": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-12.4.1.tgz", - "integrity": "sha512-9EuUiXFwLAuyK8B/9i413vIGAKtD5LDcBJWSlsCknXMCn81Qy8Td7kdPohPVtXJkydcW+oW8Qoa2IYviCLjdpg==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-12.5.1.tgz", + "integrity": "sha512-Bc019lOKCoQJrthiS+H3LwCahGtl5tNnb2HK7xe3DBQIUx9r2HsF/uEngNfMRUFkUYg5TPCLFbEWU8NIREBS1A==", "dependencies": { - "@polkadot/x-global": "12.4.1", + "@polkadot/x-global": "12.5.1", "node-fetch": "^3.3.2", - "tslib": "^2.6.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=16" } }, "node_modules/@polkadot/x-global": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-12.4.1.tgz", - "integrity": "sha512-r83Bd/VE6Gq5aXhIX0DUQWn3XF1c9ZH5AxqD1wwUiU3DQ5sKcO9DXRm5+sJ9ZTZrAl0efkix97TAygH+GXWD7Q==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-12.5.1.tgz", + "integrity": "sha512-6K0YtWEg0eXInDOihU5aSzeb1t9TiDdX9ZuRly+58ALSqw5kPZYmQLbzE1d8HWzyXRXK+YH65GtLzfMGqfYHmw==", "dependencies": { - "tslib": "^2.6.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=16" } }, "node_modules/@polkadot/x-randomvalues": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-12.4.1.tgz", - "integrity": "sha512-53C9SJLRFjyNpgzxHxm+BRPiSk0KyjfSnwnae9+kFgRm7lMuHF+mAD+FfA4JOm2aDhgPHJcbF0iRz4vMIJEoLw==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-12.5.1.tgz", + "integrity": "sha512-UsMb1d+77EPNjW78BpHjZLIm4TaIpfqq89OhZP/6gDIoS2V9iE/AK3jOWKm1G7Y2F8XIoX1qzQpuMakjfagFoQ==", "dependencies": { - "@polkadot/x-global": "12.4.1", - "tslib": "^2.6.1" + "@polkadot/x-global": "12.5.1", + "tslib": "^2.6.2" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@polkadot/util": "12.4.1", + "@polkadot/util": "12.5.1", "@polkadot/wasm-util": "*" } }, "node_modules/@polkadot/x-textdecoder": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-12.4.1.tgz", - "integrity": "sha512-8P4j8ORy4M6mK1+S1VzW/Jv/+LY7hggZUfxOyTbPAZPDACs86qtbVksUMdhh8kJvLwXuqpdAPtGDv7qrTsb3Rw==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-12.5.1.tgz", + "integrity": "sha512-j2YZGWfwhMC8nHW3BXq10fAPY02ObLL/qoTjCMJ1Cmc/OGq18Ep7k9cXXbjFAq3wf3tUUewt/u/hStKCk3IvfQ==", "dependencies": { - "@polkadot/x-global": "12.4.1", - "tslib": "^2.6.1" + "@polkadot/x-global": "12.5.1", + "tslib": "^2.6.2" }, "engines": { "node": ">=16" } }, "node_modules/@polkadot/x-textencoder": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-12.4.1.tgz", - "integrity": "sha512-L/q7BOTcKAH/9gyH1pGtUXNWGZW/uzN9Z2vnJfrAifdXWKiALOeK2WmiObhGKWf8gXlooxEhjbJQUigI1J41rg==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-12.5.1.tgz", + "integrity": "sha512-1JNNpOGb4wD+c7zFuOqjibl49LPnHNr4rj4s3WflLUIZvOMY6euoDuN3ISjQSHCLlVSoH0sOCWA3qXZU4bCTDQ==", "dependencies": { - "@polkadot/x-global": "12.4.1", - "tslib": "^2.6.1" + "@polkadot/x-global": "12.5.1", + "tslib": "^2.6.2" }, "engines": { "node": ">=16" } }, "node_modules/@polkadot/x-ws": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-12.4.1.tgz", - "integrity": "sha512-DLy02L7XR5L2MhWFwMiVFsSAHN/Jf0eqDX6ObtWGKym2PmOCAjKvyWk3cOEtCufMN4IMv5nuhs8zjPy60gEulw==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-12.5.1.tgz", + "integrity": "sha512-efNMhB3Lh6pW2iTipMkqwrjpuUtb3EwR/jYZftiIGo5tDPB7rqoMOp9s6KRFJEIUfZkLnMUtbkZ5fHzUJaCjmQ==", "dependencies": { - "@polkadot/x-global": "12.4.1", - "tslib": "^2.6.1", - "ws": "^8.13.0" + "@polkadot/x-global": "12.5.1", + "tslib": "^2.6.2", + "ws": "^8.14.1" }, "engines": { "node": ">=16" @@ -4970,15 +5014,12 @@ } }, "node_modules/@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", + "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/@sigstore/bundle": { "version": "1.1.0", @@ -5118,17 +5159,17 @@ } }, "node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", + "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", "dev": true, "dependencies": { "@types/connect": "*", @@ -5136,27 +5177,27 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.11.tgz", + "integrity": "sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", + "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -5170,18 +5211,18 @@ "dev": true }, "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", + "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "version": "8.44.3", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.3.tgz", + "integrity": "sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -5189,9 +5230,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.5.tgz", + "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -5199,15 +5240,15 @@ } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", + "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", "dev": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.18", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", + "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -5217,9 +5258,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "version": "4.17.37", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", + "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", "dev": true, "dependencies": { "@types/node": "*", @@ -5229,53 +5270,56 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", + "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==", "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "version": "1.17.12", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.12.tgz", + "integrity": "sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/jasmine": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.5.tgz", - "integrity": "sha512-9YHUdvuNDDRJYXZwHqSsO72Ok0vmqoJbNn73ttyITQp/VA60SarnZ+MPLD37rJAhVoKp+9BWOvJP5tHIRfZylQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.6.tgz", + "integrity": "sha512-3N0FpQTeiWjm+Oo1WUYWguUS7E6JLceiGTriFrG8k5PU7zRLJCzLcWURU3wjMbZGS//a2/LgjsnO3QxIlwxt9g==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", + "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==", "dev": true }, "node_modules/@types/node": { - "version": "20.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.2.tgz", - "integrity": "sha512-5j/lXt7unfPOUlrKC34HIaedONleyLtwkKggiD/0uuMfT8gg2EOpg0dz4lCD15Ga7muC+1WzJZAjIB9simWd6Q==" + "version": "20.8.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", + "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "dependencies": { + "undici-types": "~5.25.1" + } }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", + "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==", "dev": true }, "node_modules/@types/retry": { @@ -5285,15 +5329,15 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", + "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -5301,18 +5345,18 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", + "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", "dev": true, "dependencies": { "@types/http-errors": "*", @@ -5321,18 +5365,18 @@ } }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.34", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.34.tgz", + "integrity": "sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.6.tgz", + "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==", "dev": true, "dependencies": { "@types/node": "*" @@ -5725,9 +5769,9 @@ "dev": true }, "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.49", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.49.tgz", - "integrity": "sha512-e6inWHiEoAmazVwYWSSBo+vKvq6Coz5CK41GkP9OKvvJOZWZRk1IFEK4unTxAzJK4ivUkF1r+kbfiy/xngslfA==", + "version": "3.0.0-rc.53", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.53.tgz", + "integrity": "sha512-kprOp3hV9l7B9oqjgTQIM04mmEaYBYcccUXVIM1NFFf10HqnD9joTfZ1cAqx9lpccWzgUnHkrhVwhhlGjPzyIw==", "dev": true, "dependencies": { "js-yaml": "^3.10.0", @@ -6128,9 +6172,9 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -6204,13 +6248,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz", + "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" + "core-js-compat": "^3.32.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6470,9 +6514,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -6489,10 +6533,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -6617,9 +6661,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001522", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", - "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "version": "1.0.30001547", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", + "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", "dev": true, "funding": [ { @@ -7114,12 +7158,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", + "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", "dev": true, "dependencies": { - "browserslist": "^4.21.10" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", @@ -7146,14 +7190,14 @@ } }, "node_modules/cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "import-fresh": "^3.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", + "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "engines": { @@ -7161,6 +7205,14 @@ }, "funding": { "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cosmiconfig/node_modules/argparse": { @@ -7505,6 +7557,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -7515,11 +7581,12 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -7619,9 +7686,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -7752,9 +7819,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.498", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.498.tgz", - "integrity": "sha512-4LODxAzKGVy7CJyhhN5mebwe7U2L29P+0G+HUriHnabm0d7LSff8Yn7t+Wq+2/9ze2Fu1dhX7mww090xfv7qXQ==", + "version": "1.4.548", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.548.tgz", + "integrity": "sha512-R77KD6mXv37DOyKLN/eW1rGS61N6yHOfapNSX9w+y9DdPG83l9Gkuv7qkCFZ4Ta4JPhrjgQfYbv4Y3TnM1Hi2Q==", "dev": true }, "node_modules/elliptic": { @@ -7833,9 +7900,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.2.tgz", - "integrity": "sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.3.tgz", + "integrity": "sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -7984,9 +8051,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/esbuild": { @@ -8063,16 +8130,16 @@ } }, "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -8256,9 +8323,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -8920,28 +8987,29 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, "funding": [ { @@ -9018,16 +9086,16 @@ } }, "node_modules/fraction.js": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.1.tgz", - "integrity": "sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { @@ -9072,18 +9140,18 @@ } }, "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", "dev": true }, "node_modules/fs.realpath": { @@ -9201,19 +9269,19 @@ } }, "node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", + "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { - "glob": "dist/cjs/src/bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -9330,13 +9398,10 @@ "dev": true }, "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, "engines": { "node": ">= 0.4.0" } @@ -9827,9 +9892,9 @@ } }, "node_modules/immutable": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.2.tgz", - "integrity": "sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", "dev": true }, "node_modules/import-fresh": { @@ -10565,9 +10630,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.0.tgz", - "integrity": "sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -10729,9 +10794,9 @@ } }, "node_modules/jiti": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", - "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -10768,6 +10833,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -10997,6 +11068,15 @@ "node": ">=10" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -11016,13 +11096,13 @@ } }, "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, "dependencies": { "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "shell-quote": "^1.8.1" } }, "node_modules/less": { @@ -11626,9 +11706,9 @@ } }, "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -11796,9 +11876,9 @@ } }, "node_modules/mock-socket": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.2.1.tgz", - "integrity": "sha512-aw9F9T9G2zpGipLLhSNh6ZpgUyUl4frcVmRN08uE1NWPWg43Wx6+sGPDbQ7E5iFZZDJW5b5bypMeAEHqTbIFag==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", + "integrity": "sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==", "engines": { "node": ">= 8" } @@ -12027,9 +12107,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", "dev": true, "bin": { "node-gyp-build": "bin.js", @@ -12124,9 +12204,9 @@ } }, "node_modules/npm-install-checks": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", - "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "dependencies": { "semver": "^7.1.1" @@ -13519,9 +13599,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -13552,14 +13632,14 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -13784,9 +13864,9 @@ } }, "node_modules/rollup": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", - "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -13924,9 +14004,9 @@ } }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", "dev": true, "optional": true }, @@ -14165,6 +14245,20 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -14502,9 +14596,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "node_modules/spdy": { @@ -14556,9 +14650,9 @@ } }, "node_modules/ssri/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -14793,9 +14887,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -15182,9 +15276,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", - "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "version": "0.7.36", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.36.tgz", + "integrity": "sha512-CPPLoCts2p7D8VbybttE3P2ylv0OBZEAy7a12DsulIEcAiMtWJy+PBgMXgWDI80D5UwqE8oQPHYnk13tm38M2Q==", "dev": true, "funding": [ { @@ -15194,12 +15288,21 @@ { "type": "paypal", "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } ], "engines": { "node": "*" } }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -15283,9 +15386,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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==", "dev": true, "funding": [ { @@ -15959,9 +16062,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "engines": { "node": ">=10.0.0" }, @@ -16047,9 +16150,9 @@ } }, "node_modules/zone.js": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.1.tgz", - "integrity": "sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", "dependencies": { "tslib": "^2.3.0" } diff --git a/polkadapt b/polkadapt index 9782a3ed..422aa06a 160000 --- a/polkadapt +++ b/polkadapt @@ -1 +1 @@ -Subproject commit 9782a3edeae5650bbb367b98e06d9b0bd0a98787 +Subproject commit 422aa06abe8b8d566e1f8d14d32f069e49991a0b diff --git a/src/app/app-config.ts b/src/app/app-config.ts index 4c4c742c..8ef97176 100644 --- a/src/app/app-config.ts +++ b/src/app/app-config.ts @@ -20,10 +20,10 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; export type SubsquidConfig = { - archiveUrl: string, - explorerUrl: string; giantSquidExplorerUrl: string; giantSquidMainUrl: string; + giantSquidStatsUrl: string; + metaDataUrl: string; } export type NetworkSpecs = { diff --git a/src/app/app.component.scss b/src/app/app.component.scss index cb79f17c..060caf29 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -15,3 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + +app-root { + height: 100%; +} diff --git a/src/app/components/explorer-menu/explorer-menu.component.scss b/src/app/components/explorer-menu/explorer-menu.component.scss index 39a85ca8..7f0fd210 100644 --- a/src/app/components/explorer-menu/explorer-menu.component.scss +++ b/src/app/components/explorer-menu/explorer-menu.component.scss @@ -17,14 +17,18 @@ */ -.explorer-menu__container { +body .explorer-menu__container { height: 50px; display: flex; + margin: 0 -16px; flex-direction: row; align-items: center; justify-content: flex-start; - border-bottom: solid 1px #aaaaaa; - background: #fff; + background: transparent; + + .mat-mdc-button { + --mdc-text-button-label-text-color: #fff; + } } .explorer-menu__network-name { diff --git a/src/app/components/ps-connection-dialog/ps-connection-dialog.component.html b/src/app/components/ps-connection-dialog/ps-connection-dialog.component.html index 5bf0d67f..884e914d 100644 --- a/src/app/components/ps-connection-dialog/ps-connection-dialog.component.html +++ b/src/app/components/ps-connection-dialog/ps-connection-dialog.component.html @@ -94,43 +94,33 @@

{{networkConfig[netwo
- Subsquid Archive URL - - - - - Subsquid Explorer URL + Subsquid Giant Squid Explorer URL + [value]="urls.giantSquidExplorerUrl"> - Subsquid Giant Squid Explorer URL + Subsquid Giant Squid Main URL + [value]="urls.giantSquidMainUrl"> - Subsquid Giant Squid Main URL + Subsquid Giant Squid Stats URL + [value]="urls.giantSquidStatsUrl">
diff --git a/src/app/components/ps-top-bar/ps-top-bar.component.html b/src/app/components/ps-top-bar/ps-top-bar.component.html index 9b24f4b2..f8f5bddb 100644 --- a/src/app/components/ps-top-bar/ps-top-bar.component.html +++ b/src/app/components/ps-top-bar/ps-top-bar.component.html @@ -26,15 +26,51 @@ -
- -
- -
- -
+
+ + + + + + + +
+ +
+ This account belongs to another blockchain. Please choose the correct one with the tool. +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Event ID + {{event.blockNumber + '-' + event.eventIdx}} + Time + + Direction + + + Send To + + + Receive From + + + Address + + + + + + + + + + + Amount + + - + + +
+
+
+ chevron_right +
+ +

Loading items...

+ +

+ No items found. +

+ +
+ diff --git a/src/app/pages/network/explorer/account/account-detail/account-transfers/account-transfers.component.scss b/src/app/pages/network/explorer/account/account-detail/account-transfers/account-transfers.component.scss new file mode 100644 index 00000000..8992bdd7 --- /dev/null +++ b/src/app/pages/network/explorer/account/account-detail/account-transfers/account-transfers.component.scss @@ -0,0 +1,18 @@ +/*! + * Polkascan Explorer UI + * Copyright (C) 2018-2023 Polkascan Foundation (NL) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + diff --git a/src/app/pages/network/explorer/account/account-detail/account-transfers/account-transfers.component.ts b/src/app/pages/network/explorer/account/account-detail/account-transfers/account-transfers.component.ts new file mode 100644 index 00000000..68e56988 --- /dev/null +++ b/src/app/pages/network/explorer/account/account-detail/account-transfers/account-transfers.component.ts @@ -0,0 +1,386 @@ +/* + * Polkascan Explorer UI + * Copyright (C) 2018-2023 Polkascan Foundation (NL) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import { ChangeDetectionStrategy, Component, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core'; +import { BehaviorSubject, catchError, combineLatest, Observable, of, Subject, takeUntil } from 'rxjs'; +import { types as pst } from '@polkadapt/core'; +import { FormControl, FormGroup } from '@angular/forms'; +import { PolkadaptService } from '../../../../../../services/polkadapt.service'; +import { BN, u8aToHex } from "@polkadot/util"; +import { decodeAddress } from "@polkadot/util-crypto"; +import { NetworkService } from "../../../../../../services/network.service"; +import { TooltipsService } from "../../../../../../services/tooltips.service"; +import { map, shareReplay, switchMap, tap } from 'rxjs/operators'; + + +type eventAmounts = [string, BN][]; +type eventAddresses = [string, string]; // [from, to] + + +@Component({ + selector: 'app-account-transfers', + templateUrl: './account-transfers.component.html', + styleUrls: ['./account-transfers.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AccountTransfersComponent implements OnChanges, OnDestroy { + @Input() address: string; + @Input() listSize: number; + + rpcEventsCache = new Map> + amountsCache = new Map> + addressesCache = new Map> + directionCache = new Map> + + eventTypes: { [pallet: string]: string[] } = {'Balances': ['Transfer']} + events = new BehaviorSubject<(pst.AccountEvent | pst.Transfer)[]>([]); + columns = ['icon', 'eventID', 'age', 'direction', 'address', 'amount', 'detailsEvent']; + + palletControl = new FormControl(''); + eventNameControl = new FormControl(''); + dateRangeBeginControl = new FormControl(''); + dateRangeEndControl = new FormControl(''); + blockRangeBeginControl = new FormControl(''); + blockRangeEndControl = new FormControl(''); + + filtersFormGroup: FormGroup = new FormGroup({ + pallet: this.palletControl, + eventName: this.eventNameControl, + dateRangeBegin: this.dateRangeBeginControl, + dateRangeEnd: this.dateRangeEndControl, + blockRangeBegin: this.blockRangeBeginControl, + blockRangeEnd: this.blockRangeEndControl + }); + + routerLink = new BehaviorSubject('../../event'); + queryParams = new BehaviorSubject<{ [p: string]: string }>({}); + networkProperties = this.ns.currentNetworkProperties; + + loading = new BehaviorSubject(false); + + private reset: Subject = new Subject(); + private destroyer = new Subject(); + + constructor(private pa: PolkadaptService, + private ns: NetworkService, + private ts: TooltipsService) { + } + + ngOnDestroy(): void { + this.reset.complete() + this.destroyer.next(); + this.destroyer.complete(); + } + + ngOnChanges(changes: SimpleChanges): void { + const address: string = changes.address.currentValue; + this.events.next([]); + this.reset.next(); + + this.fetchAndSubscribeEvents(address); + + const queryParams: { [p: string]: string } = {'address': address}; + for (let pallet of Object.keys(this.eventTypes)) { + queryParams.pallet = pallet; + if (this.eventTypes[pallet].length === 1) { + queryParams.eventName = this.eventTypes[pallet][0]; + } + } + + this.routerLink.next('../../transfer'); + delete queryParams.pallet; + delete queryParams.eventName; + this.queryParams.next(queryParams); + } + + async fetchAndSubscribeEvents(address: string): Promise { + const idHex: string = u8aToHex(decodeAddress(address)); + const filterParams: any = {eventTypes: this.eventTypes}; + + let events: pst.AccountEvent[] = []; + const listSize = this.listSize || 50; + + const subscription = this.pa.run().getTransfersByAccount(idHex, undefined, this.listSize).pipe( + catchError(() => this.pa.run().getEventsByAccount(idHex, filterParams, listSize)), + tap({ + subscribe: () => { + this.loading.next(true); + }, + finalize: () => { + this.loading.next(false); + } + }), + switchMap((obs) => obs.length + ? combineLatest(obs) as unknown as Observable<(pst.AccountEvent | pst.Transfer)[]> + : of([]) as Observable), + takeUntil(this.reset), + takeUntil(this.destroyer) + ).subscribe({ + next: (items) => { + const merged = [...events, ...items.filter((event) => { + const isDuplicate = events.some((item) => + event.blockNumber === item.blockNumber + && event.eventIdx === item.eventIdx + ); + return !isDuplicate; + })]; + merged.sort((a, b) => (b.blockNumber - a.blockNumber || b.eventIdx - a.eventIdx)); + + + if (events.length > listSize) { + // List size has been reached. List is done, limit to listsize. + events.length = listSize; + subscription.unsubscribe(); + } + + this.events.next(merged); + } + }); + + this.pa.run({observableResults: false}).subscribeNewTransferByAccount(idHex, filterParams).pipe( + catchError(() => this.pa.run({observableResults: false}).subscribeNewEventByAccount(idHex, filterParams)), + takeUntil(this.reset), + takeUntil(this.destroyer) + ).subscribe({ + next: (event) => { + const events = this.events.value; + if (events && !events.some((e) => + e.blockNumber === event.blockNumber + && e.eventIdx === event.eventIdx + )) { + const merged = [event, ...events]; + merged.sort((a, b) => (b.blockNumber - a.blockNumber || b.eventIdx - a.eventIdx)); + + if (merged.length > listSize) { + merged.length = listSize; + } + + this.events.next(merged); + } + } + }) + } + + eventTrackBy(i: any, event: pst.AccountEvent | pst.Transfer): string { + return `${event.blockNumber}-${event.eventIdx}`; + } + + fetchAndCacheRpcEvent(eventOrTransfer: pst.Event | pst.AccountEvent | pst.Transfer) { + return this.pa.run({adapters: ['substrate-rpc']}).getEvent(eventOrTransfer.blockNumber, eventOrTransfer.eventIdx).pipe( + switchMap((obs => obs)), + map((event) => { + if (event.attributes && event.attributes[0] && event.attributes[1]) { + const direction = event.attributes[0] === this.address ? 'from' : event.attributes[1] === this.address ? 'to' : null; + if (direction) { + event = Object.assign({attributeName: direction}, event); + } + } + return event as pst.Event & { attributeName?: string }; + }), + shareReplay({ + bufferSize: 1, + refCount: true + }), + takeUntil(this.destroyer) + ); + } + + getAmountsFromEvent(eventOrTransfer: pst.AccountEvent | pst.Transfer): Observable { + const key = `${eventOrTransfer.blockNumber}_${eventOrTransfer.eventIdx}`; + let cachedAmount = this.amountsCache.get(key); + let cachedEvent = this.rpcEventsCache.get(key); + + if (cachedAmount) { + return cachedAmount; + } + + // First check if there is a Transfer available. + if ((eventOrTransfer as pst.Transfer).hasOwnProperty('amount')) { + const amounts: eventAmounts = []; + amounts.push(['amount', new BN((eventOrTransfer as pst.Transfer).amount)]); + const observable = of(amounts); + this.amountsCache.set(key, observable); + return observable; + } + + // Second check if there is an AccountEvent or Event with attributes available. + const attributes = (eventOrTransfer as pst.Event | pst.AccountEvent).attributes; + if (attributes) { + const attrNames = ['amount', 'actual_fee', 'actualFee', 'tip']; + const amounts: eventAmounts = []; + + if (typeof attributes === 'string') { + for (let name of attrNames) { + const match = new RegExp(`"${name}": ?\"?(\\d+)\"?`).exec(attributes); + if (match) { + amounts.push([name, new BN(match[1])]); + } + } + } else if (Object.prototype.toString.call(attributes) == '[object Object]') { + attrNames.forEach((name) => { + if (attributes.hasOwnProperty(name)) { + amounts.push([name, new BN(attributes[name])]) + } + }) + } + + const observable = of(amounts); + this.amountsCache.set(key, observable); + return observable; + } + + // Lastly fetch from the RPC. + if (!cachedEvent) { + cachedEvent = this.fetchAndCacheRpcEvent(eventOrTransfer); + this.rpcEventsCache.set(key, cachedEvent) + } + + const observable = cachedEvent.pipe( + map((event) => { + const amounts: [string, BN][] = []; + if (event.attributes) { + amounts.push(['amount', new BN(event.attributes[2])]); + } + return amounts; + }), + shareReplay({ + bufferSize: 1, + refCount: true + }) + ); + + this.amountsCache.set(key, observable); + return observable; + } + + getAddressFromEvent(eventOrTransfer: pst.AccountEvent | pst.Event | pst.Transfer): Observable { + const key = `${eventOrTransfer.blockNumber}_${eventOrTransfer.eventIdx}`; + let cachedAddresses = this.addressesCache.get(key); + let cachedEvent = this.rpcEventsCache.get(key); + + if (cachedAddresses) { + return cachedAddresses; + } + + // First check if there is a Transfer available. + if ((eventOrTransfer as pst.Transfer).from && (eventOrTransfer as pst.Transfer).to) { + const addresses: eventAddresses = [(eventOrTransfer as pst.Transfer).from, (eventOrTransfer as pst.Transfer).to]; + const observable = of(addresses); + this.addressesCache.set(key, observable); + return observable; + } + + // Second check if there is an AccountEvent or Event with attributes available. + const attributes = (eventOrTransfer as pst.Event | pst.AccountEvent).attributes + if (attributes) { + const data: any = typeof attributes === 'string' + ? JSON.parse(attributes) + : attributes; + if (data.from && data.to) { + const observable = of([data.from, data.to] as eventAddresses); + this.addressesCache.set(key, observable); + return observable; + } + } + + // Lastly fetch from the RPC. + if (!cachedEvent) { + cachedEvent = this.fetchAndCacheRpcEvent(eventOrTransfer); + this.rpcEventsCache.set(key, cachedEvent); + } + + const observable = cachedEvent.pipe( + map((event) => { + if (event.attributes) { + return [event.attributes[0], event.attributes[1]] as eventAddresses; + } + return ['', ''] as eventAddresses; + }), + shareReplay({ + bufferSize: 1, + refCount: true + }) + ); + + this.addressesCache.set(key, observable); + return observable; + } + + getDirectionFromEvent(eventOrTransfer: pst.AccountEvent | pst.Event | pst.Transfer): Observable { + const key = `${eventOrTransfer.blockNumber}_${eventOrTransfer.eventIdx}`; + let cachedDirection = this.directionCache.get(key); + let cachedEvent = this.rpcEventsCache.get(key); + + if (cachedDirection) { + return cachedDirection; + } + + // First check if there is a Transfer available. + if ((eventOrTransfer as pst.Transfer | pst.AccountEvent).attributeName) { + const observable = of((eventOrTransfer as pst.Transfer).attributeName as string); + this.directionCache.set(key, observable); + return observable; + } + + // Second check if there is an AccountEvent or Event with attributes available. + const attributes = (eventOrTransfer as pst.Event | pst.AccountEvent).attributes + if (attributes) { + const data: any = typeof attributes === 'string' + ? JSON.parse(attributes) + : attributes; + if (data.from && data.to) { + let observable: Observable | undefined; + if (data.from === this.address) { + observable = of('from'); + } else if (data.to === this.address) { + observable = of('to'); + } + if (observable) { + this.directionCache.set(key, observable); + return observable; + } + } + } + + // Lastly fetch from the RPC. + if (!cachedEvent) { + cachedEvent = this.fetchAndCacheRpcEvent(eventOrTransfer); + } + + const observable = cachedEvent.pipe( + map((event) => { + if (event.attributeName) { + return event.attributeName; + } + return null; + }), + shareReplay({ + bufferSize: 1, + refCount: true + }) + ); + + this.directionCache.set(key, observable); + return observable; + } + + copied(address: string) { + this.ts.notify.next( + `Address copied.
${address}`); + } +} diff --git a/src/app/pages/network/explorer/account/account.module.ts b/src/app/pages/network/explorer/account/account.module.ts index 5a439c82..c8a91af5 100644 --- a/src/app/pages/network/explorer/account/account.module.ts +++ b/src/app/pages/network/explorer/account/account.module.ts @@ -25,6 +25,7 @@ import { AccountRoutingModule } from './account-routing.module'; import { AccountDetailComponent } from './account-detail/account-detail.component'; import { HistoricalBalanceComponent } from './historical-balance/historical-balance.component'; import { AccountEventsComponent } from './account-detail/account-events/account-events.component'; +import { AccountTransfersComponent } from './account-detail/account-transfers/account-transfers.component'; import { HighchartsChartModule } from 'highcharts-angular'; @@ -38,12 +39,11 @@ import { MatIconModule } from '@angular/material/icon'; import { MatProgressBarModule } from '@angular/material/progress-bar'; - - @NgModule({ declarations: [ AccountDetailComponent, AccountEventsComponent, + AccountTransfersComponent, HistoricalBalanceComponent ], imports: [ diff --git a/src/app/pages/network/explorer/account/historical-balance/historical-balance.component.ts b/src/app/pages/network/explorer/account/historical-balance/historical-balance.component.ts index 146f3234..6bb109bd 100644 --- a/src/app/pages/network/explorer/account/historical-balance/historical-balance.component.ts +++ b/src/app/pages/network/explorer/account/historical-balance/historical-balance.component.ts @@ -121,12 +121,12 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase obs.pipe(takeUntil(this.destroyer))), + switchMap((obs) => obs.pipe(takeUntil(this.destroyer))), // Keep takeUntil because child refCount is false shareReplay({ bufferSize: 1, refCount: false - }) + }), + takeUntil(this.destroyer) ) // Start observables for data retrieval and conversion for table and charts. @@ -217,12 +217,10 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase listAtEnd ? this.blockOne.pipe( - takeUntil(this.destroyer), switchMap((hash) => { let observable = this.balancesPerBlock.get(1); if (observable) { @@ -234,7 +232,6 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase { // Check if the account exists. @@ -259,17 +256,21 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase(() => { this.loading++; }), @@ -299,7 +300,8 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase combineLatest([ this.pa.run({observableResults: false}).getAccount(this.accountId, hash as string).pipe( - takeUntil(this.destroyer), take(1) ), this.pa.run({observableResults: false}).getHeader(hash as string).pipe( - takeUntil(this.destroyer), take(1), map((header: pst.Header) => header.number as number) ), this.pa.run({observableResults: false}).getTimestamp(hash as string).pipe( - takeUntil(this.destroyer), take(1) ) ]) @@ -348,11 +346,11 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase((items) => { this.chartLoadingObservable.next(true); this.updateFlag = false; @@ -580,11 +578,12 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase(() => { + tap(() => { this.chartLoadingObservable.next(false); this.updateFlag = true; this.cd.markForCheck(); - }) + }), + takeUntil(this.destroyer) ) as Observable } @@ -594,7 +593,6 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase { @@ -606,7 +604,6 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase this.pa.run({observableResults: false}).getAccount(this.accountId, hash).pipe( - takeUntil(this.destroyer), take(1) // TODO add filter for when all data is available that is needed. ) ), @@ -619,7 +616,8 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase observable.next(val) }); @@ -652,7 +650,8 @@ export class HistoricalBalanceComponent extends PaginatedListComponentBase { // Keep the item list in live mode. We don't expect items coming in on every block. this.lowestBlockNumber.pipe( - take(1) + take(1), + takeUntil(this.destroyer) ).subscribe({ next: (blockNumber) => { if (blockNumber !== null) { diff --git a/src/app/pages/network/explorer/block/block-detail/block-detail.component.ts b/src/app/pages/network/explorer/block/block-detail/block-detail.component.ts index a78fa8b9..2080e307 100644 --- a/src/app/pages/network/explorer/block/block-detail/block-detail.component.ts +++ b/src/app/pages/network/explorer/block/block-detail/block-detail.component.ts @@ -49,15 +49,12 @@ export class BlockDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { // Wait for network to be set. this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), // Only continue if a network is set. filter(network => !!network), // We don't have to wait for further changes to network, so terminate after first. first(), // Switch to the route param, from which we get the block number. - switchMap(() => this.route.params.pipe( - takeUntil(this.destroyer), - )), + switchMap(() => this.route.params), tap(() => { this.invalidHash.next(false); }), @@ -88,10 +85,10 @@ export class BlockDetailComponent implements OnInit, OnDestroy { }) ) ]).pipe( - takeUntil(this.destroyer), // Stop watching when this block is finalized. takeWhile(result => !result[0].finalized), - )) + )), + takeUntil(this.destroyer) ).subscribe(); @@ -108,14 +105,14 @@ export class BlockDetailComponent implements OnInit, OnDestroy { blockRangeBegin: block.number, blockRangeEnd: block.number }, 300)), - takeUntil(this.destroyer), takeWhile((extrinsics) => block.countExtrinsics! > extrinsics.length, true), switchMap((obs) => obs.length ? combineLatest(obs) : of([])), startWith([]) ) } return of([]); - }) + }), + takeUntil(this.destroyer) ); this.events = this.block.pipe( @@ -131,14 +128,14 @@ export class BlockDetailComponent implements OnInit, OnDestroy { blockRangeBegin: block.number, blockRangeEnd: block.number }, 300)), - takeUntil(this.destroyer), takeWhile((events) => block.countEvents! > events.length, true), switchMap((obs) => obs.length ? combineLatest(obs) : of([])), startWith([]) ) } return of([]); - }) + }), + takeUntil(this.destroyer) ); } diff --git a/src/app/pages/network/explorer/block/block-list/block-list.component.ts b/src/app/pages/network/explorer/block/block-list/block-list.component.ts index 23de4e37..8b66558d 100644 --- a/src/app/pages/network/explorer/block/block-list/block-list.component.ts +++ b/src/app/pages/network/explorer/block/block-list/block-list.component.ts @@ -61,21 +61,24 @@ export class BlockListComponent implements OnInit, OnDestroy { private pa: PolkadaptService, private ns: NetworkService ) { - this.loadingObservable = this.loadingCounterObservable.pipe(takeUntil(this.destroyer), map((c) => !!c)); + this.loadingObservable = this.loadingCounterObservable.pipe( + map((c) => !!c), + takeUntil(this.destroyer) + ); + this.hasNextPageObservable = combineLatest( this.pageLiveObservable, this.latestBlockNumber, this.customUntilObservable ).pipe( - map(([p, l, c]) => (p && l > this.listSize || c && c > this.listSize) - )); + map(([p, l, c]) => (p && l > this.listSize || c && c > this.listSize)), + takeUntil(this.destroyer) + ); } ngOnInit(): void { // Watch for changes to network, the latest block number and last block data. this.ns.currentNetwork.pipe( - // Keep it running until this component is destroyed. - takeUntil(this.destroyer), // Only continue if a network is set. filter(network => !!network), // Only continue if the network value has changed. @@ -88,7 +91,6 @@ export class BlockListComponent implements OnInit, OnDestroy { // Wait for the first most recent finalized block to arrive from Polkascan. switchMap(() => this.ns.blockHarvester.finalizedNumber.pipe( timeout(2000), - takeUntil(this.destroyer), filter(nr => nr > 0), first(), // Start preloading the latest 100 blocks. @@ -102,14 +104,13 @@ export class BlockListComponent implements OnInit, OnDestroy { )), // Watch for new loaded block numbers from the Substrate node. switchMap(() => this.ns.blockHarvester.loadedNumber.pipe( - takeUntil(this.destroyer), // Only continue if new block number is larger than 0. filter(nr => nr > 0) )), // Watch for changes in new block data. - switchMap(nr => this.ns.blockHarvester.blocks[nr].pipe( - takeUntil(this.destroyer) - )) + switchMap(nr => this.ns.blockHarvester.blocks[nr]), + // Keep it running until this component is destroyed. + takeUntil(this.destroyer), ).subscribe({ next: (block) => { const newBlockCount: number = block.number - this.latestBlockNumber.value; diff --git a/src/app/pages/network/explorer/event/event-detail/event-detail.component.html b/src/app/pages/network/explorer/event/event-detail/event-detail.component.html index ce437535..7ca025ae 100644 --- a/src/app/pages/network/explorer/event/event-detail/event-detail.component.html +++ b/src/app/pages/network/explorer/event/event-detail/event-detail.component.html @@ -49,21 +49,21 @@

{{event.blockNumber + '-' + event.eventIdx}}

Pallet {{event.eventModule}} + [routerLink]="'../../runtime/' + (event.specName || props.specName) + '-' + event.specVersion + '/pallet/' + event.eventModule">{{event.eventModule}} Event name {{event.eventName}} + [routerLink]="'../../runtime/' + (event.specName || props.specName) + '-' + event.specVersion + '/pallet/' + event.eventModule + '/event/' + event.eventName">{{event.eventName}} Runtime {{event.specName + '-' + event.specVersion}} + [routerLink]="'../../runtime/' + (event.specName || props.specName) + '-' + event.specVersion">{{(event.specName || props.specName) + '-' + event.specVersion}} diff --git a/src/app/pages/network/explorer/event/event-detail/event-detail.component.ts b/src/app/pages/network/explorer/event/event-detail/event-detail.component.ts index 70c66478..b6a7e14b 100644 --- a/src/app/pages/network/explorer/event/event-detail/event-detail.component.ts +++ b/src/app/pages/network/explorer/event/event-detail/event-detail.component.ts @@ -21,7 +21,7 @@ import { ActivatedRoute } from '@angular/router'; import { NetworkService } from '../../../../../services/network.service'; import { PolkadaptService } from '../../../../../services/polkadapt.service'; import { catchError, filter, first, map, switchMap, takeUntil } from 'rxjs/operators'; -import { BehaviorSubject, Observable, of, ReplaySubject, Subject, takeLast, tap } from 'rxjs'; +import { BehaviorSubject, Observable, of, Subject, tap } from 'rxjs'; import { types as pst } from '@polkadapt/core'; import { RuntimeService } from '../../../../../services/runtime/runtime.service'; @@ -52,26 +52,23 @@ export class EventDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { const paramsObservable = this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), // Network must be set. filter(network => !!network), // Only need to load once. first(), // Switch over to the route param from which we extract the extrinsic keys. switchMap(() => this.route.params.pipe( - takeUntil(this.destroyer), map(params => params['id'].split('-').map((v: string) => parseInt(v, 10))) - )) + )), + takeUntil(this.destroyer) ) this.event = paramsObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchEventStatus.next('loading') }), switchMap(([blockNr, eventIdx]) => this.pa.run().getEvent(blockNr, eventIdx).pipe( - takeUntil(this.destroyer), switchMap((obs) => obs), map((event) => { if (event) { @@ -85,9 +82,9 @@ export class EventDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchEventStatus.next('error'); return of(null); - }) - ) - ; + }), + takeUntil(this.destroyer) + ); this.eventAttributes = this.event.pipe( tap({ @@ -102,41 +99,6 @@ export class EventDetailComponent implements OnInit, OnDestroy { } return parsed; }), - map((attributes) => { - if (attributes) { - (Object.entries(attributes) as [key: string, attr: any][]).forEach(([key, attr]) => { - if (attr && attr['__kind']) { - if (attr.value && attr.value['__kind']) { - // Sublevel type found. Leave as is. - return; - } else { - attributes[key] = attr.value || attr; - } - } - }) - - const convertSubquidData = (item: any, parent?: any, keyOrIndex?: number | string) => { - if (Object.prototype.toString.call(item) === '[object Object]') { - if (item && item['__kind']) { - if (!(item.value && item.value['__kind'])) { - if (parent && keyOrIndex) { - parent[keyOrIndex] = item.value || item['__kind'] || item; - } - } - } else { - Object.entries(item).forEach(([k, v]) => { - convertSubquidData(v, item, k); - }) - } - } else if (Array.isArray(item)) { - item.forEach((v, i) => convertSubquidData(v, item, i)); - } - } - convertSubquidData(attributes) - return attributes; - } - return null; - }), tap({ next: () => this.fetchEventAttributesStatus.next(null), error: () => this.fetchEventAttributesStatus.next('error') @@ -145,31 +107,23 @@ export class EventDetailComponent implements OnInit, OnDestroy { this.runtimeEventAttributes = this.event.pipe( switchMap((event) => { - if (event && event.specName && event.specVersion && event.eventModule && event.eventName) { - const subject = new ReplaySubject(1); - - this.rs.getRuntimeEventAttributes(this.ns.currentNetwork.value, event.specVersion, event.eventModule, event.eventName).pipe( - takeUntil(this.destroyer), - takeLast(1) - ).subscribe({ - next: (items) => { - if (Array.isArray(items)) { - subject.next(items); - } - }, - error: (e) => { - console.error(e); - subject.error(e); - } - }); - return subject.pipe(takeUntil(this.destroyer)); + if (event && event.specVersion && event.eventModule && event.eventName) { + return this.rs.getRuntime(this.ns.currentNetwork.value, event.specVersion).pipe( + filter((r) => !!r), + switchMap(() => + this.rs.getRuntimeEventAttributes(this.ns.currentNetwork.value, event.specVersion as number, event.eventModule as string, event.eventName as string).pipe( + map((items) => Array.isArray(items) ? items : null) + ) + ) + ) } return of(null); }), catchError((e) => { return of(null); - }) + }), + takeUntil(this.destroyer), ); } diff --git a/src/app/pages/network/explorer/event/event-list/event-list.component.ts b/src/app/pages/network/explorer/event/event-list/event-list.component.ts index ca194db6..b9b16500 100644 --- a/src/app/pages/network/explorer/event/event-list/event-list.component.ts +++ b/src/app/pages/network/explorer/event/event-list/event-list.component.ts @@ -25,7 +25,7 @@ import { RuntimeService } from '../../../../../services/runtime/runtime.service' import { types as pst } from '@polkadapt/core'; import { PaginatedListComponentBase } from '../../../../../../common/list-base/paginated-list-component-base.directive'; import { ActivatedRoute, Params, Router } from '@angular/router'; -import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; +import { BehaviorSubject, combineLatest, Observable, Subscription, take } from 'rxjs'; import { BN, u8aToHex } from "@polkadot/util"; import { decodeAddress } from "@polkadot/util-crypto"; @@ -63,8 +63,10 @@ export class EventListComponent extends PaginatedListComponentBase [ parseInt(params.get('runtime') as string, 10) || '', @@ -88,7 +89,8 @@ export class EventListComponent extends PaginatedListComponentBase { @@ -206,6 +208,17 @@ export class EventListComponent extends PaginatedListComponentBase { + if (registered === true) { + this.visibleColumns = ['icon', 'eventID', 'age', 'referencedTransaction', 'pallet', 'event', 'amount', 'details']; + this.visibleColumnsForAccount = ['icon', 'eventID', 'age', 'referencedTransaction', 'pallet', 'event', 'attribute', 'amount', 'details']; + } + }) + super.ngOnInit(); } @@ -260,8 +273,8 @@ export class EventListComponent extends PaginatedListComponentBase { if (runtime && runtime.specVersion !== this.specVersionControl.value) { @@ -278,14 +291,14 @@ export class EventListComponent extends PaginatedListComponentBase r !== null), switchMap((runtime) => combineLatest([ - this.rs.getRuntimePallets(network, (runtime as pst.Runtime).specVersion).pipe(takeUntil(this.destroyer)), - this.rs.getRuntimeEvents(network, (runtime as pst.Runtime).specVersion).pipe(takeUntil(this.destroyer)) + this.rs.getRuntimePallets(network, (runtime as pst.Runtime).specVersion), + this.rs.getRuntimeEvents(network, (runtime as pst.Runtime).specVersion) ]) - ) + ), + takeUntil(this.destroyer) ).subscribe({ next: ([pallets, events]): void => { if (pallets) { diff --git a/src/app/pages/network/explorer/explorer.component.html b/src/app/pages/network/explorer/explorer.component.html index cd693521..0c81c330 100644 --- a/src/app/pages/network/explorer/explorer.component.html +++ b/src/app/pages/network/explorer/explorer.component.html @@ -18,22 +18,6 @@ -
- - Search for account, block, extrinsic - - - - This address does not belong to the {{ns.currentNetwork | async}} network. Do you need to switch to another network? - - - Please enter a valid account address or block number. - - -
-

Waiting for blocks...

@@ -46,7 +30,8 @@
- + {{block.number.toString().slice(0, -2)}}{{block.number.toString().slice(-2)}} @@ -59,9 +44,119 @@ + +
+
+ +
+
+
Finalized Blocks
+ {{stats.chainFinalizedBlocks}} +
+
+
+ + +
+ +
+
+
Signed Extrinsics
+ {{stats.chainSignedExtrinsics}} +
+
+
+
+ +
+
+
Transfers Count
+ {{stats.balancesTransfersAmount}} +
+
+
+
+ +
+
+
Inflation rate
+ {{ir}}% +
+
+
+
+ +
+
+
Staked
+ {{sr}}% +
+
+
+
+ +
+
+
Reward rate
+ {{rr}}% +
+
+
+
+ +
+
+
Accounts
+ {{stats.accountsTotal}} +
+
+
+
+ +
Validators
+
+
+
Active
+ {{stats.stakingActiveValidatorsAmount}} +
+ +
+
Inactive
+ {{stats.stakingValidatorsAmount - stats.stakingActiveValidatorsAmount}} +
+
+
+
+ +
Nominators
+
+
+
Pools
+ {{stats.nominationPoolsPoolsActiveAmount}} +
+
+
Members
+ {{stats.nominationPoolsMembersAmount}} +
+
+
+
+ +
+
+
Era
+ {{stats.stakingCurrentEra}} +
+
+
+
+

Initializing...

-

Connection error! Please try again later or try a different endpoint.

+

Connection error! Please try again later or try a different endpoint.

diff --git a/src/app/pages/network/explorer/explorer.component.scss b/src/app/pages/network/explorer/explorer.component.scss index 3978b3fa..a3acb9df 100644 --- a/src/app/pages/network/explorer/explorer.component.scss +++ b/src/app/pages/network/explorer/explorer.component.scss @@ -89,3 +89,28 @@ margin-top: 15px; width: 100%; } + +.chain-statistics { + display: flex; + gap: 8px; + flex-wrap: wrap; +} + +.chain-statistic { + //border: solid 1px var(--ps-top-bar-bg-color); + padding: 4px; +} + +.chain-statistic-values { + display: flex; + gap: 8px; +} + +.chain-statistic-value { + +} + +.chain-statistic-title { + font-size: 12px; +} + diff --git a/src/app/pages/network/explorer/explorer.component.ts b/src/app/pages/network/explorer/explorer.component.ts index 7a802ff5..305d79da 100644 --- a/src/app/pages/network/explorer/explorer.component.ts +++ b/src/app/pages/network/explorer/explorer.component.ts @@ -20,14 +20,25 @@ import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/ import { animate, group, query, stagger, style, transition, trigger } from '@angular/animations'; import { PolkadaptService } from '../../../services/polkadapt.service'; import { NetworkService } from '../../../services/network.service'; -import { BehaviorSubject, of, Subject } from 'rxjs'; -import { catchError, distinctUntilChanged, filter, first, switchMap, takeUntil, tap, timeout } from 'rxjs/operators'; +import { BehaviorSubject, map, Observable, of, startWith, Subject } from 'rxjs'; +import { + catchError, + distinctUntilChanged, + filter, + first, + shareReplay, + switchMap, + takeUntil, + tap, + timeout +} from 'rxjs/operators'; import { Block } from '../../../services/block/block.harvester'; -import { AppConfig } from '../../../app-config'; import { AbstractControl, FormControl, FormGroup, ValidationErrors } from '@angular/forms'; import { validateAddress } from '@polkadot/util-crypto' import { ActivatedRoute, Router } from '@angular/router'; import { VariablesService } from '../../../services/variables.service'; +import { types as pst } from '@polkadapt/core'; +import { BN } from "@polkadot/util"; const blocksAnimation = trigger('blocksAnimation', [ @@ -79,39 +90,38 @@ export class ExplorerComponent implements OnInit, OnDestroy { blockListSize = 10; latestBlockNumber = new BehaviorSubject(0); blocks = new BehaviorSubject[]>([]); - searchForm = new FormGroup({ - search: new FormControl('', [this.searchValidator()]) - }) + + statistics: Observable + stakedRatio: Observable; + inflationRatio: Observable; + rewardsRatio: Observable constructor( public pa: PolkadaptService, public ns: NetworkService, - private vars: VariablesService, - private config: AppConfig, - private router: Router, - private route: ActivatedRoute + private vars: VariablesService ) { } ngOnInit(): void { // Watch for changes to network, the latest block number and last block data. - this.ns.currentNetwork.pipe( - // Keep it running until this component is destroyed. - takeUntil(this.destroyer), + const networkObservable = this.ns.currentNetwork.pipe( // Only continue if a network is set. filter(network => !!network), // Only continue if the network value has changed. distinctUntilChanged(), - // When network has changed, reset the block Array for this component. - tap(() => { + // Keep it running until this component is destroyed. + takeUntil(this.destroyer) + ); + + // When network has changed, reset the block Array for this component. + networkObservable.pipe(tap(() => { this.latestBlockNumber.next(0); this.blocks.next([]); - this.searchForm.controls['search'].setValue(''); }), // Wait for the first most recent finalized block to arrive from Polkascan. switchMap(() => this.ns.blockHarvester.finalizedNumber.pipe( timeout(2000), - takeUntil(this.destroyer), filter(nr => nr > 0), first(), // Start preloading the latest blocks. @@ -124,14 +134,12 @@ export class ExplorerComponent implements OnInit, OnDestroy { )), // Watch for new loaded block numbers from the Substrate node. switchMap(() => this.ns.blockHarvester.loadedNumber.pipe( - takeUntil(this.destroyer), // Only continue if new block number is larger than 0. filter(nr => nr > 0) )), // Watch for changes in new block data. - switchMap(nr => this.ns.blockHarvester.blocks[nr].pipe( - takeUntil(this.destroyer)) - ) + switchMap(nr => this.ns.blockHarvester.blocks[nr]), + takeUntil(this.destroyer) ).subscribe({ next: (block) => { const newBlockCount: number = block.number - this.latestBlockNumber.value; @@ -146,16 +154,47 @@ export class ExplorerComponent implements OnInit, OnDestroy { // Watch the network variable that changes as soon as another network is *selected* by the user, // whereas the currentNetwork variable is only changed after initialization. this.vars.network.pipe( - takeUntil(this.destroyer), filter(network => !!network), - distinctUntilChanged() + distinctUntilChanged(), + takeUntil(this.destroyer) ).subscribe({ next: () => { this.latestBlockNumber.next(0); this.blocks.next([]); - this.searchForm.controls['search'].setValue(''); } }); + + this.statistics = networkObservable.pipe( + switchMap(() => this.pa.run().getLatestStatistics().pipe( + startWith(null), + catchError(() => of(null)), + switchMap((o) => o || of(null)))), + shareReplay({ + refCount: true, + bufferSize: 1 + }) + ); + + this.stakedRatio = this.statistics.pipe( + // TODO Change this code when BN is implemented in the adapter. + map((stats) => { + if (stats && stats.balancesTotalIssuance && stats.stakingTotalStake) { + const calc = new BN(stats.stakingTotalStake).mul(new BN(10000)).div( + new BN(stats.balancesTotalIssuance) + ).toNumber(); + return (calc / 100).toFixed(2); + } + return null; + }) + ); + + this.inflationRatio = this.statistics.pipe( + map((stats) => stats?.stakingInflationRatio?.toFixed(2) || null) + ); + + this.rewardsRatio = this.statistics.pipe( + map((stats) => stats?.stakingRewardsRatio?.toFixed(2) || null) + ); } ngOnDestroy(): void { @@ -176,61 +215,4 @@ export class ExplorerComponent implements OnInit, OnDestroy { this.blocks.next(blocks); } - searchValidator() { - const ns = this.ns; - return (control: AbstractControl): ValidationErrors | null => { - const value = control.value.trim(); - if (value === '' // Nothing - || value.startsWith('0x') && value.length === 66 // Extrinsic or block hash - || /^\d+-\d+$/.test(value) // Extrinsic ID, block-index format - || /^\d+$/.test(value)) { // Block number - return null; - } else { - let validAddress: boolean; - try { - validAddress = validateAddress(value); - } catch (e) { - validAddress = false; - } - if (validAddress) { - // Check if address belongs to this network/chain. - try { - validateAddress(value, false, ns.currentNetworkProperties.value?.ss58Format); - return null; - } catch (e) { - return {wrongNetwork: {value}}; - } - } - } - return {wrongFormat: {value}}; - } - } - - submitSearch() { - if (this.searchForm.valid) { - const value = (this.searchForm.value.search)!.trim(); - if (value) { - if (/^\d+-\d+$/.test(value)) { - this.router.navigate(['extrinsic', value], {relativeTo: this.route}); - } else if (/^\d+$/.test(value) || value.startsWith('0x') && value.length === 66) { - this.pa.run({observableResults: false}).getBlock(value).subscribe({ - next: block => - this.router.navigate(['block', value], {relativeTo: this.route}), - error: () => this.router.navigate(['extrinsic', value], {relativeTo: this.route}) - }); - } else { - let validAddress: boolean; - try { - validAddress = validateAddress(value, false, - this.ns.currentNetworkProperties.value?.ss58Format); - } catch (e) { - validAddress = false; - } - if (validAddress) { - this.router.navigate(['account', value], {relativeTo: this.route}); - } - } - } - } - } } diff --git a/src/app/pages/network/explorer/explorer.module.ts b/src/app/pages/network/explorer/explorer.module.ts index b80bf02c..462adae7 100644 --- a/src/app/pages/network/explorer/explorer.module.ts +++ b/src/app/pages/network/explorer/explorer.module.ts @@ -17,7 +17,7 @@ */ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; +import { CommonModule, NgOptimizedImage } from '@angular/common'; import { ExplorerComponent } from './explorer.component'; import { ExplorerRoutingModule } from './explorer-routing.module'; import { ReactiveFormsModule } from '@angular/forms'; diff --git a/src/app/pages/network/explorer/extrinsic/extrinsic-detail/extrinsic-detail.component.html b/src/app/pages/network/explorer/extrinsic/extrinsic-detail/extrinsic-detail.component.html index ffdc9e20..31095607 100644 --- a/src/app/pages/network/explorer/extrinsic/extrinsic-detail/extrinsic-detail.component.html +++ b/src/app/pages/network/explorer/extrinsic/extrinsic-detail/extrinsic-detail.component.html @@ -21,160 +21,162 @@

Extrinsic

- - -

{{extrinsic.blockNumber + '-' + extrinsic.extrinsicIdx}}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Block{{extrinsic.blockNumber}}
Timestamp{{extrinsic.blockDatetime | date: 'dd-MM-yyyy HH:mm:ss'}}
Timestamp UTC{{extrinsic.blockDatetime | date:'dd-MM-yyyy HH:mm:ss' :'UTC'}}
Extrinsic Index{{extrinsic.extrinsicIdx}}
Extrinsic Hash{{extrinsic.hash}}
Pallet{{extrinsic.callModule}} -
Call name{{extrinsic.callName}} -
Runtime{{extrinsic.specName + '-' + extrinsic.specVersion}} -
Address - -
Nonce{{extrinsic.nonce}}
Signature{{extrinsic.signature}}
Call Arguments - Loading arguments... - Failed to load arguments. - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +

{{extrinsic.blockNumber + '-' + extrinsic.extrinsicIdx}}

+ +
Event ID - {{event.blockNumber + '-' + event.eventIdx}} - Pallet - {{event.eventModule}} - Event Name - {{event.eventName}} - - chevron_right -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Block{{extrinsic.blockNumber}}
Timestamp{{extrinsic.blockDatetime | date: 'dd-MM-yyyy HH:mm:ss'}}
Timestamp UTC{{extrinsic.blockDatetime | date:'dd-MM-yyyy HH:mm:ss' :'UTC'}}
Extrinsic Index{{extrinsic.extrinsicIdx}}
Extrinsic Hash{{extrinsic.hash}}
Pallet{{extrinsic.callModule}} +
Call name{{extrinsic.callName}} +
Runtime{{(extrinsic.specName || props.specName) + '-' + extrinsic.specVersion}} +
Address + +
Nonce{{extrinsic.nonce}}
Signature{{extrinsic.signature}}
Call Arguments + Loading arguments... + Failed to load arguments. + + +
- -

Loading...

-

Could not fetch extrinsic events.

-
- -
-
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Event ID + {{event.blockNumber + '-' + event.eventIdx}} + Pallet + {{event.eventModule}} + Event Name + {{event.eventName}} + + chevron_right +
+ + +

Loading...

+

Could not fetch extrinsic events.

+
+ +
+
+
- -

Loading...

-

Could not fetch extrinsic.

-
+ +

Loading...

+

Could not fetch extrinsic.

+
diff --git a/src/app/pages/network/explorer/extrinsic/extrinsic-detail/extrinsic-detail.component.ts b/src/app/pages/network/explorer/extrinsic/extrinsic-detail/extrinsic-detail.component.ts index 73e235b7..d211c5d0 100644 --- a/src/app/pages/network/explorer/extrinsic/extrinsic-detail/extrinsic-detail.component.ts +++ b/src/app/pages/network/explorer/extrinsic/extrinsic-detail/extrinsic-detail.component.ts @@ -17,7 +17,7 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { BehaviorSubject, combineLatest, Observable, of, startWith, Subject, takeLast, tap } from 'rxjs'; +import { BehaviorSubject, combineLatest, combineLatestWith, Observable, of, Subject, tap } from 'rxjs'; import { ActivatedRoute, Router } from '@angular/router'; import { PolkadaptService } from '../../../../../services/polkadapt.service'; import { NetworkService } from '../../../../../services/network.service'; @@ -35,6 +35,7 @@ import { RuntimeService } from '../../../../../services/runtime/runtime.service' export class ExtrinsicDetailComponent implements OnInit, OnDestroy { extrinsic: Observable; callArguments: Observable; + runtimeCallArguments: Observable; events: Observable; networkProperties = this.ns.currentNetworkProperties; fetchExtrinsicStatus: BehaviorSubject = new BehaviorSubject(null); @@ -56,20 +57,18 @@ export class ExtrinsicDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { const paramsObservable = this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), // Network must be set. filter(network => !!network), // Only need to load once. first(), // Switch over to the route param from which we extract the extrinsic keys. switchMap(() => this.route.params.pipe( - takeUntil(this.destroyer), map(params => params['id'].length === 66 ? [params['id'], null] : params['id'].split('-').map((v: string) => parseInt(v, 10))) - )) + )), + takeUntil(this.destroyer) ) this.extrinsic = paramsObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchExtrinsicStatus.next('loading') }), @@ -88,29 +87,29 @@ export class ExtrinsicDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchExtrinsicStatus.next('error'); return of(null); - }) + }), + takeUntil(this.destroyer) ); this.events = this.extrinsic.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchEventsStatus.next('loading') }), switchMap((extrinsic) => { - if (!extrinsic) { - return of([]); - } - return this.pa.run().getEvents({blockNumber: extrinsic.blockNumber, extrinsicIdx: extrinsic.extrinsicIdx}, 100) - .pipe( - switchMap((obs) => obs.length ? combineLatest(obs) : of([])), - map((items) => { - if (Array.isArray(items)) { - this.fetchEventsStatus.next(null) - return items; - } - throw new Error('Invalid response.'); - }) - ) + if (!extrinsic) { + return of([]); + } + return this.pa.run().getEvents({blockNumber: extrinsic.blockNumber, extrinsicIdx: extrinsic.extrinsicIdx}, 100) + .pipe( + switchMap((obs) => obs.length ? combineLatest(obs) : of([])), + map((items) => { + if (Array.isArray(items)) { + this.fetchEventsStatus.next(null) + return items; + } + throw new Error('Invalid response.'); + }) + ) } ), catchError((e) => { @@ -120,269 +119,56 @@ export class ExtrinsicDetailComponent implements OnInit, OnDestroy { shareReplay({ refCount: true, bufferSize: 1 - }) + }), + takeUntil(this.destroyer) ); this.callArguments = this.extrinsic.pipe( tap({ subscribe: () => { - this.fetchAttributesStatus.next('loading') + this.fetchAttributesStatus.next('loading'); } }), - switchMap((extrinsic) => { + switchMap((extrinsic: pst.Extrinsic | null) => { if (!extrinsic) { - return of(''); + return of(null); } - if (!(extrinsic.specVersion && extrinsic.callModule && extrinsic.callName)) { - return of(extrinsic.callArguments); + return of(extrinsic.callArguments as any || null); + }), + tap({ + next: (extrinsic: pst.Extrinsic | null) => { + if (extrinsic && extrinsic.callArguments) { + this.fetchAttributesStatus.next(null); + } } - return combineLatest([ - of(extrinsic).pipe( - switchMap((extrinsic) => { - // Find defined types in data returned by subsquid. Fetch the runtimeCallArguments for these found types. - // Wait until all found runtimeCallArguments are available. - - const foundTypes: [string, string, Observable][] = [] - const findTypes = (item: any) => { - if (Object.prototype.toString.call(item) === '[object Object]') { - if (item && item['__kind'] && item.value && item.value['__kind']) { - foundTypes.push([ - item['__kind'], - item.value['__kind'], - this.rs.getRuntimeCallArguments( - this.ns.currentNetwork.value, - extrinsic.specVersion!, - item['__kind'], - item.value['__kind']).pipe( - takeUntil(this.destroyer), - catchError(() => of(null)), - takeLast(1) - )] - ) - } else { - findTypes(Object.entries(item).map(([k, v]) => v)); - } - } else if (Array.isArray(item)) { - item.forEach((v) => findTypes(v)); - } - } - findTypes(extrinsic.callArguments) - - if (foundTypes.length) { - return combineLatest(foundTypes.map((t) => t[2])).pipe( - switchMap((types) => of([ - extrinsic, - foundTypes - .filter((t, i) => types[i] !== null) - .map((t, i) => [t[0], t[1], types[i]]) - ])), - catchError(() => of([extrinsic, []])) - ); - } - - return of([extrinsic, []]) - }) - ), - // Get extrinsic main call's call arguments. - this.rs.getRuntimeCallArguments( - this.ns.currentNetwork.value, - extrinsic.specVersion, - extrinsic.callModule, - extrinsic.callName - ).pipe( - takeUntil(this.destroyer), - takeLast(1), - catchError(() => []), - startWith([]), - ) - ]).pipe( - map(([[extrinsic, collectedCallArguments], callArgumentsMeta]) => { - // Parse callArguments JSON or copy callArguments. - let parsed: any = (extrinsic as pst.Extrinsic).callArguments; - if (typeof parsed === 'string') { - parsed = JSON.parse(parsed); - } else if (parsed) { - parsed = JSON.parse(JSON.stringify(parsed)); // make a copy. - } - return [extrinsic, parsed, collectedCallArguments, callArgumentsMeta] as [pst.Extrinsic, any, [string, string, pst.RuntimeCallArgument[]][], pst.RuntimeCallArgument[]]; - }), - map(([extrinsic, callArguments, collectedCallArguments, callArgumentsMeta]) => { - - let attributesFromObject: any[] | undefined; - if (Array.isArray(callArguments)) { - attributesFromObject = callArguments; - } else if (Object.prototype.toString.call(callArguments) === '[object Object]') { - attributesFromObject = []; - - // In case of subsquid data. Removes redundant '__kind' properties at the first level. - (Object.entries(callArguments) as [key: string, attr: any][]).forEach(([key, attr]) => { - if (attr && attr['__kind']) { - if (attr.value && attr.value['__kind']) { - // Sublevel type found. Leave as is. - return; - } else { - callArguments[key] = attr.value || attr; - } - } - }) - - // Loop through the call arguments metadata. These are indexed. - // Find values for each call argument and add it to the attributesFromObject array. - if (callArgumentsMeta && callArgumentsMeta.length > 0) { - callArgumentsMeta.forEach((meta) => { - - if (meta.name) { - const camelCaseKey = meta.name.replace(/_([a-z])/g, (m, p1) => p1.toUpperCase()); - const snakeCaseKey = meta.name.replace(/[A-Z]/g, (m) => '_' + m.toLowerCase()); - - if (callArguments.hasOwnProperty(camelCaseKey) || callArguments.hasOwnProperty(snakeCaseKey)) { - attributesFromObject!.push({ - name: meta.name, - type: meta.scaleType, - value: callArguments[camelCaseKey] || callArguments[snakeCaseKey] - }) - // Value has been added to the array. - // Remove it from the original object to prevent it being added a second time in a later stage. - delete callArguments[camelCaseKey]; - delete callArguments[snakeCaseKey]; - } - } - }) - - // Add leftover values that have not been added while looping the call arguments. - Object.entries(callArguments).forEach(([key, attr]) => { - attributesFromObject!.push({ - name: key, - value: attr - }) - }) - } - } - - // The below code in the if statement is specifically to convert JSON that came from a subsquid archive node. - // Find values recursively in the attributes object to match with other (pallet) call arguments. - if (attributesFromObject && attributesFromObject.length > 0) { - const convertSubquidTypedValues = (arrayOrObject: any) => { - - if (Array.isArray(arrayOrObject)) { - arrayOrObject.forEach((value, index) => { - - if (value['__kind'] && value.value && value.value['__kind']) { - const subArgsMeta = collectedCallArguments.find( - (v) => { - const camelCaseParentKey = (value['__kind'] as string).replace(/_([a-z])/g, (m, p1) => p1.toUpperCase()); - const snakeCaseParentKey = (value['__kind'] as string).replace(/[A-Z]/g, (m) => '_' + m.toLowerCase()); - const camelCaseSubKey = (value.value['__kind'] as string).replace(/_([a-z])/g, (m, p1) => p1.toUpperCase()); - const snakeCaseSubKey = (value.value['__kind'] as string).replace(/[A-Z]/g, (m) => '_' + m.toLowerCase()); - return (v[0] === camelCaseParentKey || v[0] === snakeCaseParentKey) - && (v[1] === camelCaseSubKey || v[1] === snakeCaseSubKey) - } - ); - - if (subArgsMeta) { - const subCallArgs: any[] = []; - const unknownSubCallArgs: any[] = []; - - Object.entries(value.value).forEach(([key, attr]) => { - if (key === '__kind') { - return; - } - - let i: number | undefined; - const subArgMeta = subArgsMeta[2].find((a, ii) => { - const camelCaseKey = key.replace(/_([a-z])/g, (m, p1) => p1.toUpperCase()); - const snakeCaseKey = key.replace(/[A-Z]/g, (m) => '_' + m.toLowerCase()); - if (camelCaseKey === a.name || snakeCaseKey === a.name) { - i = ii; - return true; - } - return false; - }); - - if (subArgMeta) { - if ((attr as any)['__kind'] && (attr as any).value && !(attr as any).value['__kind']) { - if (Object.keys((attr as any)).length === 2) { - // The real value is one level deeper. - attr = (attr as any).value; - } - } - - subCallArgs[i!] = { - name: subArgMeta.name, - type: subArgMeta.scaleType, - value: attr - } - } else { - unknownSubCallArgs!.push({ - name: key, - value: attr - }) - } - }) - - // Add values that have not been added by an indexed call argument - const resultSubCallArgs = [...subCallArgs.filter((a) => !!a), ...unknownSubCallArgs] - convertSubquidTypedValues(resultSubCallArgs); - - arrayOrObject[index] = { - 'call_module': value['__kind'], - 'call_function': value.value['__kind'], - 'call_args': resultSubCallArgs - } - } - } else if (value['__kind'] && value.value) { - value[value['__kind']] = value.value; - delete value['__kind']; - convertSubquidTypedValues(value.value) - } else if (value.value) { - convertSubquidTypedValues(value.value); - } - }) - } else if (Object.prototype.toString.call(arrayOrObject) === '[object Object]') { - - if (arrayOrObject['__kind'] && arrayOrObject.value) { - if (arrayOrObject.value['__kind']) { - const subArgsMeta = collectedCallArguments.find( - (v) => { - const camelCaseParentKey = (arrayOrObject['__kind'] as string).replace(/_([a-z])/g, (m, p1) => p1.toUpperCase()); - const snakeCaseParentKey = (arrayOrObject['__kind'] as string).replace(/[A-Z]/g, (m) => '_' + m.toLowerCase()); - const camelCaseSubKey = (arrayOrObject.value['__kind'] as string).replace(/_([a-z])/g, (m, p1) => p1.toUpperCase()); - const snakeCaseSubKey = (arrayOrObject.value['__kind'] as string).replace(/[A-Z]/g, (m) => '_' + m.toLowerCase()); - return (v[0] === camelCaseParentKey || v[0] === snakeCaseParentKey) - && (v[1] === camelCaseSubKey || v[1] === snakeCaseSubKey) - } - ); - if (!subArgsMeta) { - arrayOrObject[arrayOrObject['__kind']] = arrayOrObject.value; - delete arrayOrObject['__kind']; - delete arrayOrObject.value; - } - } else { - arrayOrObject[arrayOrObject['__kind']] = arrayOrObject.value; - delete arrayOrObject['__kind']; - delete arrayOrObject.value; - } - } - Object.entries(arrayOrObject).forEach(([k, v]) => convertSubquidTypedValues(v)) - } - } - - convertSubquidTypedValues(attributesFromObject); - } - - return attributesFromObject && attributesFromObject.length > 0 ? attributesFromObject : callArguments; - }) - ) }), catchError((e) => { this.fetchAttributesStatus.next('error'); - return of(''); - }), - tap({ - next: () => this.fetchAttributesStatus.next(null) + return of(null); }) ) + + this.runtimeCallArguments = this.extrinsic.pipe( + combineLatestWith(this.networkProperties), + switchMap(([extrinsic, props]) => { + if (extrinsic && extrinsic.specVersion && extrinsic.callModule && extrinsic.callName) { + return this.rs.getRuntime(this.ns.currentNetwork.value, extrinsic.specVersion).pipe( + filter((r) => !!r), + switchMap(() => + this.rs.getRuntimeCallArguments( + this.ns.currentNetwork.value, + extrinsic.specVersion!, + extrinsic.callModule!, + extrinsic.callName! + ) + ) + ) + } + return of(null); + }), + takeUntil(this.destroyer) + ) } ngOnDestroy(): void { diff --git a/src/app/pages/network/explorer/extrinsic/extrinsic-list/extrinsic-list.component.ts b/src/app/pages/network/explorer/extrinsic/extrinsic-list/extrinsic-list.component.ts index 535161b9..71ff42a9 100644 --- a/src/app/pages/network/explorer/extrinsic/extrinsic-list/extrinsic-list.component.ts +++ b/src/app/pages/network/explorer/extrinsic/extrinsic-list/extrinsic-list.component.ts @@ -78,7 +78,6 @@ export class ExtrinsicListComponent extends PaginatedListComponentBase [ params.get('address') as string || '', @@ -90,7 +89,8 @@ export class ExtrinsicListComponent extends PaginatedListComponentBase { @@ -268,14 +268,14 @@ export class ExtrinsicListComponent extends PaginatedListComponentBase r !== null), switchMap((runtime) => combineLatest([ - this.rs.getRuntimePallets(network, (runtime as pst.Runtime).specVersion).pipe(takeUntil(this.destroyer)), - this.rs.getRuntimeCalls(network, (runtime as pst.Runtime).specVersion).pipe(takeUntil(this.destroyer)) + this.rs.getRuntimePallets(network, (runtime as pst.Runtime).specVersion), + this.rs.getRuntimeCalls(network, (runtime as pst.Runtime).specVersion) ]) - ) + ), + takeUntil(this.destroyer) ).subscribe({ next: ([pallets, calls]): void => { if (pallets) { diff --git a/src/app/pages/network/explorer/log/log-detail/log-detail.component.ts b/src/app/pages/network/explorer/log/log-detail/log-detail.component.ts index 83172dcb..b585b05f 100644 --- a/src/app/pages/network/explorer/log/log-detail/log-detail.component.ts +++ b/src/app/pages/network/explorer/log/log-detail/log-detail.component.ts @@ -45,20 +45,18 @@ export class LogDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { const paramsObservable = this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), // Network must be set. filter(network => !!network), // Only need to load once. first(), // Switch over to the route param from which we extract the extrinsic keys. switchMap(() => this.route.params.pipe( - takeUntil(this.destroyer), map(params => params['id'].split('-').map((v: string) => parseInt(v, 10))) - )) + )), + takeUntil(this.destroyer) ) this.log = paramsObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchLogStatus.next('loading') }), @@ -76,7 +74,8 @@ export class LogDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchLogStatus.next('error'); return of(null); - }) + }), + takeUntil(this.destroyer) ); } diff --git a/src/app/pages/network/explorer/runtime/call/runtime-call-detail/runtime-call-detail.component.ts b/src/app/pages/network/explorer/runtime/call/runtime-call-detail/runtime-call-detail.component.ts index eed97f77..9a55665a 100644 --- a/src/app/pages/network/explorer/runtime/call/runtime-call-detail/runtime-call-detail.component.ts +++ b/src/app/pages/network/explorer/runtime/call/runtime-call-detail/runtime-call-detail.component.ts @@ -54,12 +54,10 @@ export class RuntimeCallDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { // Get the network. const runtimeObservable = this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), filter(network => !!network), first(), // Get the route parameters. switchMap(network => this.route.params.pipe( - takeUntil(this.destroyer), map(params => { const lastIndex = params['runtime'].lastIndexOf('-'); const specName = params['runtime'].substring(0, lastIndex); @@ -76,15 +74,18 @@ export class RuntimeCallDetailComponent implements OnInit, OnDestroy { )), switchMap(([specName, specVersion, pallet, callName]) => this.rs.getRuntime(specName, specVersion).pipe( - takeUntil(this.destroyer), map(runtime => [runtime as pst.Runtime, pallet, callName]) ) ), - shareReplay(1) - ) + takeUntil(this.destroyer), // refCount is false, destroy manually + shareReplay({ + bufferSize: 1, + refCount: false + }), + takeUntil(this.destroyer) + ); this.call = runtimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchCallStatus.next('loading') }), @@ -93,7 +94,7 @@ export class RuntimeCallDetailComponent implements OnInit, OnDestroy { this.rs.getRuntimeCalls(runtime.specName, runtime.specVersion).pipe( map((calls) => { const palletCall: pst.RuntimeCall = calls.filter(c => - c.pallet === pallet && c.callName === callName + c.pallet.toLowerCase() === pallet.toLowerCase() && c.callName.toLowerCase() === callName.toLowerCase() )[0]; if (palletCall) { @@ -108,7 +109,8 @@ export class RuntimeCallDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchCallStatus.next('error'); return of(null); - }) + }), + takeUntil(this.destroyer) ); this.callArguments = runtimeObservable.pipe( diff --git a/src/app/pages/network/explorer/runtime/constant/runtime-constant-detail/runtime-constant-detail.component.ts b/src/app/pages/network/explorer/runtime/constant/runtime-constant-detail/runtime-constant-detail.component.ts index 06848b12..ec0b092c 100644 --- a/src/app/pages/network/explorer/runtime/constant/runtime-constant-detail/runtime-constant-detail.component.ts +++ b/src/app/pages/network/explorer/runtime/constant/runtime-constant-detail/runtime-constant-detail.component.ts @@ -50,12 +50,10 @@ export class RuntimeConstantDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { // Get the network. const runtimeObservable = this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), filter(network => !!network), first(), // Get the route parameters. switchMap(network => this.route.params.pipe( - takeUntil(this.destroyer), map(params => { const lastIndex = params['runtime'].lastIndexOf('-'); const specName = params['runtime'].substring(0, lastIndex); @@ -72,13 +70,12 @@ export class RuntimeConstantDetailComponent implements OnInit, OnDestroy { )), switchMap(([specName, specVersion, pallet, constantName]) => this.rs.getRuntime(specName, specVersion).pipe( - takeUntil(this.destroyer), map(runtime => [runtime as pst.Runtime, pallet, constantName]) - )) + )), + takeUntil(this.destroyer) ); this.constant = runtimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchConstantStatus.next(null) }), @@ -87,10 +84,9 @@ export class RuntimeConstantDetailComponent implements OnInit, OnDestroy { return of(null); } return this.rs.getRuntimeConstants(runtime.specName, runtime.specVersion).pipe( - takeUntil(this.destroyer), map((constants) => { const palletConstant: pst.RuntimeConstant = constants.filter(s => - s.pallet === pallet && s.constantName === constantName + s.pallet.toLowerCase() === pallet.toLowerCase() && s.constantName.toLowerCase() === constantName.toLowerCase() )[0]; if (palletConstant) { if (palletConstant.scaleTypeComposition) { @@ -110,7 +106,8 @@ export class RuntimeConstantDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchConstantStatus.next('error'); return of(null); - }) + }), + takeUntil(this.destroyer) ); } diff --git a/src/app/pages/network/explorer/runtime/event/runtime-event-detail/runtime-event-detail.component.ts b/src/app/pages/network/explorer/runtime/event/runtime-event-detail/runtime-event-detail.component.ts index 7e41919d..00a70376 100644 --- a/src/app/pages/network/explorer/runtime/event/runtime-event-detail/runtime-event-detail.component.ts +++ b/src/app/pages/network/explorer/runtime/event/runtime-event-detail/runtime-event-detail.component.ts @@ -54,12 +54,10 @@ export class RuntimeEventDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { // Get the network. const runtimeObservable = this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), filter(network => !!network), first(), // Get the route parameters. switchMap(network => this.route.params.pipe( - takeUntil(this.destroyer), map(params => { const lastIndex = params['runtime'].lastIndexOf('-'); const specName = params['runtime'].substring(0, lastIndex); @@ -76,18 +74,17 @@ export class RuntimeEventDetailComponent implements OnInit, OnDestroy { )), switchMap(([specName, specVersion, pallet, eventName]) => this.rs.getRuntime(specName, specVersion).pipe( - takeUntil(this.destroyer), map(runtime => [runtime as pst.Runtime, pallet, eventName]) ) ), shareReplay({ bufferSize: 1, refCount: true - }) + }), + takeUntil(this.destroyer) ); this.event = runtimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchEventStatus.next('loading') }), @@ -95,7 +92,7 @@ export class RuntimeEventDetailComponent implements OnInit, OnDestroy { runtime ? this.rs.getRuntimeEvents(runtime.specName, runtime.specVersion).pipe( map((events) => { - const matchedEvent: pst.RuntimeEvent = events.filter(e => e.pallet === pallet && e.eventName === eventName)[0]; + const matchedEvent: pst.RuntimeEvent = events.filter(e => e.pallet.toLowerCase() === pallet.toLowerCase() && e.eventName?.toLowerCase() === eventName.toLowerCase())[0]; if (matchedEvent) { this.fetchEventStatus.next(null); return matchedEvent; @@ -108,11 +105,11 @@ export class RuntimeEventDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchEventStatus.next('error'); return of(null); - }) + }), + takeUntil(this.destroyer), ) this.eventAttributes = runtimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchEventAttributesStatus.next('loading') }), @@ -140,7 +137,8 @@ export class RuntimeEventDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchEventAttributesStatus.next('error'); return of([]); - }) + }), + takeUntil(this.destroyer) ) } diff --git a/src/app/pages/network/explorer/runtime/pallet/runtime-pallet-detail/runtime-pallet-detail.component.ts b/src/app/pages/network/explorer/runtime/pallet/runtime-pallet-detail/runtime-pallet-detail.component.ts index 632236ba..1b2f9587 100644 --- a/src/app/pages/network/explorer/runtime/pallet/runtime-pallet-detail/runtime-pallet-detail.component.ts +++ b/src/app/pages/network/explorer/runtime/pallet/runtime-pallet-detail/runtime-pallet-detail.component.ts @@ -67,19 +67,18 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { // Get the network. const paramsObservable = this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), filter(network => network !== ''), first(), // Get the route parameters. switchMap(network => this.route.params.pipe( - takeUntil(this.destroyer), map(params => { const lastIndex = params['runtime'].lastIndexOf('-'); const specName = params['runtime'].substring(0, lastIndex); const specVersion = params['runtime'].substring(lastIndex + 1); return [specName, parseInt(specVersion, 10), params['pallet']]; }) - )) + )), + takeUntil(this.destroyer) ) this.runtime = paramsObservable.pipe( @@ -87,15 +86,12 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { ) const runtimeObservable = paramsObservable.pipe( - switchMap(([specName, specVersion]) => { - return this.rs.getRuntime(specName as string, specVersion as number).pipe( - takeUntil(this.destroyer) - ) - }), + switchMap(([specName, specVersion]) => this.rs.getRuntime(specName as string, specVersion as number)), catchError((e) => { this.fetchRuntimeStatus.next(e); return of(null); - }) + }), + takeUntil(this.destroyer) ); const paramsAndRuntimeObservable = combineLatest( @@ -104,7 +100,6 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { ); this.pallet = paramsAndRuntimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchPalletStatus.next('loading') }), @@ -113,7 +108,7 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { runtime ? this.rs.getRuntimePallets(runtime.specName as string, runtime.specVersion as number).pipe( map((pallets) => { - const matchedPallet: pst.RuntimePallet = pallets.filter(p => p.pallet === pallet)[0]; + const matchedPallet: pst.RuntimePallet = pallets.filter(p => p.pallet.toLowerCase() === pallet.toLowerCase())[0]; if (matchedPallet) { this.fetchPalletStatus.next(null); return matchedPallet @@ -126,11 +121,11 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchPalletStatus.next('error'); return of(null); - }) + }), + takeUntil(this.destroyer) ) this.calls = paramsAndRuntimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchCallsStatus.next('loading') }), @@ -139,7 +134,7 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { runtime ? this.rs.getRuntimeCalls(runtime.specName as string, runtime.specVersion as number).pipe( map((calls) => { - const palletCalls: pst.RuntimeCall[] = calls.filter(c => c.pallet === pallet); + const palletCalls: pst.RuntimeCall[] = calls.filter(c => c.pallet.toLowerCase() === pallet.toLowerCase()); this.fetchCallsStatus.next(null); return palletCalls }) @@ -149,11 +144,11 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchCallsStatus.next('error'); return of([]); - }) + }), + takeUntil(this.destroyer) ) this.events = paramsAndRuntimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchEventsStatus.next('loading') }), @@ -162,7 +157,7 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { runtime ? this.rs.getRuntimeEvents(runtime.specName as string, runtime.specVersion as number).pipe( map((events) => { - const palletEvents: pst.RuntimeEvent[] = events.filter(e => e.pallet === pallet); + const palletEvents: pst.RuntimeEvent[] = events.filter(e => e.pallet.toLowerCase() === pallet.toLowerCase()); this.fetchEventsStatus.next(null); return palletEvents; }) @@ -172,11 +167,11 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchEventsStatus.next('error'); return of([]); - }) + }), + takeUntil(this.destroyer) ) this.storages = paramsAndRuntimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchStoragesStatus.next('loading') }), @@ -185,7 +180,7 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { runtime ? this.rs.getRuntimeStorages(runtime.specName as string, runtime.specVersion as number).pipe( map((storages) => { - const palletStorages: pst.RuntimeStorage[] = storages.filter(s => s.pallet === pallet); + const palletStorages: pst.RuntimeStorage[] = storages.filter(s => s.pallet.toLowerCase() === pallet.toLowerCase()); this.fetchStoragesStatus.next(null); return palletStorages; }) @@ -195,11 +190,11 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchStoragesStatus.next('error'); return of([]); - }) + }), + takeUntil(this.destroyer) ) this.constants = paramsAndRuntimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchConstantsStatus.next('loading') }), @@ -208,7 +203,7 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { runtime ? this.rs.getRuntimeConstants(runtime.specName as string, runtime.specVersion as number).pipe( map((constants) => { - const palletConstants: pst.RuntimeConstant[] = constants.filter(c => c.pallet === pallet); + const palletConstants: pst.RuntimeConstant[] = constants.filter(c => c.pallet.toLowerCase() === pallet.toLowerCase()); this.fetchConstantsStatus.next(null); return palletConstants; }) @@ -218,11 +213,11 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchConstantsStatus.next('error'); return of([]); - }) + }), + takeUntil(this.destroyer) ) this.errorsMessages = paramsAndRuntimeObservable.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchErrorMessagesStatus.next('loading') }), @@ -231,7 +226,7 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { runtime ? this.rs.getRuntimeErrorMessages(runtime.specName as string, runtime.specVersion as number).pipe( map((errors) => { - const palletErrors: pst.RuntimeErrorMessage[] = errors.filter(e => e.pallet === pallet); + const palletErrors: pst.RuntimeErrorMessage[] = errors.filter(e => e.pallet.toLowerCase() === pallet.toLowerCase()); this.fetchErrorMessagesStatus.next(null); return palletErrors; }) @@ -241,7 +236,8 @@ export class RuntimePalletDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchErrorMessagesStatus.next('error'); return of([]); - }) + }), + takeUntil(this.destroyer) ) } diff --git a/src/app/pages/network/explorer/runtime/runtime-detail/runtime-detail.component.ts b/src/app/pages/network/explorer/runtime/runtime-detail/runtime-detail.component.ts index 5a715234..46e8da4f 100644 --- a/src/app/pages/network/explorer/runtime/runtime-detail/runtime-detail.component.ts +++ b/src/app/pages/network/explorer/runtime/runtime-detail/runtime-detail.component.ts @@ -51,22 +51,20 @@ export class RuntimeDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { const observable = this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), filter(network => network !== ''), first(), switchMap(() => this.route.params.pipe( - takeUntil(this.destroyer), map(params => { const lastIndex = params['runtime'].lastIndexOf('-'); const specName = params['runtime'].substring(0, lastIndex); const specVersion = params['runtime'].substring(lastIndex + 1); return [specName, parseInt(specVersion, 10)]; }) - )) + )), + takeUntil(this.destroyer) ) this.runtime = observable.pipe( - takeUntil(this.destroyer), tap((runtime) => this.fetchRuntimeStatus.next('loading')), switchMap(([specName, specVersion]) => { return this.rs.getRuntime(specName as string, specVersion as number).pipe( @@ -77,11 +75,11 @@ export class RuntimeDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchRuntimeStatus.next('error'); return of(null); - }) + }), + takeUntil(this.destroyer) ); this.pallets = this.runtime.pipe( - takeUntil(this.destroyer), tap({ subscribe: () => this.fetchPalletsStatus.next('loading') }), @@ -98,7 +96,8 @@ export class RuntimeDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchPalletsStatus.next('error'); return of([]); - }) + }), + takeUntil(this.destroyer) ); } diff --git a/src/app/pages/network/explorer/runtime/runtime-list/runtime-list.component.ts b/src/app/pages/network/explorer/runtime/runtime-list/runtime-list.component.ts index e1c06682..786d9b6c 100644 --- a/src/app/pages/network/explorer/runtime/runtime-list/runtime-list.component.ts +++ b/src/app/pages/network/explorer/runtime/runtime-list/runtime-list.component.ts @@ -21,7 +21,7 @@ import { RuntimeService } from '../../../../../services/runtime/runtime.service' import { BehaviorSubject, Subject } from 'rxjs'; import { types as pst } from '@polkadapt/core'; import { NetworkService } from '../../../../../services/network.service'; -import { filter, first, map, switchMap, takeUntil, takeWhile, tap } from 'rxjs/operators'; +import { filter, first, map, switchMap, takeUntil, takeWhile } from 'rxjs/operators'; @Component({ @@ -44,12 +44,10 @@ export class RuntimeListComponent implements OnInit, OnDestroy { ngOnInit(): void { this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), filter(network => !!network), first(), - switchMap(network => this.rs.getRuntimes(network).pipe( - takeUntil(this.destroyer) - )) + switchMap(network => this.rs.getRuntimes(network)), + takeUntil(this.destroyer), ).subscribe({ next: (runtimes) => { for (let runtime of runtimes) { diff --git a/src/app/pages/network/explorer/runtime/storage/runtime-storage-detail/runtime-storage-detail.component.ts b/src/app/pages/network/explorer/runtime/storage/runtime-storage-detail/runtime-storage-detail.component.ts index 21f3ac3c..fb06db4f 100644 --- a/src/app/pages/network/explorer/runtime/storage/runtime-storage-detail/runtime-storage-detail.component.ts +++ b/src/app/pages/network/explorer/runtime/storage/runtime-storage-detail/runtime-storage-detail.component.ts @@ -48,12 +48,10 @@ export class RuntimeStorageDetailComponent implements OnInit, OnDestroy { ngOnInit(): void { // Get the network. const observable = this.ns.currentNetwork.pipe( - takeUntil(this.destroyer), filter(network => !!network), first(), // Get the route parameters. switchMap(network => this.route.params.pipe( - takeUntil(this.destroyer), map(params => { const lastIndex = params['runtime'].lastIndexOf('-'); const specName = params['runtime'].substring(0, lastIndex); @@ -61,7 +59,8 @@ export class RuntimeStorageDetailComponent implements OnInit, OnDestroy { return [specName, parseInt(specVersion, 10), params['pallet'], params['storageName']]; }) ) - ) + ), + takeUntil(this.destroyer) ) this.runtime = observable.pipe( @@ -78,16 +77,15 @@ export class RuntimeStorageDetailComponent implements OnInit, OnDestroy { }), switchMap(([specName, specVersion, pallet, storageName]) => this.rs.getRuntime(specName, specVersion).pipe( - takeUntil(this.destroyer), filter(r => r !== null), first(), - map(runtime => [runtime as pst.Runtime, pallet, storageName]) + map(runtime => [runtime as pst.Runtime, pallet, storageName]), ) ), switchMap(([runtime, pallet, storageName]) => this.rs.getRuntimeStorages(runtime.specName, runtime.specVersion).pipe( map((storages) => { const palletStorages: pst.RuntimeStorage[] = storages.filter(s => - s.pallet === pallet && s.storageName === storageName + s.pallet.toLowerCase() === pallet.toLowerCase() && s.storageName.toLowerCase() === storageName.toLowerCase() ); const storage = palletStorages[0]; if (storage) { @@ -100,7 +98,8 @@ export class RuntimeStorageDetailComponent implements OnInit, OnDestroy { catchError((e) => { this.fetchStorageStatus.next('error'); return of(null); - }) + }), + takeUntil(this.destroyer) ); } diff --git a/src/app/pages/network/explorer/transfer/transfer-list/transfer-list.component.html b/src/app/pages/network/explorer/transfer/transfer-list/transfer-list.component.html index 94bc9dca..f3eb71db 100644 --- a/src/app/pages/network/explorer/transfer/transfer-list/transfer-list.component.html +++ b/src/app/pages/network/explorer/transfer/transfer-list/transfer-list.component.html @@ -78,17 +78,17 @@

Transfers

- Extrinsic + Event -
{{event.blockNumber + '-' + event.extrinsicIdx}} + {{event.blockNumber + '-' + event.eventIdx}} From - - + + @@ -101,8 +101,8 @@

Transfers

To - - + + @@ -110,7 +110,7 @@

Transfers

Amount - +
@@ -119,7 +119,7 @@

Transfers

- chevron_right + chevron_right diff --git a/src/app/pages/network/explorer/transfer/transfer-list/transfer-list.component.ts b/src/app/pages/network/explorer/transfer/transfer-list/transfer-list.component.ts index e079c8e8..d7e30ea2 100644 --- a/src/app/pages/network/explorer/transfer/transfer-list/transfer-list.component.ts +++ b/src/app/pages/network/explorer/transfer/transfer-list/transfer-list.component.ts @@ -19,7 +19,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { PolkadaptService } from '../../../../../services/polkadapt.service'; import { NetworkService } from '../../../../../services/network.service'; -import { debounceTime, distinctUntilChanged, map, takeUntil } from 'rxjs/operators'; +import { debounceTime, distinctUntilChanged, map, shareReplay, takeUntil } from 'rxjs/operators'; import { FormControl, FormGroup } from '@angular/forms'; import { RuntimeService } from '../../../../../services/runtime/runtime.service'; import { types as pst } from '@polkadapt/core'; @@ -27,7 +27,11 @@ import { PaginatedListComponentBase } from '../../../../../../common/list-base/p import { ActivatedRoute, Params, Router } from '@angular/router'; import { BN, u8aToHex } from "@polkadot/util"; import { decodeAddress } from "@polkadot/util-crypto"; -import { Observable } from 'rxjs'; +import { catchError, Observable, of, switchMap } from 'rxjs'; + + +type eventAmounts = [string, BN][]; +type eventAddresses = [string, string]; // [from, to] @Component({ @@ -36,7 +40,7 @@ import { Observable } from 'rxjs'; styleUrls: ['./transfer-list.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class TransferListComponent extends PaginatedListComponentBase implements OnInit, OnDestroy { +export class TransferListComponent extends PaginatedListComponentBase implements OnInit, OnDestroy { listSize = 100; blockNumberIdentifier = 'blockNumber'; @@ -54,6 +58,10 @@ export class TransferListComponent extends PaginatedListComponentBase> + amountsCache = new Map> + addressesCache = new Map> + visibleColumns = ['icon', 'referencedTransaction', 'age', 'fromAddress', 'arrow', 'toAddress', 'amount', 'details']; constructor(private ns: NetworkService, @@ -67,7 +75,6 @@ export class TransferListComponent extends PaginatedListComponentBase [ params.get('dateRangeBegin') ? new Date(`${params.get('dateRangeBegin') as string}T00:00`) : '', @@ -75,7 +82,8 @@ export class TransferListComponent extends PaginatedListComponentBase { const oldDateStart = this.dateRangeBeginControl.value; @@ -163,37 +171,57 @@ export class TransferListComponent extends PaginatedListComponentBase[]> { + createGetItemsRequest(untilBlockNumber?: number): Observable[]> { const filters = this.filters; if (untilBlockNumber) { filters.blockRangeEnd = untilBlockNumber; } + let addressHex: string | undefined; if (this.addressControl.value) { - return this.pa.run(this.network).getEventsByAccount( - u8aToHex(decodeAddress(this.addressControl.value)), - filters, - this.listSize - ); + addressHex = u8aToHex(decodeAddress(this.addressControl.value)) + } + + + if (addressHex) { + return this.pa.run(this.network).getTransfersByAccount(addressHex, filters, this.listSize).pipe( + catchError(() => this.pa.run(this.network).getEventsByAccount( + addressHex!, + filters, + this.listSize + ) + ) + ) + } else { - return this.pa.run(this.network).getEvents( - filters, - this.listSize - ); + return this.pa.run(this.network).getTransfers(filters, this.listSize).pipe( + catchError(() => this.pa.run(this.network).getEvents( + filters, + this.listSize + ) + ) + ) } } - createNewItemSubscription(): Observable> { + createNewItemSubscription(): Observable> { + let address: string | undefined; if (this.addressControl.value) { - return this.pa.run(this.network).subscribeNewEventByAccount( - u8aToHex(decodeAddress(this.addressControl.value)), - this.filters - ); + address = u8aToHex(decodeAddress(this.addressControl.value)) + } + + if (address) { + return this.pa.run(this.network).subscribeNewTransferByAccount(address as string, this.filters).pipe( + catchError(() => this.pa.run(this.network).subscribeNewEventByAccount(address as string, this.filters) + ) + ) + } else { - return this.pa.run(this.network).subscribeNewEvent( - this.filters - ); + return this.pa.run(this.network).subscribeNewTransfer(this.filters).pipe( + catchError(() => this.pa.run(this.network).subscribeNewEvent(this.filters) + ) + ) } } @@ -233,41 +261,139 @@ export class TransferListComponent extends PaginatedListComponentBase obs)), + shareReplay({ + bufferSize: 1, + refCount: true + }), + takeUntil(this.destroyer) + ); + } + + getAmountsFromEvent(eventOrTransfer: pst.Event | pst.AccountEvent | pst.Transfer): Observable { + const key = `${eventOrTransfer.blockNumber}_${eventOrTransfer.eventIdx}`; + let cachedAmount = this.amountsCache.get(key); + let cachedEvent = this.rpcEventsCache.get(key); - getAmountsFromAttributes(data: string): [string, BN][] { - const attrNames = ['amount', 'actual_fee', 'actualFee', 'tip']; - const amounts: [string, BN][] = []; + if (cachedAmount) { + return cachedAmount; + } - if (typeof data === 'string') { - for (let name of attrNames) { - const match = new RegExp(`"${name}": ?\"?(\\d+)\"?`).exec(data); - if (match) { - amounts.push([name, new BN(match[1])]); + // First check if there is a Transfer available. + if ((eventOrTransfer as pst.Transfer).hasOwnProperty('amount')) { + const amounts: eventAmounts = []; + amounts.push(['amount', new BN((eventOrTransfer as pst.Transfer).amount)]); + const observable = of(amounts); + this.amountsCache.set(key, observable); + return observable; + } + + // Second check if there is an AccountEvent or Event with attributes available. + const attributes = (eventOrTransfer as pst.Event | pst.AccountEvent).attributes; + if (attributes) { + const attrNames = ['amount', 'actual_fee', 'actualFee', 'tip']; + const amounts: eventAmounts = []; + + if (typeof attributes === 'string') { + for (let name of attrNames) { + const match = new RegExp(`"${name}": ?\"?(\\d+)\"?`).exec(attributes); + if (match) { + amounts.push([name, new BN(match[1])]); + } } + } else if (Object.prototype.toString.call(attributes) == '[object Object]') { + attrNames.forEach((name) => { + if (attributes.hasOwnProperty(name)) { + amounts.push([name, new BN(attributes[name])]) + } + }) } - } else if (Object.prototype.toString.call(data) == '[object Object]') { - attrNames.forEach((name) => { - if ((data as any).hasOwnProperty(name)) { - amounts.push([name, new BN(data[name])]) + + const observable = of(amounts); + this.amountsCache.set(key, observable); + return observable; + } + + // Lastly fetch from the RPC. + if (!cachedEvent) { + cachedEvent = this.fetchAndCacheRpcEvent(eventOrTransfer); + this.rpcEventsCache.set(key, cachedEvent) + } + + const observable = cachedEvent.pipe( + map((event) => { + const amounts: [string, BN][] = []; + if (event.attributes) { + amounts.push(['amount', new BN(event.attributes[2])]); } + return amounts; + }), + shareReplay({ + bufferSize: 1, + refCount: true }) - } + ); - return amounts; + this.amountsCache.set(key, observable); + return observable; } - getAddressFromEvent(event: pst.AccountEvent, attrName: string): string { - if (event.attributes) { - const data: any = typeof event.attributes === 'string' - ? JSON.parse(event.attributes) - : event.attributes; - return data[attrName]; + getAddressFromEvent(eventOrTransfer: pst.AccountEvent | pst.Event | pst.Transfer): Observable { + const key = `${eventOrTransfer.blockNumber}_${eventOrTransfer.eventIdx}`; + let cachedAddresses = this.addressesCache.get(key); + let cachedEvent = this.rpcEventsCache.get(key); + + if (cachedAddresses) { + return cachedAddresses; + } + + // First check if there is a Transfer available. + if ((eventOrTransfer as pst.Transfer).hasOwnProperty('from') && (eventOrTransfer as pst.Transfer).hasOwnProperty('to')) { + const addresses: eventAddresses = [(eventOrTransfer as pst.Transfer).from, (eventOrTransfer as pst.Transfer).to]; + const observable = of(addresses); + this.addressesCache.set(key, observable); + return observable; } - return ''; + + // Second check if there is an AccountEvent or Event with attributes available. + const attributes = (eventOrTransfer as pst.Event | pst.AccountEvent).attributes + if (attributes) { + const data: any = typeof attributes === 'string' + ? JSON.parse(attributes) + : attributes; + if (data.from && data.to) { + const observable = of([data.from, data.to] as eventAddresses); + this.addressesCache.set(key, observable); + return observable; + } + } + + // Lastly fetch from the RPC. + if (!cachedEvent) { + cachedEvent = this.fetchAndCacheRpcEvent(eventOrTransfer); + this.rpcEventsCache.set(key, cachedEvent); + } + + const observable = cachedEvent.pipe( + map((event) => { + if (event.attributes) { + return [event.attributes[0], event.attributes[1]] as eventAddresses; + } + return ['', ''] as eventAddresses; + }), + shareReplay({ + bufferSize: 1, + refCount: true + }) + ); + + return observable; } } diff --git a/src/app/pages/network/network.component.html b/src/app/pages/network/network.component.html index 8d914efd..dad8fe78 100644 --- a/src/app/pages/network/network.component.html +++ b/src/app/pages/network/network.component.html @@ -16,10 +16,10 @@ ~ along with this program. If not, see . --> -
+
+
-
diff --git a/src/app/pages/network/network.component.scss b/src/app/pages/network/network.component.scss index 0d7dfa5a..9b43c91c 100644 --- a/src/app/pages/network/network.component.scss +++ b/src/app/pages/network/network.component.scss @@ -16,8 +16,18 @@ * along with this program. If not, see . */ +.network-page { + min-height: 100%; + background: var(--ps-top-bar-bg-color); + color: #fff; +} + .network-explorer-container { + padding-top: 1px; padding-bottom: 120px; + background: var(--ps-explorer-container, #fff); + border-radius: 4px; + color: #222; } .network-explorer-bottom-bar { @@ -30,7 +40,7 @@ justify-content: space-between; align-items: center; column-gap: 16px; - background: var(--ps-top-bar-bg-color); - color: var(--ps-top-bar-text-color); + background: var(--ps-bottom-bar-bg-color, #333); + color: var(--ps-bottom-bar-text-color, #fff); padding: 0 8px; } diff --git a/src/app/pages/network/network.component.ts b/src/app/pages/network/network.component.ts index 92f249b9..bf844f0a 100644 --- a/src/app/pages/network/network.component.ts +++ b/src/app/pages/network/network.component.ts @@ -26,7 +26,6 @@ import { PolkadaptService } from '../../services/polkadapt.service'; import { AppConfig } from '../../app-config'; @Component({ - selector: 'app-network', templateUrl: './network.component.html', styleUrls: ['./network.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush @@ -51,9 +50,9 @@ export class NetworkComponent implements OnInit, OnDestroy { // Change network when param changes in route. this.route.params .pipe( - takeUntil(this.destroyer), map((p) => p['network']), - distinctUntilChanged() + distinctUntilChanged(), + takeUntil(this.destroyer) ) .subscribe({ next: (network: string) => { @@ -69,18 +68,17 @@ export class NetworkComponent implements OnInit, OnDestroy { // Pass the last loaded number to the variables service, so other parts of the application can pick it up. this.ns.currentNetwork.pipe( - // Keep it running until this component is destroyed. - takeUntil(this.destroyer), // Only continue if a network is set. filter(network => !!network), // Only continue if the network value has changed. distinctUntilChanged(), // Watch for new loaded block numbers from the Substrate node. switchMap(() => this.ns.blockHarvester.loadedNumber.pipe( - takeUntil(this.destroyer), // Only continue if new block number is larger than 0. filter(nr => nr > 0) - )) + )), + // Keep it running until this component is destroyed. + takeUntil(this.destroyer) ).subscribe({ next: (nr) => { this.vars.blockNumber.next(nr); diff --git a/src/app/pages/network/network.module.ts b/src/app/pages/network/network.module.ts index 65d64814..5cd111f0 100644 --- a/src/app/pages/network/network.module.ts +++ b/src/app/pages/network/network.module.ts @@ -33,6 +33,7 @@ import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatOptionModule } from '@angular/material/core'; import { MatDialogModule } from '@angular/material/dialog'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; @NgModule({ @@ -42,20 +43,21 @@ import { MatDialogModule } from '@angular/material/dialog'; PsTopBarComponent, PsConnectionDialogComponent ], - imports: [ - CommonModule, - ReactiveFormsModule, - NetworkRoutingModule, - MatMenuModule, - MatButtonModule, - MatSelectModule, - MatFormFieldModule, - MatAutocompleteModule, - MatOptionModule, - MatInputModule, - MatIconModule, - MatDialogModule - ] + imports: [ + CommonModule, + ReactiveFormsModule, + NetworkRoutingModule, + MatMenuModule, + MatButtonModule, + MatSelectModule, + MatFormFieldModule, + MatAutocompleteModule, + MatOptionModule, + MatInputModule, + MatIconModule, + MatDialogModule, + MatProgressSpinnerModule + ] }) export class NetworkModule { } diff --git a/src/app/services/network.service.ts b/src/app/services/network.service.ts index f8ba7270..95d6902d 100644 --- a/src/app/services/network.service.ts +++ b/src/app/services/network.service.ts @@ -108,10 +108,10 @@ export class NetworkService { this.pa.run({observableResults: false}).getChainProperties() .pipe( - filter((properties) => Boolean((properties.name || properties.systemName) && properties.specName)) + filter((properties) => Boolean((properties.systemName) && properties.specName)) ).subscribe({ next: (properties: types.ChainProperties) => { - const name: string = (properties.name ? properties.name : properties.systemName) as string; + const name: string = properties.systemName as string; const ss58Format: number = properties.chainSS58 ?? this.defaultSS58; const tokenSymbol: string = (properties.chainTokens && properties.chainTokens[0]) ?? this.defaultSymbol; const tokenDecimals: number = (properties.chainDecimals && properties.chainDecimals[0]) ?? this.defaultDecimals; diff --git a/src/app/services/polkadapt.service.ts b/src/app/services/polkadapt.service.ts index 1ea6f333..4ea39d98 100644 --- a/src/app/services/polkadapt.service.ts +++ b/src/app/services/polkadapt.service.ts @@ -109,10 +109,10 @@ export class PolkadaptService { if (config.subsquid && Object.keys(config.subsquid).length) { aa.subsquid = new subsquid.Adapter({ chain: network, - archiveUrl: this.config.networks[network].subsquid?.archiveUrl, - explorerUrl: this.config.networks[network].subsquid?.explorerUrl, giantSquidExplorerUrl: this.config.networks[network].subsquid?.giantSquidExplorerUrl, - giantSquidMainUrl: this.config.networks[network].subsquid?.giantSquidMainUrl + giantSquidMainUrl: this.config.networks[network].subsquid?.giantSquidMainUrl, + giantSquidStatsUrl: this.config.networks[network].subsquid?.giantSquidStatsUrl, + metaDataUrl: this.config.networks[network].subsquid?.metaDataUrl }); } if (config.coingecko && config.coingecko.coinId) { diff --git a/src/app/services/runtime/runtime.service.ts b/src/app/services/runtime/runtime.service.ts index a99560f5..e081594e 100644 --- a/src/app/services/runtime/runtime.service.ts +++ b/src/app/services/runtime/runtime.service.ts @@ -166,7 +166,10 @@ export class RuntimeService { combineLatest(items.map( runtime => this.pa.run().getRuntime(runtime.specName, runtime.specVersion) )).pipe( - switchMap(runtimes => merge(...runtimes.map(r => r.pipe(last())))), + switchMap(runtimes => merge(...runtimes.map(r => r.pipe( + filter((runtime) => runtime.countPallets !== undefined), + take(1) + )))), ).subscribe((runtime: types.Runtime) => { bs.getValue().forEach(r => { if (r.specName === runtime.specName && r.specVersion === runtime.specVersion) { diff --git a/src/assets/polkadot-icons/batch-transaction.svg b/src/assets/polkadot-icons/batch-transaction.svg new file mode 100644 index 00000000..1cc0a6ea --- /dev/null +++ b/src/assets/polkadot-icons/batch-transaction.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/block-number.svg b/src/assets/polkadot-icons/block-number.svg new file mode 100644 index 00000000..bbed9592 --- /dev/null +++ b/src/assets/polkadot-icons/block-number.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/blockchain.svg b/src/assets/polkadot-icons/blockchain.svg new file mode 100644 index 00000000..7ccb5aba --- /dev/null +++ b/src/assets/polkadot-icons/blockchain.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/events.svg b/src/assets/polkadot-icons/events.svg new file mode 100644 index 00000000..e315be6e --- /dev/null +++ b/src/assets/polkadot-icons/events.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/gift.svg b/src/assets/polkadot-icons/gift.svg new file mode 100644 index 00000000..c8d1dda2 --- /dev/null +++ b/src/assets/polkadot-icons/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/investors.svg b/src/assets/polkadot-icons/investors.svg new file mode 100644 index 00000000..598d6eb5 --- /dev/null +++ b/src/assets/polkadot-icons/investors.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/nominators.svg b/src/assets/polkadot-icons/nominators.svg new file mode 100644 index 00000000..fad4bf93 --- /dev/null +++ b/src/assets/polkadot-icons/nominators.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/proof-of-stake.svg b/src/assets/polkadot-icons/proof-of-stake.svg new file mode 100644 index 00000000..e390632b --- /dev/null +++ b/src/assets/polkadot-icons/proof-of-stake.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/starting-period.svg b/src/assets/polkadot-icons/starting-period.svg new file mode 100644 index 00000000..18e5e00f --- /dev/null +++ b/src/assets/polkadot-icons/starting-period.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/transaction.svg b/src/assets/polkadot-icons/transaction.svg new file mode 100644 index 00000000..050b25cc --- /dev/null +++ b/src/assets/polkadot-icons/transaction.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/validators.svg b/src/assets/polkadot-icons/validators.svg new file mode 100644 index 00000000..0818a8e4 --- /dev/null +++ b/src/assets/polkadot-icons/validators.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/verified-signed.svg b/src/assets/polkadot-icons/verified-signed.svg new file mode 100644 index 00000000..b52e8cff --- /dev/null +++ b/src/assets/polkadot-icons/verified-signed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/wallet.svg b/src/assets/polkadot-icons/wallet.svg new file mode 100644 index 00000000..cf21c1a0 --- /dev/null +++ b/src/assets/polkadot-icons/wallet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/polkadot-icons/wallets.svg b/src/assets/polkadot-icons/wallets.svg new file mode 100644 index 00000000..2b0446de --- /dev/null +++ b/src/assets/polkadot-icons/wallets.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/common/account-id/account-id.common.component.ts b/src/common/account-id/account-id.common.component.ts index 83c1ed39..1298bb56 100644 --- a/src/common/account-id/account-id.common.component.ts +++ b/src/common/account-id/account-id.common.component.ts @@ -182,11 +182,9 @@ export class AccountIdCommonComponent implements OnInit, OnChanges, OnDestroy { } const apiPromise = this.pa.availableAdapters[network as string].substrateRpc!.apiPromise; return from(apiPromise).pipe( - takeUntil(this.destroyer), - switchMap((api) => api.derive.accounts.info(address).pipe( - takeUntil(this.destroyer) - ) as Observable - )); + switchMap((api) => api.derive.accounts.info(address) as Observable), + takeUntil(this.destroyer) + ); }) ); diff --git a/src/common/attributes/attributes.component.html b/src/common/attributes/attributes.component.html index ddc42cb0..59c04bcd 100644 --- a/src/common/attributes/attributes.component.html +++ b/src/common/attributes/attributes.component.html @@ -21,7 +21,8 @@ - +
+
{{attribute.type}} ({{attribute.composition}})
@@ -43,7 +44,6 @@ - diff --git a/src/common/attributes/attributes.component.ts b/src/common/attributes/attributes.component.ts index 0f32798b..c7546ec8 100644 --- a/src/common/attributes/attributes.component.ts +++ b/src/common/attributes/attributes.component.ts @@ -17,107 +17,146 @@ */ import { - ChangeDetectionStrategy, - Component, - Input, - OnChanges, - SimpleChanges, - ViewEncapsulation + ChangeDetectionStrategy, + Component, + Input, + OnChanges, + SimpleChanges, + ViewEncapsulation } from '@angular/core'; import { IconTheme } from '../identicon/identicon.types'; import { Prefix } from '@polkadot/util-crypto/address/types'; import { types as pst } from '@polkadapt/core'; -import { attributesConfig as attrConfig} from './attributes.config'; +import { attributesConfig as attrConfig } from './attributes.config'; import { BehaviorSubject } from 'rxjs'; @Component({ - selector: 'attributes', - templateUrl: 'attributes.component.html', - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush + selector: 'attributes', + templateUrl: 'attributes.component.html', + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush }) export class AttributesComponent implements OnChanges { - @Input() attributes: any[] | string; - @Input() iconTheme: IconTheme; - @Input() iconSize: number; - @Input() tokenDecimals: number; - @Input() tokenSymbol: string; - @Input() ss58Prefix: Prefix; - @Input() runtimeEventAttributes: pst.RuntimeEventAttribute[] | null | undefined; + @Input() attributes: any[] | string; + @Input() iconTheme: IconTheme; + @Input() iconSize: number; + @Input() tokenDecimals: number; + @Input() tokenSymbol: string; + @Input() ss58Prefix: Prefix; + @Input() runtimeEventAttributes: pst.RuntimeEventAttribute[] | null | undefined; + @Input() runtimeCallArguments: pst.RuntimeCallArgument[] | null | undefined; - isArray = new BehaviorSubject(false); + isArray = new BehaviorSubject(false); - parsedAttributes: any[] = []; - attributesConfig = attrConfig; + parsedAttributes: any[] = []; + attributesConfig = attrConfig; - constructor() { - } + constructor() { + } - ngOnChanges(changes: SimpleChanges): void { - if (changes['attributes'] || changes['runtimeEventAttributes']) { - let attrs = []; - const currentValue = this.attributes; + ngOnChanges(changes: SimpleChanges): void { + if (changes['attributes'] || changes['runtimeEventAttributes'] || changes['runtimeCallArguments']) { + let attrs = []; + const currentValue = this.attributes; - if (currentValue) { - if (typeof currentValue === 'string') { - try { - const parsed = JSON.parse(currentValue); - if (Array.isArray(parsed)) { - attrs = parsed; - this.isArray.next(true); - } else if (typeof parsed === 'object' && Object.keys(parsed).length) { - attrs = [parsed]; - } - } catch (e) { - // Do nothing - } - } else if (Array.isArray(currentValue)) { - this.isArray.next(true); - attrs = currentValue; - } else if (typeof currentValue === 'object') { - attrs = [currentValue]; - } + if (currentValue) { + if (typeof currentValue === 'string') { + try { + const parsed = JSON.parse(currentValue); + if (Array.isArray(parsed)) { + attrs = parsed; + this.isArray.next(true); + } else if (typeof parsed === 'object' && Object.keys(parsed).length) { + attrs = [parsed]; + } + } catch (e) { + // Do nothing + } + } else if (Array.isArray(currentValue)) { + this.isArray.next(true); + attrs = currentValue; + } else if (typeof currentValue === 'object') { + attrs = [currentValue]; + } + + if (Array.isArray(this.runtimeEventAttributes) || Array.isArray(this.runtimeCallArguments)) { + attrs = attrs.map((value, i) => { + if (value.type) { + return value; + } + + if (typeof value === 'object' && !Array.isArray(value)) { + // This is an Object with (sub)attribute names and values. + value = Object.entries(value).map(([subName, subValue]) => { + const camelCase = subName.replace(/_([a-z])/g, (m, p1) => p1.toUpperCase()); + const snakeCase = subName.replace(/[A-Z]/g, (m) => '_' + m.toLowerCase()); + + let eventAttribute: pst.RuntimeEventAttribute | undefined; + if (this.runtimeEventAttributes) { + eventAttribute = (this.runtimeEventAttributes as pst.RuntimeEventAttribute[]).find( + (ea) => ea.eventAttributeName === subName + || ea.eventAttributeName === camelCase + || ea.eventAttributeName === snakeCase + ); + } + + let callArgument: pst.RuntimeCallArgument | undefined; + if (this.runtimeCallArguments) { + callArgument = (this.runtimeCallArguments as pst.RuntimeCallArgument[]).find( + (ea) => ea.callName === subName + || ea.callName === camelCase + || ea.callName === snakeCase + ); + } + + if (eventAttribute && eventAttribute.scaleType) { + return { + name: subName, + type: eventAttribute.scaleType, + composition: eventAttribute.scaleTypeComposition, + value: subValue + }; + } else if (callArgument && callArgument.scaleType) { + return { + name: subName, + type: callArgument.scaleType, + composition: callArgument.scaleTypeComposition, + value: subValue + }; + } else { + if (subName) { + return {name: subName, value: subValue}; + } else { + return subValue; + } + } + }); + } - if (Array.isArray(this.runtimeEventAttributes)) { - attrs = attrs.map(value => { - if (value.type) { - return value; - } - if (typeof value === 'object' && !Array.isArray(value)) { - // This is an Object with (sub)attribute names and values. - value = Object.entries(value).map(([subName, subValue]) => { - const camelCase = subName.replace(/_([a-z])/g, (m, p1) => p1.toUpperCase()); - const snakeCase = subName.replace(/[A-Z]/g, (m) => '_' + m.toLowerCase()); - const eventAttribute = (this.runtimeEventAttributes as pst.RuntimeEventAttribute[]).find( - (ea) => ea.eventAttributeName === subName - || ea.eventAttributeName === camelCase - || ea.eventAttributeName === snakeCase - ); + if (this.runtimeEventAttributes) { + return { + name: (this.runtimeEventAttributes as pst.RuntimeEventAttribute[])[i].eventAttributeName, + type: (this.runtimeEventAttributes as pst.RuntimeEventAttribute[])[i].scaleType, + composition: (this.runtimeEventAttributes as pst.RuntimeEventAttribute[])[i].scaleTypeComposition, + value: value + } - if (eventAttribute && eventAttribute.scaleType) { - return { - name: subName, - type: eventAttribute.scaleType, - value: subValue - }; - } else { - if (subName) { - return {name: subName, value: subValue}; - } else { - return subValue; - } + } else if (this.runtimeCallArguments) { + return { + name: (this.runtimeCallArguments as pst.RuntimeCallArgument[])[i].name, + type: (this.runtimeCallArguments as pst.RuntimeCallArgument[])[i].scaleType, + composition: (this.runtimeCallArguments as pst.RuntimeCallArgument[])[i].scaleTypeComposition, + value: value + } + } + }); + if (attrs.length === 1 && Array.isArray(attrs[0])) { + attrs = attrs[0]; + } } - }); } - return value; - }); - if (attrs.length === 1 && Array.isArray(attrs[0])) { - attrs = attrs[0]; - } + this.parsedAttributes = attrs; } - } - this.parsedAttributes = attrs; } - } } diff --git a/src/common/attributes/attributes/attribute-address.component.ts b/src/common/attributes/attributes/attribute-address.component.ts index 68f5b450..680056fa 100644 --- a/src/common/attributes/attributes/attribute-address.component.ts +++ b/src/common/attributes/attributes/attribute-address.component.ts @@ -45,7 +45,7 @@ import { TooltipsService } from '../../../app/services/tooltips.service'; changeDetection: ChangeDetectionStrategy.OnPush }) export class AttributeAddressComponent implements OnChanges { - @Input() attribute: { type: string, value: HexString | Uint8Array | string }; + @Input() attribute: { type: string, composition: string, value: HexString | Uint8Array | string }; @Input() iconTheme: IconTheme; @Input() iconSize: number; @Input() tokenDecimals: number; @@ -59,9 +59,17 @@ export class AttributeAddressComponent implements OnChanges { ngOnChanges(changes: SimpleChanges): void { if (changes['attribute']) { - const value = changes['attribute'].currentValue && changes['attribute'].currentValue.value; + let value = changes['attribute'].currentValue && changes['attribute'].currentValue.value; let address = ''; + if (this.attribute.composition === 'MultiAddress') { + if (Array.isArray(value) && value.length) { + if (value[0]?.value) { + value = value[0].value; + } + } + } + if (value) { try { address = isU8a(value) || isHex(value) diff --git a/src/common/balance/balance.common.component.ts b/src/common/balance/balance.common.component.ts index 9f08cbed..2ce37b3e 100644 --- a/src/common/balance/balance.common.component.ts +++ b/src/common/balance/balance.common.component.ts @@ -46,7 +46,7 @@ import { BN } from '@polkadot/util'; changeDetection: ChangeDetectionStrategy.OnPush }) export class BalanceCommonComponent implements OnChanges { - @Input() value: number | BN; + @Input() value: number | string | BN; @Input() tokenDecimals: number; @Input() tokenSymbol: string; @Input() maxDecimals: number; @@ -69,7 +69,7 @@ export class BalanceCommonComponent implements OnChanges { let val: BN | undefined; if (BN.isBN(this.value)) { val = this.value; - } else if (Number.isInteger(this.value)) { + } else { try { val = new BN(this.value as number); } catch (e) { diff --git a/src/common/list-base/paginated-list-component-base.directive.ts b/src/common/list-base/paginated-list-component-base.directive.ts index 50e9c00f..5f628a08 100644 --- a/src/common/list-base/paginated-list-component-base.directive.ts +++ b/src/common/list-base/paginated-list-component-base.directive.ts @@ -83,10 +83,12 @@ export abstract class PaginatedListComponentBase implements OnInit, OnDestroy readonly reset: Subject = new Subject(); protected constructor(private _ns: NetworkService) { - this.loadingObservable = this.loadingCounterObservable.pipe(takeUntil(this.destroyer), map((c) => !!c)); + this.loadingObservable = this.loadingCounterObservable.pipe( + map((c) => !!c), + takeUntil(this.destroyer), + ); this.lowestBlockNumber = this.itemsObservable.pipe( - takeUntil(this.destroyer), map((items) => { if (items.length > 0) { const itemWithLowestBlockNumber: T = @@ -101,7 +103,12 @@ export abstract class PaginatedListComponentBase implements OnInit, OnDestroy } return null; }), - shareReplay(1) + takeUntil(this.destroyer), // refcount is false, destroy manually. + shareReplay({ + bufferSize: 1, + refCount: false + }), + takeUntil(this.destroyer) ); } @@ -110,8 +117,8 @@ export abstract class PaginatedListComponentBase implements OnInit, OnDestroy this._ns.currentNetwork .pipe( debounceTime(100), - takeUntil(this.destroyer), - filter((n) => !!n) + filter((n) => !!n), + takeUntil(this.destroyer) ) .subscribe((network: string) => { if (this.network !== network) { @@ -124,9 +131,9 @@ export abstract class PaginatedListComponentBase implements OnInit, OnDestroy this.latestItemObservable .pipe( - takeUntil(this.destroyer), filter(() => this.pageLive), - switchMap | T, Observable>((item) => isObservable(item) ? item.pipe(takeUntil(this.destroyer)) : of(item)) + switchMap | T, Observable>((item) => isObservable(item) ? item : of(item)), + takeUntil(this.destroyer) ).subscribe((item: T) => { const itemObservables = this.itemsObservable.value; // Add the latest item to the list. @@ -210,8 +217,6 @@ export abstract class PaginatedListComponentBase implements OnInit, OnDestroy // Merge list with current list, sort the list. itemsSubscription = itemsObservable.pipe( - takeUntil(this.destroyer), - takeUntil(this.reset), tap({ subscribe: () => { this.loading++; @@ -234,7 +239,9 @@ export abstract class PaginatedListComponentBase implements OnInit, OnDestroy } ) === -1 )), - map((items) => items.sort(this.sortCompareFn)) + map((items) => items.sort(this.sortCompareFn)), + takeUntil(this.destroyer), + takeUntil(this.reset), ).subscribe({ next: (items) => { if (items.length >= this.listSize) { diff --git a/src/mat-styles.scss b/src/mat-styles.scss index 89c02182..a06eda2f 100644 --- a/src/mat-styles.scss +++ b/src/mat-styles.scss @@ -45,7 +45,8 @@ $explorer-ui-accent: mat.define-palette(mat.$pink-palette, A200, A100, A400); $explorer-ui-warn: mat.define-palette(mat.$red-palette); $explorer-ui-typography: mat.define-typography-config( - $font-family: 'Lexend, sans-serif' + $font-family: 'Lexend, sans-serif', + $body-1: mat.define-typography-level($font-size: 1rem) ); // Create the theme object. A theme consists of configurations for individual @@ -65,4 +66,9 @@ $explorer-ui-theme: mat.define-light-theme(( body { @include mat.all-component-themes($explorer-ui-theme); @include mat.all-component-typographies($explorer-ui-typography); + @include mat.private-form-field-density(-1); +} + +.cdk-overlay-container { + background: rgba(0,0,0,.15); } diff --git a/src/styles.scss b/src/styles.scss index c0835cb8..0e6979f3 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -:root { +body { --ps-top-bar-bg-color: #350659; --ps-top-bar-text-color: #FFF; --ps-top-bar-logo-text-color: #FFF; @@ -34,13 +34,18 @@ button, html, input, select, textarea { } body, html { - font-size: 16px; + font-size: 15px; line-height: 1.5; padding: 0; margin: 0; height: 100%; } +body { + display: flex; + flex-flow: column nowrap; +} + a { color: inherit; } @@ -203,9 +208,10 @@ mat-divider.mat-divider { } .width-container { + display: block; margin: 0 auto; width: 100%; max-width: 1260px; box-sizing: border-box; - padding: 0 20px; + padding: 0 16px; }