From ff5f004a7b614f6ae321e173254f58509fe80ccd Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Wed, 7 Aug 2024 09:27:55 -0700 Subject: [PATCH 01/17] bug: Mocked context.db update error on map call (#985) The mocked context.db update function would try to call map on an object, which will fail. The intention was to replace the column values with the original ones. It's sufficient to directly print the input instead instead. --- frontend/package-lock.json | 2423 ++++++++------------------- frontend/src/utils/indexerRunner.js | 4 +- 2 files changed, 739 insertions(+), 1688 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 72ea96a9e..07d15b05d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -69,7 +69,6 @@ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -82,7 +81,6 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -92,10 +90,9 @@ } }, "node_modules/@apollo/client": { - "version": "3.10.6", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.10.6.tgz", - "integrity": "sha512-3lLFGJtzC1/mEnK11BRf+Bf8536kBQUSB1G9yMtcRsxmY+tCKdTPzsP3fMUKy10BPIE0sDUY1pux3iMPIn2vow==", - "license": "MIT", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.11.3.tgz", + "integrity": "sha512-bocd9vQc9PSq4MG6129HKF8ujUirVod98he9OEWpyOs5CXnUC81zNRaUshA4wPSflR6mnx0yRuRankp1V8A+og==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -115,8 +112,8 @@ "peerDependencies": { "graphql": "^15.0.0 || ^16.0.0", "graphql-ws": "^5.5.5", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "peerDependenciesMeta": { @@ -139,7 +136,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -149,32 +145,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -190,13 +184,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -206,15 +199,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -222,52 +214,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -277,17 +228,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -297,11 +246,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -311,7 +259,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -320,25 +267,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -348,30 +281,27 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -382,7 +312,6 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -394,11 +323,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -411,7 +342,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -424,7 +354,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -437,7 +366,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -450,7 +378,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -463,7 +390,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -476,7 +402,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -492,7 +417,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -505,7 +429,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -518,7 +441,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -531,7 +453,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -544,7 +465,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -557,7 +477,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -570,7 +489,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -586,7 +504,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -602,7 +519,6 @@ "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", "dev": true, - "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", @@ -618,10 +534,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -632,39 +547,33 @@ "node_modules/@babel/runtime/node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -673,13 +582,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -691,14 +599,12 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@codemirror/language": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.0.0.tgz", "integrity": "sha512-rtjk5ifyMzOna1c7PBu7J1VCt0PvA5wy3o8eMVnxMKb7z8KA7JFecvD04dSn14vj/bBaAbqRsGed5OjtofEnLA==", - "license": "MIT", "peer": true, "dependencies": { "@codemirror/state": "^6.0.0", @@ -713,14 +619,12 @@ "version": "6.4.1", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", - "license": "MIT", "peer": true }, "node_modules/@codemirror/view": { - "version": "6.28.2", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.28.2.tgz", - "integrity": "sha512-A3DmyVfjgPsGIjiJqM/zvODUAPQdQl3ci0ghehYNnbt5x+o76xq+dL5+mMBuysDXnI3kapgOkoeJ0sbtL/3qPw==", - "license": "MIT", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.30.0.tgz", + "integrity": "sha512-96Nmn8OeLh6aONQprIeYk8hGVnEuYpWuxKSkdsODOx9hWPxyuyZGvmvxV/JmLsp+CubMO1PsLaN5TNNgrl0UrQ==", "peer": true, "dependencies": { "@codemirror/state": "^6.4.0", @@ -732,7 +636,6 @@ "version": "0.8.8", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "license": "MIT", "optional": true, "dependencies": { "@emotion/memoize": "0.7.4" @@ -742,21 +645,18 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "license": "MIT", "optional": true }, "node_modules/@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -768,11 +668,10 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -782,7 +681,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -806,7 +704,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -822,7 +719,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -835,35 +731,31 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", - "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", - "license": "MIT", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz", + "integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.6" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", - "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", - "license": "MIT", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz", + "integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==", "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.6" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", - "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", - "license": "MIT", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", "dependencies": { "@floating-ui/dom": "^1.0.0" }, @@ -873,16 +765,14 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", - "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==", - "license": "MIT" + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz", + "integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==" }, "node_modules/@graphiql/plugin-code-exporter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@graphiql/plugin-code-exporter/-/plugin-code-exporter-0.3.5.tgz", "integrity": "sha512-14CmC6IWcfJyhC27pfUoPz3dmLQyNuOQIeEmPFH2M9k0z/GzZr6bnxMK/ImVsAmzTP3M7Jm0bCTXUwU7AVO0tA==", - "license": "MIT", "dependencies": { "graphiql-code-exporter": "^3.0.3" }, @@ -897,7 +787,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/graphiql-code-exporter/-/graphiql-code-exporter-3.0.3.tgz", "integrity": "sha512-Ml3J/ojCQ56qrIgJPDCrWQ2cpI/6yio2P1tHPBuvhGJ2zVSUCH/D+v1DIwXIzsAMwqq0WkaknqH3iuA6LD5A5A==", - "license": "MIT", "dependencies": { "copy-to-clipboard": "^3.0.8" }, @@ -912,7 +801,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@graphiql/plugin-explorer/-/plugin-explorer-0.3.5.tgz", "integrity": "sha512-oHn4cuH1uPWv70zy64mpG/x99BeFOFzGJ/tZXdx8wvb6c4aBMMCo4ouVnvNReVxE9N0KAwJfPvC6laWSbQ6lkQ==", - "license": "MIT", "dependencies": { "graphiql-explorer": "^0.9.0" }, @@ -927,7 +815,6 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/graphiql-explorer/-/graphiql-explorer-0.9.0.tgz", "integrity": "sha512-fZC/wsuatqiQDO2otchxriFO0LaWIo/ovF/CQJ1yOudmY0P7pzDiP+l9CEHUiWbizk3e99x6DQG4XG1VxA+d6A==", - "license": "MIT", "peerDependencies": { "graphql": "^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "react": "^15.6.0 || ^16.0.0", @@ -938,7 +825,6 @@ "version": "0.19.4", "resolved": "https://registry.npmjs.org/@graphiql/react/-/react-0.19.4.tgz", "integrity": "sha512-qg3N2Zeuq2+GDMZddz7K/ak1p5O56kKuLM/idOJZD+Lxbk2e8Eye3KWM24lJuuCi2gdvJuqPMfCdewLXrHhEkw==", - "license": "MIT", "dependencies": { "@graphiql/toolkit": "^0.9.1", "@headlessui/react": "^1.7.15", @@ -963,10 +849,9 @@ } }, "node_modules/@graphiql/toolkit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@graphiql/toolkit/-/toolkit-0.9.1.tgz", - "integrity": "sha512-LVt9pdk0830so50ZnU2Znb2rclcoWznG8r8asqAENzV0U1FM1kuY0sdPpc/rBc9MmmNgnB6A+WZzDhq6dbhTHA==", - "license": "MIT", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@graphiql/toolkit/-/toolkit-0.9.2.tgz", + "integrity": "sha512-QLPhwx9+E4JfGY+0iwFwa85OBjCJ7GHNypkQoz3pCOwAAlIpFBtXDOuLF1eH9Z08WNZSjRLL7VYW4Ci3hfTqxg==", "dependencies": { "@n1ru4l/push-pull-async-iterable-iterator": "^3.1.0", "meros": "^1.1.4" @@ -985,7 +870,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } @@ -994,7 +878,6 @@ "version": "1.7.19", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz", "integrity": "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==", - "license": "MIT", "dependencies": { "@tanstack/react-virtual": "^3.0.0-beta.60", "client-only": "^0.0.1" @@ -1013,7 +896,6 @@ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -1028,7 +910,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1042,15 +923,13 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -1068,7 +947,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -1081,7 +959,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1097,7 +974,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1114,7 +990,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -1124,7 +999,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1138,7 +1012,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1152,7 +1025,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -1165,7 +1037,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -1181,7 +1052,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -1194,7 +1064,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1204,7 +1073,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1214,7 +1082,6 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -1232,7 +1099,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1248,7 +1114,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1265,7 +1130,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1277,15 +1141,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1295,7 +1157,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1308,7 +1169,6 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -1356,7 +1216,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1372,7 +1231,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1389,7 +1247,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1401,15 +1258,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1419,7 +1274,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1432,7 +1286,6 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -1448,7 +1301,6 @@ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -1462,7 +1314,6 @@ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1475,7 +1326,6 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -1493,7 +1343,6 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -1509,7 +1358,6 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, - "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -1553,7 +1401,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1569,7 +1416,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1586,7 +1432,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1598,8 +1443,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/reporters/node_modules/glob": { "version": "7.2.3", @@ -1607,7 +1451,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1628,7 +1471,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1638,7 +1480,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1651,7 +1492,6 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1664,7 +1504,6 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -1679,7 +1518,6 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -1695,7 +1533,6 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -1711,7 +1548,6 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1738,7 +1574,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1754,7 +1589,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1771,7 +1605,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1783,15 +1616,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1801,7 +1632,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1814,7 +1644,6 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1832,7 +1661,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1848,7 +1676,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1865,7 +1692,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1877,15 +1703,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1895,7 +1719,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1907,7 +1730,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1921,7 +1743,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1930,7 +1751,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1939,7 +1759,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "license": "MIT", "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1947,16 +1766,14 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "license": "MIT" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1966,24 +1783,21 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", - "license": "MIT", "peer": true }, "node_modules/@lezer/highlight": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", - "license": "MIT", "peer": true, "dependencies": { "@lezer/common": "^1.0.0" } }, "node_modules/@lezer/lr": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.1.tgz", - "integrity": "sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==", - "license": "MIT", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", "peer": true, "dependencies": { "@lezer/common": "^1.0.0" @@ -1993,7 +1807,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "license": "MIT", "dependencies": { "state-local": "^1.0.6" }, @@ -2005,7 +1818,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "license": "MIT", "dependencies": { "@monaco-editor/loader": "^1.4.0" }, @@ -2019,7 +1831,6 @@ "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", - "license": "MIT", "dependencies": { "@motionone/easing": "^10.18.0", "@motionone/types": "^10.17.1", @@ -2031,7 +1842,6 @@ "version": "10.12.0", "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz", "integrity": "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==", - "license": "MIT", "dependencies": { "@motionone/animation": "^10.12.0", "@motionone/generators": "^10.12.0", @@ -2045,7 +1855,6 @@ "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", - "license": "MIT", "dependencies": { "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" @@ -2055,7 +1864,6 @@ "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", - "license": "MIT", "dependencies": { "@motionone/types": "^10.17.1", "@motionone/utils": "^10.18.0", @@ -2065,14 +1873,12 @@ "node_modules/@motionone/types": { "version": "10.17.1", "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", - "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==", - "license": "MIT" + "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==" }, "node_modules/@motionone/utils": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", - "license": "MIT", "dependencies": { "@motionone/types": "^10.17.1", "hey-listen": "^1.0.8", @@ -2083,7 +1889,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@n1ru4l/push-pull-async-iterable-iterator/-/push-pull-async-iterable-iterator-3.2.0.tgz", "integrity": "sha512-3fkKj25kEjsfObL6IlKPAlHYPq/oYwUkkQ03zsTTiDjD7vg/RxjdiLeCydqtxHZP0JgsXL3D/X5oAkMGzuUp/Q==", - "license": "MIT", "engines": { "node": ">=12" } @@ -2098,29 +1903,26 @@ } }, "node_modules/@next/env": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.4.tgz", - "integrity": "sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg==", - "license": "MIT" + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", + "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==" }, "node_modules/@next/eslint-plugin-next": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz", - "integrity": "sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.5.tgz", + "integrity": "sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==", "dev": true, - "license": "MIT", "dependencies": { "glob": "10.3.10" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz", - "integrity": "sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", + "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2130,13 +1932,12 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", - "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", + "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2146,13 +1947,12 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", - "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", + "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -2162,13 +1962,12 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", - "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", + "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -2178,13 +1977,12 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", - "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", + "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -2194,13 +1992,12 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", - "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", + "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -2210,13 +2007,12 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", - "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", + "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -2226,13 +2022,12 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", - "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", + "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", "cpu": [ "ia32" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -2242,13 +2037,12 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", - "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", + "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -2262,7 +2056,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2276,7 +2069,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -2286,7 +2078,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2300,7 +2091,6 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -2310,7 +2100,6 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -2319,14 +2108,12 @@ "node_modules/@radix-ui/primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", - "license": "MIT" + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" }, "node_modules/@radix-ui/react-arrow": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", - "license": "MIT", "dependencies": { "@radix-ui/react-primitive": "2.0.0" }, @@ -2349,7 +2136,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0", "@radix-ui/react-context": "1.1.0", @@ -2375,7 +2161,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2390,7 +2175,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2405,7 +2189,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-compose-refs": "1.1.0", @@ -2441,7 +2224,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2456,7 +2238,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-compose-refs": "1.1.0", @@ -2483,7 +2264,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-compose-refs": "1.1.0", @@ -2512,7 +2292,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2527,7 +2306,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0", "@radix-ui/react-primitive": "2.0.0", @@ -2552,7 +2330,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", - "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, @@ -2570,7 +2347,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-collection": "1.1.0", @@ -2610,7 +2386,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", - "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.0", @@ -2642,7 +2417,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", - "license": "MIT", "dependencies": { "@radix-ui/react-primitive": "2.0.0", "@radix-ui/react-use-layout-effect": "1.1.0" @@ -2666,7 +2440,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" @@ -2690,7 +2463,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", - "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.1.0" }, @@ -2713,7 +2485,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-collection": "1.1.0", @@ -2744,7 +2515,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0" }, @@ -2759,10 +2529,9 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.1.tgz", - "integrity": "sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==", - "license": "MIT", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", + "integrity": "sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-compose-refs": "1.1.0", @@ -2796,7 +2565,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2811,7 +2579,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", - "license": "MIT", "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, @@ -2829,7 +2596,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", - "license": "MIT", "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, @@ -2847,7 +2613,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2862,7 +2627,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", - "license": "MIT", "dependencies": { "@radix-ui/rect": "1.1.0" }, @@ -2880,7 +2644,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", - "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, @@ -2898,7 +2661,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", - "license": "MIT", "dependencies": { "@radix-ui/react-primitive": "2.0.0" }, @@ -2920,14 +2682,12 @@ "node_modules/@radix-ui/rect": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", - "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", - "license": "MIT" + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" }, "node_modules/@react-aria/ssr": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz", - "integrity": "sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==", - "license": "Apache-2.0", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.5.tgz", + "integrity": "sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==", "dependencies": { "@swc/helpers": "^0.5.0" }, @@ -2935,14 +2695,13 @@ "node": ">= 12" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@restart/hooks": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", - "license": "MIT", "dependencies": { "dequal": "^2.0.3" }, @@ -2951,10 +2710,9 @@ } }, "node_modules/@restart/ui": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.9.tgz", - "integrity": "sha512-mUbygUsJcRurjZCt1f77gg4DpheD1D+Sc7J3JjAkysUj7t8m4EBJVOqWC9788Qtbc69cJ+HlJc6jBguKwS8Mcw==", - "license": "MIT", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.8.0.tgz", + "integrity": "sha512-xJEOXUOTmT4FngTmhdjKFRrVVF0hwCLNPdatLCHkyS4dkiSK12cEu1Y0fjxktjJrdst9jJIc5J6ihMJCoWEN/g==", "dependencies": { "@babel/runtime": "^7.21.0", "@popperjs/core": "^2.11.6", @@ -2975,31 +2733,27 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", - "license": "MIT", "peerDependencies": { "react": ">=16.14.0" } }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", - "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==", - "dev": true, - "license": "MIT" + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "dev": true }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } @@ -3009,7 +2763,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -3017,26 +2770,23 @@ "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" }, "node_modules/@swc/helpers": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", - "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, "node_modules/@tanstack/react-virtual": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.7.0.tgz", - "integrity": "sha512-3RtOwEU1HKS4iFBoTcCrV3Szqt4KoERMhZr8v57dvnh5o70sR9GAdF+0aE/qhiOmePrKujGwAayFNJSr/8Dbqw==", - "license": "MIT", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.8.4.tgz", + "integrity": "sha512-Dq0VQr3QlTS2qL35g360QaJWBt7tCn/0xw4uZ0dHXPLO1Ak4Z4nVX4vuj1Npg1b/jqNMDToRtR5OIxM2NXRBWg==", "dependencies": { - "@tanstack/virtual-core": "3.7.0" + "@tanstack/virtual-core": "3.8.4" }, "funding": { "type": "github", @@ -3048,10 +2798,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.7.0.tgz", - "integrity": "sha512-p0CWuqn+n8iZmsL7/l0Xg7kbyIKnHNqkEJkMDOkg4x3Ni3LohszmnJY8FPhTgG7Ad9ZFGcdKmn1R1mKUGEh9Xg==", - "license": "MIT", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.8.4.tgz", + "integrity": "sha512-iO5Ujgw3O1yIxWDe9FgUPNkGjyT657b1WNX52u+Wv1DyBFEpdCdGkuVaky0M3hHFqNWjAmHWTn4wgj9rTr7ZQg==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -3062,7 +2811,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -3076,7 +2824,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -3086,7 +2833,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -3097,7 +2843,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } @@ -3107,7 +2852,6 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, - "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -3117,7 +2861,6 @@ "version": "5.60.15", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", - "license": "MIT", "dependencies": { "@types/tern": "*" } @@ -3127,16 +2870,14 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "license": "MIT", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "peer": true, "dependencies": { "@types/estree": "*", @@ -3147,7 +2888,6 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", "peer": true, "dependencies": { "@types/eslint": "*", @@ -3157,15 +2897,13 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "license": "MIT" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3178,7 +2916,6 @@ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3191,7 +2928,6 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3200,22 +2936,19 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -3225,7 +2958,6 @@ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -3235,7 +2967,6 @@ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -3244,28 +2975,24 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/node": { - "version": "20.14.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.7.tgz", - "integrity": "sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==", - "license": "MIT", + "version": "20.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", + "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -3273,34 +3000,29 @@ "node_modules/@types/pegjs": { "version": "0.10.6", "resolved": "https://registry.npmjs.org/@types/pegjs/-/pegjs-0.10.6.tgz", - "integrity": "sha512-eLYXDbZWXh2uxf+w8sXS8d6KSoXTswfps6fvCUuVAGN8eRpfe7h9eSRydxiSJvo9Bf+GzifsDOr9TMQlmJdmkw==", - "license": "MIT" + "integrity": "sha512-eLYXDbZWXh2uxf+w8sXS8d6KSoXTswfps6fvCUuVAGN8eRpfe7h9eSRydxiSJvo9Bf+GzifsDOr9TMQlmJdmkw==" }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "license": "MIT" + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/qs": { "version": "6.9.15", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/react": { "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -3311,7 +3033,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz", "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==", "devOptional": true, - "license": "MIT", "dependencies": { "@types/react": "*" } @@ -3320,7 +3041,6 @@ "version": "4.4.10", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "license": "MIT", "dependencies": { "@types/react": "*" } @@ -3329,15 +3049,13 @@ "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, - "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -3348,7 +3066,6 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, - "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -3359,20 +3076,17 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/stylis": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", - "license": "MIT" + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" }, "node_modules/@types/tern": { "version": "0.23.9", "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", - "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -3380,15 +3094,13 @@ "node_modules/@types/warning": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", - "license": "MIT" + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3397,15 +3109,13 @@ "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -3436,11 +3146,10 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3453,7 +3162,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -3481,7 +3189,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" @@ -3499,7 +3206,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", @@ -3527,7 +3233,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3541,7 +3246,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -3565,11 +3269,10 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3582,7 +3285,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -3605,11 +3307,10 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3622,7 +3323,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -3639,14 +3339,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -3657,28 +3355,24 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", @@ -3690,14 +3384,12 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3710,7 +3402,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "license": "MIT", "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -3720,7 +3411,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "license": "Apache-2.0", "peer": true, "dependencies": { "@xtuc/long": "4.2.2" @@ -3730,14 +3420,12 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3754,7 +3442,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3768,7 +3455,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3781,7 +3467,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3796,7 +3481,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3807,7 +3491,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3819,7 +3502,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3831,7 +3513,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3843,7 +3524,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3855,14 +3535,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause", "peer": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0", "peer": true }, "node_modules/accepts": { @@ -3870,7 +3548,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -3880,10 +3557,9 @@ } }, "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "license": "MIT", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "bin": { "acorn": "bin/acorn" }, @@ -3895,7 +3571,6 @@ "version": "1.9.5", "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "license": "MIT", "peer": true, "peerDependencies": { "acorn": "^8" @@ -3906,7 +3581,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3915,7 +3589,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3931,7 +3604,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -3941,7 +3613,6 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -3957,7 +3628,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3967,7 +3637,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -3979,15 +3648,13 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4000,20 +3667,17 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-hidden": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -4026,7 +3690,6 @@ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" } @@ -4036,7 +3699,6 @@ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -4053,7 +3715,6 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4074,7 +3735,6 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4084,7 +3744,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4105,7 +3764,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4126,7 +3784,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4145,7 +3802,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4159,25 +3815,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4194,7 +3836,6 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -4216,27 +3857,30 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" + "dev": true + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -4252,13 +3896,12 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -4276,7 +3919,6 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -4288,11 +3930,10 @@ } }, "node_modules/axe-core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", - "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", "dev": true, - "license": "MPL-2.0", "engines": { "node": ">=4" } @@ -4302,7 +3943,6 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" } @@ -4312,7 +3952,6 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -4334,7 +3973,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4350,7 +3988,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4367,7 +4004,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4379,15 +4015,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4397,7 +4031,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4410,7 +4043,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -4427,7 +4059,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -4444,7 +4075,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -4460,7 +4090,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -4484,7 +4113,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -4500,14 +4128,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "license": "MIT", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -4529,14 +4155,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", "engines": { "node": ">=0.6" } @@ -4545,7 +4169,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", "engines": { "node": "*" } @@ -4555,7 +4178,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -4566,8 +4188,7 @@ "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "license": "MIT" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/bootstrap": { "version": "5.3.3", @@ -4583,7 +4204,6 @@ "url": "https://opencollective.com/bootstrap" } ], - "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.8" } @@ -4591,14 +4211,12 @@ "node_modules/borsh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/borsh/-/borsh-2.0.0.tgz", - "integrity": "sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==", - "license": "Apache-2.0" + "integrity": "sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==" }, "node_modules/borsher": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/borsher/-/borsher-1.2.1.tgz", "integrity": "sha512-vP5g3q2BWxqjgGuQeLKJr1ymr3yvFDSFAtN+UZa5L1BB82eFCYnrLCEj+6uiJnzhtJ7IXZfYUYu4EYBnI949Xg==", - "license": "MIT", "dependencies": { "borsh": "^2.0.0", "buffer": "^6.0.3" @@ -4609,7 +4227,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4620,7 +4237,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -4629,9 +4245,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -4646,12 +4262,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -4665,7 +4280,6 @@ "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -4677,7 +4291,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -4687,7 +4300,6 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -4710,7 +4322,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -4719,15 +4330,13 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -4740,17 +4349,15 @@ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/builtins/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4774,7 +4381,6 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -4794,7 +4400,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -4804,7 +4409,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -4814,7 +4418,6 @@ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -4823,15 +4426,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001649", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", "funding": [ { "type": "opencollective", @@ -4845,21 +4447,18 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/capability": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/capability/-/capability-0.2.5.tgz", - "integrity": "sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==", - "license": "MIT" + "integrity": "sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==" }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4874,7 +4473,6 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -4884,7 +4482,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4909,7 +4506,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4921,7 +4517,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", "peer": true, "engines": { "node": ">=6.0" @@ -4938,7 +4533,6 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } @@ -4947,27 +4541,23 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -4982,7 +4572,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4998,7 +4587,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5010,22 +4598,19 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5040,7 +4625,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5058,7 +4642,6 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -5072,7 +4655,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5082,26 +4664,23 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/codemirror": { - "version": "5.65.16", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", - "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==", - "license": "MIT" + "version": "5.65.17", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.17.tgz", + "integrity": "sha512-1zOsUx3lzAOu/gnMAZkQ9kpIHcPYOc9y1Fbm2UVk5UBPkdq380nhkelG0qUwm1f7wPvTbndu9ZYlug35EwAZRQ==" }, "node_modules/codemirror-graphql": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-2.0.12.tgz", - "integrity": "sha512-5UCqhWzck1jClCmRewFb8aSiabnAqiaRfsvIPfmbf6WJvOb8oiefJeHilclPPiZBzY8v/Et6EBMtOeKnWCoyng==", - "license": "MIT", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-2.0.13.tgz", + "integrity": "sha512-MBx8BtfqpacLUwcx0smI0JLq7uR6ssKvdF0ENz0yV1w1xqKmFcZ29uHh11LMWdeLL0j14KXGSIDl97fovfdszQ==", "dependencies": { "@types/codemirror": "^0.0.90", - "graphql-language-service": "5.2.1" + "graphql-language-service": "5.2.2" }, "peerDependencies": { "@codemirror/language": "6.0.0", @@ -5113,7 +4692,6 @@ "version": "0.0.90", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.90.tgz", "integrity": "sha512-8Z9+tSg27NPRGubbUPUCrt5DDG/OWzLph5BvcDykwR5D7RyZh5mhHG0uS1ePKV1YFCA+/cwc4Ey2AJAEFfV3IA==", - "license": "MIT", "dependencies": { "@types/tern": "*" } @@ -5122,15 +4700,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -5139,15 +4715,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5158,22 +4732,19 @@ "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -5182,15 +4753,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -5202,21 +4771,18 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cookiejar": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "license": "MIT", "dependencies": { "toggle-selection": "^1.0.6" } @@ -5226,7 +4792,6 @@ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -5248,7 +4813,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5264,7 +4828,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5281,7 +4844,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5293,15 +4855,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/create-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5311,7 +4871,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5324,7 +4883,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5338,7 +4896,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", "engines": { "node": ">=4" } @@ -5347,7 +4904,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -5359,7 +4915,6 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -5370,22 +4925,19 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -5403,7 +4955,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -5421,7 +4972,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -5434,12 +4984,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/debounce-promise": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", + "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==" + }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -5457,7 +5011,6 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, - "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -5472,7 +5025,6 @@ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.5", @@ -5504,15 +5056,13 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5522,7 +5072,6 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -5540,7 +5089,6 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -5558,7 +5106,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -5567,7 +5114,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5576,7 +5122,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5586,7 +5131,6 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5594,15 +5138,13 @@ "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, - "license": "ISC", "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -5612,15 +5154,13 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -5630,7 +5170,6 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -5641,22 +5180,19 @@ "node_modules/discontinuous-range": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", - "license": "MIT" + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -5668,7 +5204,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -5678,21 +5213,33 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, - "license": "MIT" + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/electron-to-chromium": { - "version": "1.4.808", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.808.tgz", - "integrity": "sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ==", - "license": "ISC" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==" }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -5704,23 +5251,20 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", - "license": "MIT", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5733,7 +5277,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -5743,7 +5286,6 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -5752,7 +5294,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/error-polyfill/-/error-polyfill-0.1.3.tgz", "integrity": "sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg==", - "license": "MIT", "dependencies": { "capability": "^0.2.5", "o3": "^1.0.3", @@ -5764,7 +5305,6 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -5825,7 +5365,6 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -5838,7 +5377,6 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5848,7 +5386,6 @@ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -5869,7 +5406,6 @@ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5891,10 +5427,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", - "license": "MIT", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "peer": true }, "node_modules/es-object-atoms": { @@ -5902,7 +5437,6 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -5915,7 +5449,6 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -5930,7 +5463,6 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "license": "MIT", "dependencies": { "hasown": "^2.0.0" } @@ -5940,7 +5472,6 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5957,7 +5488,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5967,7 +5497,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -5977,7 +5506,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -6033,7 +5561,6 @@ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.4" }, @@ -6045,11 +5572,10 @@ } }, "node_modules/eslint-compat-utils/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6058,13 +5584,12 @@ } }, "node_modules/eslint-config-next": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.4.tgz", - "integrity": "sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.5.tgz", + "integrity": "sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==", "dev": true, - "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "14.2.4", + "@next/eslint-plugin-next": "14.2.5", "@rushstack/eslint-patch": "^1.3.3", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", "eslint-import-resolver-node": "^0.3.6", @@ -6089,7 +5614,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -6116,7 +5640,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -6133,7 +5656,6 @@ "integrity": "sha512-V8I/Q1eFf9tiOuFHkbksUdWO3p1crFmewecfBtRxXdnvb71BCJx+1xAknlIRZMwZioMX3/bPtMVCZsf1+AjjOw==", "deprecated": "Please use eslint-config-love, instead.", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/parser": "^5.52.0", "eslint-config-standard": "17.1.0" @@ -6152,7 +5674,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -6164,7 +5685,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -6174,7 +5694,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, - "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -6200,7 +5719,6 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -6218,24 +5736,22 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-es-x": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.7.0.tgz", - "integrity": "sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, "funding": [ "https://github.com/sponsors/ota-meshi", "https://opencollective.com/eslint" ], - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0", + "@eslint-community/regexpp": "^4.11.0", "eslint-compat-utils": "^0.5.1" }, "engines": { @@ -6250,7 +5766,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -6282,7 +5797,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -6292,7 +5806,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -6305,7 +5818,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", "dev": true, - "license": "MIT", "dependencies": { "aria-query": "~5.1.3", "array-includes": "^3.1.8", @@ -6336,7 +5848,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", @@ -6365,7 +5876,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6377,11 +5887,10 @@ } }, "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6394,7 +5903,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6403,11 +5911,10 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.2.0.tgz", - "integrity": "sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, - "license": "ISC", "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6420,36 +5927,35 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", - "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.hasown": "^1.1.4", "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { @@ -6457,7 +5963,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6470,7 +5975,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -6483,7 +5987,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -6497,11 +6000,10 @@ } }, "node_modules/eslint-plugin-simple-import-sort": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.0.tgz", - "integrity": "sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", "dev": true, - "license": "MIT", "peerDependencies": { "eslint": ">=5.0.0" } @@ -6510,7 +6012,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -6523,7 +6024,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -6533,7 +6033,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -6546,7 +6045,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6562,7 +6060,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6579,7 +6076,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6591,15 +6087,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6612,7 +6106,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -6629,7 +6122,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6645,7 +6137,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6655,7 +6146,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6668,7 +6158,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6681,7 +6170,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -6699,7 +6187,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6709,11 +6196,10 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -6725,7 +6211,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -6737,7 +6222,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -6747,7 +6231,6 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -6756,7 +6239,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", "peer": true, "engines": { "node": ">=0.8.x" @@ -6767,7 +6249,6 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -6790,8 +6271,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/exit": { "version": "0.1.2", @@ -6807,7 +6287,6 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -6822,15 +6301,13 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6847,7 +6324,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -6858,29 +6334,25 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -6890,7 +6362,6 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } @@ -6900,7 +6371,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -6908,12 +6378,41 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6926,7 +6425,6 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -6941,7 +6439,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6958,7 +6455,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -6972,15 +6468,13 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } @@ -6990,7 +6484,6 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -7007,7 +6500,6 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7022,7 +6514,6 @@ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", "dev": true, - "license": "MIT", "dependencies": { "dezalgo": "^1.0.4", "hexoid": "^1.0.0", @@ -7037,7 +6528,6 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, - "license": "MIT", "engines": { "node": "*" }, @@ -7050,7 +6540,6 @@ "version": "6.5.1", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz", "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==", - "license": "MIT", "dependencies": { "@motionone/dom": "10.12.0", "framesync": "6.0.1", @@ -7071,7 +6560,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz", "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" } @@ -7081,7 +6569,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7090,8 +6577,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -7099,7 +6585,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -7113,7 +6598,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7123,7 +6607,6 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -7142,7 +6625,6 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7150,15 +6632,13 @@ "node_modules/genson-js": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/genson-js/-/genson-js-0.0.8.tgz", - "integrity": "sha512-4NUusDTwF+lzYh72uKV+Uvpky9iPO+YDIMpGImA5pbHfLV9HwgRCA4hYjGu78V4J4Cx2IZRTFfRERn9aUs74mw==", - "license": "Apache-2.0" + "integrity": "sha512-4NUusDTwF+lzYh72uKV+Uvpky9iPO+YDIMpGImA5pbHfLV9HwgRCA4hYjGu78V4J4Cx2IZRTFfRERn9aUs74mw==" }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -7168,7 +6648,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -7178,7 +6657,6 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -7197,7 +6675,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", "engines": { "node": ">=6" } @@ -7207,7 +6684,6 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -7217,7 +6693,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -7230,7 +6705,6 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -7244,11 +6718,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", - "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", "dev": true, - "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -7261,7 +6734,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -7284,7 +6756,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -7296,7 +6767,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause", "peer": true }, "node_modules/glob/node_modules/brace-expansion": { @@ -7304,17 +6774,15 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7330,7 +6798,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7340,7 +6807,6 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -7357,7 +6823,6 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -7378,7 +6843,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -7389,21 +6853,18 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/graphiql": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/graphiql/-/graphiql-3.0.6.tgz", "integrity": "sha512-PuyAhRQibTrwT3RUKmwIGrJAB+M1gg+TAftmChjBqQW0n5WMFFvP5Wcr2NEikomY0s06+oKeUGhBU2iPrq+cSQ==", - "license": "MIT", "dependencies": { "@graphiql/react": "^0.19.4", "@graphiql/toolkit": "^0.9.1", @@ -7420,17 +6881,16 @@ "version": "16.9.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, "node_modules/graphql-language-service": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-5.2.1.tgz", - "integrity": "sha512-8ewD6otGO43vg2TiEGjoLz3CweTwfaf4ZnqfNREqZXS2JSJGXtsRBOMMknCxMfFVh4x14ql3jyDrXcyAAtbmkQ==", - "license": "MIT", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-5.2.2.tgz", + "integrity": "sha512-ulIM1xE2eyEk8/QKg7I9QCGQWijNNZVwQ/dpm0B1XwD9AfYzeaGkipcsxW3JPmurt/d/ZMYRxK5Y0d2amrXEtQ==", "dependencies": { + "debounce-promise": "^3.1.2", "nullthrows": "^1.0.0", "vscode-languageserver-types": "^3.17.1" }, @@ -7445,7 +6905,6 @@ "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -7460,10 +6919,6 @@ "version": "5.16.0", "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.0.tgz", "integrity": "sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==", - "license": "MIT", - "workspaces": [ - "website" - ], "engines": { "node": ">=10" }, @@ -7475,7 +6930,6 @@ "version": "6.0.6", "resolved": "https://registry.npmjs.org/gridjs/-/gridjs-6.0.6.tgz", "integrity": "sha512-TZ20nY+weE/wlyXOd3A9FJyJlsJ/MrHr6frMgUHFN29RmWZCYtnyfF0zuspXC81oePwSJeSZ8HY651aeyX8+rQ==", - "license": "MIT", "dependencies": { "preact": "^10.11.3" } @@ -7485,7 +6939,6 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7495,7 +6948,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7505,7 +6957,6 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -7518,7 +6969,6 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7531,7 +6981,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7544,7 +6993,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -7560,7 +7008,6 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -7573,7 +7020,6 @@ "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -7581,14 +7027,12 @@ "node_modules/hey-listen": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", - "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", - "license": "MIT" + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -7597,14 +7041,12 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -7620,7 +7062,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7630,7 +7071,6 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -7652,15 +7092,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -7670,7 +7108,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7683,11 +7120,10 @@ } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -7707,7 +7143,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -7721,7 +7156,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -7734,7 +7168,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -7750,7 +7183,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -7763,7 +7195,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -7776,7 +7207,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -7787,7 +7217,6 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7796,15 +7225,13 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -7818,7 +7245,6 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -7828,7 +7254,6 @@ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7845,7 +7270,6 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -7861,15 +7285,13 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7885,7 +7307,6 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -7898,7 +7319,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -7911,7 +7331,6 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7928,7 +7347,6 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, - "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" }, @@ -7944,7 +7362,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7953,11 +7370,10 @@ } }, "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, - "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -7973,7 +7389,6 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, - "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -7989,7 +7404,6 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8005,7 +7419,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8015,7 +7428,6 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -8028,7 +7440,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8038,7 +7449,6 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -8048,7 +7458,6 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8064,7 +7473,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -8077,7 +7485,6 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8090,7 +7497,6 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8103,7 +7509,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -8113,7 +7518,6 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8129,7 +7533,6 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8138,7 +7541,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -8150,7 +7552,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8160,7 +7561,6 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8177,7 +7577,6 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8190,7 +7589,6 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -8206,7 +7604,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -8219,7 +7616,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8235,7 +7631,6 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -8251,7 +7646,6 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, - "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -8267,7 +7661,6 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8280,7 +7673,6 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -8293,7 +7685,6 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4" @@ -8309,21 +7700,18 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8333,17 +7721,15 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -8356,11 +7742,10 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -8373,7 +7758,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -8388,7 +7772,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8398,7 +7781,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -8410,11 +7792,10 @@ } }, "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -8427,7 +7808,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8440,7 +7820,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -8455,7 +7834,6 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -8469,7 +7847,6 @@ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", @@ -8483,7 +7860,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -8497,12 +7873,99 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -8529,7 +7992,6 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -8544,7 +8006,6 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -8576,7 +8037,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8592,7 +8052,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8609,7 +8068,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8621,15 +8079,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8639,7 +8095,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8652,7 +8107,6 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -8686,7 +8140,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8702,7 +8155,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8719,7 +8171,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8731,15 +8182,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8749,7 +8198,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8762,7 +8210,6 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -8808,7 +8255,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8824,7 +8270,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8841,7 +8286,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8853,8 +8297,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-config/node_modules/glob": { "version": "7.2.3", @@ -8862,7 +8305,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8883,7 +8325,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8893,7 +8334,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8906,7 +8346,6 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -8922,7 +8361,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8938,7 +8376,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8955,7 +8392,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8967,15 +8403,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8985,7 +8419,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8998,7 +8431,6 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -9011,7 +8443,6 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -9028,7 +8459,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9044,7 +8474,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9061,7 +8490,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9073,15 +8501,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9091,7 +8517,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9104,7 +8529,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -9122,7 +8546,6 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -9132,7 +8555,6 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -9158,7 +8580,6 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, - "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -9172,7 +8593,6 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -9188,7 +8608,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9204,7 +8623,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9221,7 +8639,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9233,15 +8650,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9251,7 +8666,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9264,7 +8678,6 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -9285,7 +8698,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9301,7 +8713,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9318,7 +8729,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9330,15 +8740,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9348,7 +8756,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9361,7 +8768,6 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -9376,7 +8782,6 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -9394,7 +8799,6 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -9404,7 +8808,6 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -9425,7 +8828,6 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, - "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -9439,7 +8841,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9455,7 +8856,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9472,7 +8872,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9484,15 +8883,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9502,7 +8899,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9515,7 +8911,6 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -9548,7 +8943,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9564,7 +8958,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9581,7 +8974,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9593,15 +8985,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9611,7 +9001,6 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -9622,7 +9011,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9635,7 +9023,6 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -9669,7 +9056,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9685,7 +9071,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9702,7 +9087,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9714,8 +9098,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", @@ -9723,7 +9106,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9744,7 +9126,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9754,7 +9135,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9767,7 +9147,6 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -9799,7 +9178,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9815,7 +9193,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9832,7 +9209,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9844,25 +9220,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -9875,7 +9248,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9888,7 +9260,6 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -9906,7 +9277,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9922,7 +9292,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9939,7 +9308,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9951,15 +9319,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9969,7 +9335,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9982,7 +9347,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -10000,7 +9364,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -10016,7 +9379,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -10029,7 +9391,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10046,7 +9407,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -10058,15 +9418,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10076,7 +9434,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10089,7 +9446,6 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, - "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -10109,7 +9465,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -10125,7 +9480,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10142,7 +9496,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -10154,15 +9507,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10172,7 +9523,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10185,7 +9535,6 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -10201,7 +9550,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10211,7 +9559,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10227,7 +9574,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, - "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -10235,21 +9581,18 @@ "node_modules/js-sha256": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", - "license": "MIT" + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -10262,7 +9605,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -10274,33 +9616,28 @@ "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, - "license": "MIT" + "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", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -10313,7 +9650,6 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -10329,7 +9665,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -10339,7 +9674,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10349,7 +9683,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10358,15 +9691,13 @@ "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" + "dev": true }, "node_modules/language-tags": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, - "license": "MIT", "dependencies": { "language-subtag-registry": "^0.3.20" }, @@ -10379,7 +9710,6 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10389,7 +9719,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -10403,7 +9732,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -10412,14 +9740,12 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/linkify-it": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "license": "MIT", "dependencies": { "uc.micro": "^1.0.1" } @@ -10428,7 +9754,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "license": "MIT", "peer": true, "engines": { "node": ">=6.11.5" @@ -10438,7 +9763,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -10453,7 +9777,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -10468,21 +9791,18 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -10495,7 +9815,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -10505,7 +9824,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -10519,7 +9837,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -10528,15 +9845,13 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } @@ -10545,7 +9860,6 @@ "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "~2.1.0", @@ -10560,15 +9874,13 @@ "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "license": "MIT" + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10578,7 +9890,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -10586,15 +9897,13 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -10603,7 +9912,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.0.tgz", "integrity": "sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==", - "license": "MIT", "engines": { "node": ">=13" }, @@ -10621,7 +9929,6 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10631,7 +9938,6 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -10641,23 +9947,21 @@ } }, "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10666,7 +9970,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -10679,7 +9982,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10689,7 +9991,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10702,7 +10003,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10712,7 +10012,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -10720,27 +10019,23 @@ "node_modules/monaco-editor": { "version": "0.45.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.45.0.tgz", - "integrity": "sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA==", - "license": "MIT" + "integrity": "sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA==" }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "license": "BSD-3-Clause" + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "license": "MIT", "bin": { "mustache": "bin/mustache" } @@ -10750,7 +10045,6 @@ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, - "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -10767,7 +10061,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10779,21 +10072,18 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/near-api-js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/near-api-js/-/near-api-js-1.1.0.tgz", "integrity": "sha512-qYKv1mYsaDZc2uYndhS+ttDhR9+60qFc+ZjD6lWsAxr3ZskMjRwPffDGQZYhC7BRDQMe1HEbk6d5mf+TVm0Lqg==", - "license": "(MIT AND Apache-2.0)", "dependencies": { "bn.js": "5.2.1", "borsh": "^0.7.0", @@ -10812,7 +10102,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", @@ -10823,7 +10112,6 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/near-social-bridge/-/near-social-bridge-1.7.1.tgz", "integrity": "sha512-wiivejrDs8pwn7apyOAY35w5dx86Fy7ypH1k0j36pENCNKoifBoSO7kGWZdMKJyxw+1MQFYu+qddjJllkqPvdA==", - "license": "MIT", "peerDependencies": { "react": ">=16", "react-dom": ">=16" @@ -10833,7 +10121,6 @@ "version": "2.20.1", "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "license": "MIT", "dependencies": { "commander": "^2.19.0", "moo": "^0.5.0", @@ -10856,7 +10143,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10865,16 +10151,14 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT", "peer": true }, "node_modules/next": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.4.tgz", - "integrity": "sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==", - "license": "MIT", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", + "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", "dependencies": { - "@next/env": "14.2.4", + "@next/env": "14.2.5", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -10889,15 +10173,15 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.4", - "@next/swc-darwin-x64": "14.2.4", - "@next/swc-linux-arm64-gnu": "14.2.4", - "@next/swc-linux-arm64-musl": "14.2.4", - "@next/swc-linux-x64-gnu": "14.2.4", - "@next/swc-linux-x64-musl": "14.2.4", - "@next/swc-win32-arm64-msvc": "14.2.4", - "@next/swc-win32-ia32-msvc": "14.2.4", - "@next/swc-win32-x64-msvc": "14.2.4" + "@next/swc-darwin-arm64": "14.2.5", + "@next/swc-darwin-x64": "14.2.5", + "@next/swc-linux-arm64-gnu": "14.2.5", + "@next/swc-linux-arm64-musl": "14.2.5", + "@next/swc-linux-x64-gnu": "14.2.5", + "@next/swc-linux-x64-musl": "14.2.5", + "@next/swc-win32-arm64-msvc": "14.2.5", + "@next/swc-win32-ia32-msvc": "14.2.5", + "@next/swc-win32-x64-msvc": "14.2.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -10936,7 +10220,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -10950,7 +10233,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10970,18 +10252,16 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-mocks-http": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.15.0.tgz", - "integrity": "sha512-3orGBAxXrnwz3ixU8AZpa0x8srAvVSHvbWanAqd5F0zVCVA2QstxaVcTSarFcjz4+pFSnR1zm28MsV83s/BtmA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.15.1.tgz", + "integrity": "sha512-X/GpUpNNiPDYUeUD183W8V4OW6OHYWI29w/QDyb+c/GzOfVEAlo6HjbW9++eXT2aV2lGg+uS+XqTD2q0pNREQA==", "dev": true, - "license": "MIT", "dependencies": { "@types/express": "^4.17.21", - "@types/node": "^20.10.6", + "@types/node": "*", "accepts": "^1.3.7", "content-disposition": "^0.5.3", "depd": "^1.1.0", @@ -11002,35 +10282,19 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/node-mocks-http/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "license": "MIT" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/node-sql-parser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-5.2.0.tgz", - "integrity": "sha512-lO/9ox0fLl47ksqlwGrorXm8BD+5UbxvUhj6T1XiCXnvoVwWWn7gC2l396p9OXNii19dc4MkyTN3XeJGNUZ8jw==", - "license": "Apache-2.0", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-5.3.0.tgz", + "integrity": "sha512-KjomhTRfjmzvUNZ40BBF96ZII8ME68AyQXALeTQ3zEEfqup1zhhM91XDpuG+GEEO5urmWgxMJMJ9u3xmL+MzMw==", "dependencies": { "@types/pegjs": "^0.10.0", "big-integer": "^1.6.48" @@ -11044,7 +10308,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11054,7 +10317,6 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11064,7 +10326,6 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -11075,14 +10336,12 @@ "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "license": "MIT" + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, "node_modules/o3": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/o3/-/o3-1.0.3.tgz", "integrity": "sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ==", - "license": "MIT", "dependencies": { "capability": "^0.2.5" } @@ -11091,7 +10350,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11101,17 +10359,18 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11121,7 +10380,6 @@ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -11138,7 +10396,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -11148,7 +10405,6 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -11167,7 +10423,6 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11182,7 +10437,6 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11201,7 +10455,6 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11211,30 +10464,11 @@ "node": ">= 0.4" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11252,7 +10486,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -11262,7 +10495,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -11277,7 +10509,6 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", "integrity": "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==", - "license": "MIT", "dependencies": { "@wry/caches": "^1.0.0", "@wry/context": "^0.7.0", @@ -11289,7 +10520,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -11302,7 +10532,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -11320,7 +10549,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -11336,7 +10564,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -11352,7 +10579,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -11362,7 +10588,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -11375,7 +10600,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -11394,7 +10618,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11404,7 +10627,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -11414,7 +10636,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11424,7 +10645,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -11433,15 +10653,13 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -11454,21 +10672,16 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -11476,15 +10689,13 @@ "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "license": "ISC" + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -11497,7 +10708,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -11507,7 +10717,6 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -11517,7 +10726,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -11530,7 +10738,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -11543,7 +10750,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -11557,7 +10763,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -11573,7 +10778,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -11586,7 +10790,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -11595,7 +10798,6 @@ "version": "11.0.3", "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz", "integrity": "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==", - "license": "MIT", "dependencies": { "framesync": "6.0.1", "hey-listen": "^1.0.8", @@ -11608,15 +10810,15 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -11631,10 +10833,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -11646,7 +10847,6 @@ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -11664,7 +10864,6 @@ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, - "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -11694,7 +10893,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" @@ -11720,7 +10918,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, - "license": "MIT", "engines": { "node": ">=14" }, @@ -11729,31 +10926,35 @@ } }, "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "postcss-selector-parser": "^6.0.11" + "postcss-selector-parser": "^6.1.1" }, "engines": { "node": ">=12.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.2.14" } }, "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11765,14 +10966,12 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/preact": { - "version": "10.22.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz", - "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==", - "license": "MIT", + "version": "10.23.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.1.tgz", + "integrity": "sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -11783,7 +10982,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -11792,7 +10990,6 @@ "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -11807,7 +11004,6 @@ "version": "0.13.0", "resolved": "https://registry.npmjs.org/prettier-plugin-sql/-/prettier-plugin-sql-0.13.0.tgz", "integrity": "sha512-Ui9603tDD6PFyr7JvIEoE6cIFMQnJVDriG+oLyVThsGo/MIl5ek18JhH3xtox9ux8jvyww/FUFrJzxpZ7FIdvw==", - "license": "MIT", "dependencies": { "node-sql-parser": "^4.4.0", "sql-formatter": "^11.0.2", @@ -11827,7 +11023,6 @@ "version": "4.18.0", "resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-4.18.0.tgz", "integrity": "sha512-2YEOR5qlI1zUFbGMLKNfsrR5JUvFg9LxIRVE+xJe962pfVLH0rnItqLzv96XVs1Y1UIR8FxsXAuvX/lYAWZ2BQ==", - "license": "Apache-2.0", "dependencies": { "big-integer": "^1.6.48" }, @@ -11840,7 +11035,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -11855,7 +11049,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -11867,15 +11060,13 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -11888,7 +11079,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -11899,7 +11089,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "license": "MIT", "dependencies": { "react-is": "^16.3.2", "warning": "^4.0.0" @@ -11912,7 +11101,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -11931,15 +11119,13 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ], - "license": "MIT" + ] }, "node_modules/qs": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", - "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -11968,20 +11154,17 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", - "license": "CC0-1.0" + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" }, "node_modules/randexp": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "license": "MIT", "dependencies": { "discontinuous-range": "1.0.0", "ret": "~0.1.10" @@ -11994,7 +11177,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", "peer": true, "dependencies": { "safe-buffer": "^5.1.0" @@ -12005,7 +11187,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12014,7 +11195,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -12034,7 +11214,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -12043,10 +11222,9 @@ } }, "node_modules/react-bootstrap": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.3.tgz", - "integrity": "sha512-cc1KAaQyj6Gr3AfA0eRRiUMSlRi3brDVcjc/o0E9y9XNW7ISo8TITrq8G8G3QTFe7VIhCiDt38k99AEFoLOolw==", - "license": "MIT", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.4.tgz", + "integrity": "sha512-W3398nBM2CBfmGP2evneEO3ZZwEMPtHs72q++eNw60uDGDAdiGn0f9yNys91eo7/y8CTF5Ke1C0QO8JFVPU40Q==", "dependencies": { "@babel/runtime": "^7.24.7", "@restart/hooks": "^0.4.9", @@ -12076,7 +11254,6 @@ "version": "1.11.4", "resolved": "https://registry.npmjs.org/react-bootstrap-icons/-/react-bootstrap-icons-1.11.4.tgz", "integrity": "sha512-lnkOpNEZ/Zr7mNxvjA9efuarCPSgtOuGA55XiRj7ASJnBjb1wEAdtJOd2Aiv9t07r7FLI1IgyZPg9P6jqWD/IA==", - "license": "MIT", "dependencies": { "prop-types": "^15.7.2" }, @@ -12088,7 +11265,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -12100,20 +11276,17 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "license": "MIT" + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-remove-scroll": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", - "license": "MIT", "dependencies": { "react-remove-scroll-bar": "^2.3.4", "react-style-singleton": "^2.2.1", @@ -12138,7 +11311,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", - "license": "MIT", "dependencies": { "react-style-singleton": "^2.2.1", "tslib": "^2.0.0" @@ -12160,7 +11332,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "license": "MIT", "dependencies": { "get-nonce": "^1.0.0", "invariant": "^2.2.4", @@ -12183,7 +11354,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/react-switch/-/react-switch-7.0.0.tgz", "integrity": "sha512-KkDeW+cozZXI6knDPyUt3KBN1rmhoVYgAdCJqAh7st7tk8YE6N0iR89zjCWO8T8dUTeJGTR0KU+5CHCRMRffiA==", - "license": "MIT", "dependencies": { "prop-types": "^15.7.2" }, @@ -12196,7 +11366,6 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -12213,7 +11382,6 @@ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -12223,7 +11391,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12233,7 +11400,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -12246,7 +11412,6 @@ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -12266,15 +11431,13 @@ "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -12292,7 +11455,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.1.0.tgz", "integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "*" @@ -12311,7 +11473,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12321,7 +11482,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -12339,7 +11499,6 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -12352,7 +11511,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12362,7 +11520,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -12372,7 +11529,6 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -12382,7 +11538,6 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -12391,7 +11546,6 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==", - "license": "MIT", "engines": { "node": ">=0.8" } @@ -12400,7 +11554,6 @@ "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "license": "MIT", "engines": { "node": ">=0.12" } @@ -12410,7 +11563,6 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -12422,7 +11574,6 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -12439,7 +11590,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12474,7 +11624,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -12484,7 +11633,6 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -12515,15 +11663,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -12540,7 +11686,6 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } @@ -12549,7 +11694,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -12568,7 +11712,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -12577,7 +11720,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", "peer": true, "dependencies": { "randombytes": "^2.1.0" @@ -12588,7 +11730,6 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12606,7 +11747,6 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12626,7 +11766,6 @@ "https://paypal.me/jonathanschlinkert", "https://jonschlinkert.dev/sponsor" ], - "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "is-primitive": "^3.0.1" @@ -12638,15 +11777,13 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -12657,15 +11794,13 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -12678,7 +11813,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12688,7 +11822,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -12707,7 +11840,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC", "engines": { "node": ">=14" }, @@ -12719,15 +11851,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12736,7 +11866,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12745,7 +11874,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12754,7 +11882,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -12764,14 +11891,12 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/sql-formatter": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-11.0.2.tgz", "integrity": "sha512-6QumAdGHEnI5dXEq1d0aBRP876AyA9Wp/UE7wopKNA2Mp9sKGRKVqGgoWHk4dr0J0nceesC85Y0p36qmGoNqhw==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1", "nearley": "^2.20.1" @@ -12785,7 +11910,6 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -12798,7 +11922,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12806,14 +11929,12 @@ "node_modules/state-local": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", - "license": "MIT" + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12823,7 +11944,6 @@ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", "dev": true, - "license": "MIT", "dependencies": { "internal-slot": "^1.0.4" }, @@ -12844,7 +11964,6 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -12858,7 +11977,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -12877,7 +11995,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -12891,15 +12008,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -12912,7 +12027,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -12928,7 +12042,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -12939,7 +12052,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -12961,12 +12073,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -12985,7 +12106,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13000,7 +12120,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13018,7 +12137,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13032,7 +12150,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13045,7 +12162,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -13055,7 +12171,6 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -13065,7 +12180,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -13077,24 +12191,21 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", - "license": "MIT", "peer": true }, "node_modules/style-value-types": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz", "integrity": "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==", - "license": "MIT", "dependencies": { "hey-listen": "^1.0.8", "tslib": "^2.1.0" } }, "node_modules/styled-components": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.11.tgz", - "integrity": "sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==", - "license": "MIT", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.12.tgz", + "integrity": "sha512-n/O4PzRPhbYI0k1vKKayfti3C/IGcPf+DqcrOB7O/ab9x4u/zjqraneT5N45+sIe87cxrCApXM8Bna7NYxwoTA==", "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", @@ -13122,7 +12233,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "license": "MIT", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -13130,20 +12240,44 @@ "node_modules/styled-components/node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } }, "node_modules/styled-components/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "license": "MIT", "dependencies": { "client-only": "0.0.1" }, @@ -13165,15 +12299,13 @@ "node_modules/stylis": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", - "license": "MIT" + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -13196,7 +12328,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -13206,7 +12337,6 @@ "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", "dev": true, - "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", @@ -13222,12 +12352,23 @@ "node": ">=14.18.0" } }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/supertest": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", "dev": true, - "license": "MIT", "dependencies": { "methods": "^1.1.2", "superagent": "^9.0.1" @@ -13241,7 +12382,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -13254,7 +12394,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13266,17 +12405,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/tailwindcss": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", - "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz", + "integrity": "sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==", "dev": true, - "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -13313,16 +12450,14 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", - "license": "BSD-2-Clause", + "version": "5.31.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", + "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13341,7 +12476,6 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "license": "MIT", "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", @@ -13376,7 +12510,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -13386,7 +12519,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -13401,7 +12533,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -13418,7 +12549,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -13434,7 +12564,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13459,15 +12588,13 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, - "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } @@ -13477,7 +12604,6 @@ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, - "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -13489,15 +12615,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13507,7 +12631,6 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -13518,14 +12641,12 @@ "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", - "license": "MIT" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", "engines": { "node": ">=0.6" } @@ -13533,21 +12654,18 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/ts-invariant": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -13556,13 +12674,13 @@ } }, "node_modules/ts-jest": { - "version": "29.1.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.5.tgz", - "integrity": "sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==", + "version": "29.2.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.4.tgz", + "integrity": "sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==", "dev": true, - "license": "MIT", "dependencies": { "bs-logger": "0.x", + "ejs": "^3.1.10", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", "json5": "^2.2.3", @@ -13604,11 +12722,10 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -13621,7 +12738,6 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -13634,7 +12750,6 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -13647,7 +12762,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13655,15 +12769,13 @@ "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "license": "0BSD" + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -13678,21 +12790,18 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" + "dev": true }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "license": "Unlicense" + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -13705,7 +12814,6 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13715,7 +12823,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -13728,7 +12835,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -13742,7 +12848,6 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -13757,7 +12862,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -13777,7 +12881,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -13798,7 +12901,6 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -13815,11 +12917,10 @@ } }, "node_modules/typescript": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", - "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13831,21 +12932,18 @@ "node_modules/u3": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/u3/-/u3-0.1.1.tgz", - "integrity": "sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==", - "license": "MIT" + "integrity": "sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==" }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "license": "MIT" + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -13860,7 +12958,6 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", "@types/react": ">=16.9.11", @@ -13874,13 +12971,12 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -13895,7 +12991,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" @@ -13911,7 +13006,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -13920,7 +13014,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -13938,10 +13031,9 @@ } }, "node_modules/use-debounce": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.1.tgz", - "integrity": "sha512-0uUXjOfm44e6z4LZ/woZvkM8FwV1wiuoB6xnrrOmeAEjRDDzTLQNRFtYHvqUsJdrz1X37j0rVGIVp144GLHGKg==", - "license": "MIT", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.2.tgz", + "integrity": "sha512-MwBiJK2dk+2qhMDVDCPRPeLuIekKfH2t1UYMnrW9pwcJJGFDbTLliSMBz2UKGmE1PJs8l3XoMqbIU1MemMAJ8g==", "engines": { "node": ">= 16.0.0" }, @@ -13953,7 +13045,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "license": "MIT", "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -13975,15 +13066,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -13996,14 +13085,12 @@ "node_modules/vscode-languageserver-types": { "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT", "peer": true }, "node_modules/walker": { @@ -14011,7 +13098,6 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -14020,7 +13106,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -14029,7 +13114,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "license": "MIT", "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -14042,14 +13126,12 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.92.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", - "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", - "license": "MIT", + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -14097,7 +13179,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "license": "MIT", "peer": true, "engines": { "node": ">=10.13.0" @@ -14107,7 +13188,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -14118,7 +13198,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -14134,7 +13213,6 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -14147,14 +13225,13 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, - "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -14163,8 +13240,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -14178,7 +13255,6 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, - "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -14197,7 +13273,6 @@ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -14217,7 +13292,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14227,7 +13301,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -14246,7 +13319,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -14264,7 +13336,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -14280,7 +13351,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -14292,22 +13362,19 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -14322,7 +13389,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -14335,7 +13401,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -14348,7 +13413,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -14363,15 +13427,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -14384,15 +13446,13 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } @@ -14401,15 +13461,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", "dev": true, - "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -14422,7 +13480,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -14441,7 +13498,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } @@ -14450,15 +13506,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -14473,7 +13527,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -14484,14 +13537,12 @@ "node_modules/zen-observable": { "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", - "license": "MIT" + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" }, "node_modules/zen-observable-ts": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", - "license": "MIT", "dependencies": { "zen-observable": "0.8.15" } diff --git a/frontend/src/utils/indexerRunner.js b/frontend/src/utils/indexerRunner.js index c8cd4d9a9..7619f8b05 100644 --- a/frontend/src/utils/indexerRunner.js +++ b/frontend/src/utils/indexerRunner.js @@ -194,8 +194,8 @@ export default class IndexerRunner { blockHeight, `Mocking: Update of objects that match the specified fields with the following values in table ${tableDefinitionNames.originalTableName} on schema ${schemaName}`, { - matchingFields: whereObj.map((col) => tableDefinitionNames.originalColumnNames.get(col) ?? col), - fieldsToUpdate: updateObj.map((col) => tableDefinitionNames.originalColumnNames.get(col) ?? col), + matchingFields: whereObj, + fieldsToUpdate: updateObj, }, ), From 7e2b2731e29b50e0b4e5f0345f43af12bf4bcd98 Mon Sep 17 00:00:00 2001 From: Morgan McCauley Date: Thu, 8 Aug 2024 10:30:11 +1200 Subject: [PATCH 02/17] chore: Log non existant indexer responses (#986) Recently, we erroneously encountered "Delete" lifecycle transitions. One suspect is RPC responses from the registry contract incorrectly being parsed as `None`. This PR logs any RPC response interpreted as `None` so we can confirm if this is the culprit. --- coordinator/src/registry.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/coordinator/src/registry.rs b/coordinator/src/registry.rs index e1372a2ec..2a5879e17 100644 --- a/coordinator/src/registry.rs +++ b/coordinator/src/registry.rs @@ -250,6 +250,13 @@ impl RegistryImpl { deleted_at_block_height: config.deleted_at_block_height, })) } else { + tracing::info!( + account_id = account_id.as_str(), + function_name, + "Received null config from registry: {:?}", + String::from_utf8_lossy(&call_result.result) + ); + Ok(None) }; } From 7e7f6c0902d1df1dcd1970faa2f088080adbd902 Mon Sep 17 00:00:00 2001 From: Morgan McCauley Date: Thu, 8 Aug 2024 10:30:22 +1200 Subject: [PATCH 03/17] feat: Write coordinator logs in GCP compatible format (#984) --- coordinator/Cargo.lock | 1 + coordinator/Cargo.toml | 1 + coordinator/src/main.rs | 14 ++++++++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/coordinator/Cargo.lock b/coordinator/Cargo.lock index 0e4e5e24f..222416d8c 100644 --- a/coordinator/Cargo.lock +++ b/coordinator/Cargo.lock @@ -1307,6 +1307,7 @@ dependencies = [ "tonic 0.10.2", "tonic-build 0.10.2", "tracing", + "tracing-stackdriver", "tracing-subscriber", ] diff --git a/coordinator/Cargo.toml b/coordinator/Cargo.toml index a595dcf2f..6829bb03f 100644 --- a/coordinator/Cargo.toml +++ b/coordinator/Cargo.toml @@ -12,6 +12,7 @@ tokio = "1.28" tonic = "0.10.2" tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +tracing-stackdriver = "0.10.0" serde = "1.0.195" serde_json = "1.0.108" diff --git a/coordinator/src/main.rs b/coordinator/src/main.rs index fef71dd32..37cd3dcbd 100644 --- a/coordinator/src/main.rs +++ b/coordinator/src/main.rs @@ -33,10 +33,16 @@ async fn sleep(duration: Duration) -> anyhow::Result<()> { #[tokio::main] async fn main() -> anyhow::Result<()> { - tracing_subscriber::registry() - .with(tracing_subscriber::fmt::layer()) - .with(tracing_subscriber::EnvFilter::from_default_env()) - .init(); + let subscriber = + tracing_subscriber::registry().with(tracing_subscriber::EnvFilter::from_default_env()); + + if std::env::var("GCP_LOGGING_ENABLED").is_ok() { + subscriber.with(tracing_stackdriver::layer()).init(); + } else { + subscriber + .with(tracing_subscriber::fmt::layer().compact()) + .init(); + } let rpc_url = std::env::var("RPC_URL").expect("RPC_URL is not set"); let registry_contract_id = std::env::var("REGISTRY_CONTRACT_ID") From a238cb5f9282213918569bb98ed45723bcd1071b Mon Sep 17 00:00:00 2001 From: Kevin Zhang <42101107+Kevin101Zhang@users.noreply.github.com> Date: Thu, 8 Aug 2024 15:09:38 -0400 Subject: [PATCH 04/17] feat: UI improvements (#995) UI Changes after jam session with Xuan --- frontend/widgets/src/QueryApi.Launchpad.jsx | 24 +++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/frontend/widgets/src/QueryApi.Launchpad.jsx b/frontend/widgets/src/QueryApi.Launchpad.jsx index d0ac5dcbc..5ff436a5f 100644 --- a/frontend/widgets/src/QueryApi.Launchpad.jsx +++ b/frontend/widgets/src/QueryApi.Launchpad.jsx @@ -14,11 +14,12 @@ const NoQueryText = styled.p` font-size: 16px; font-family: 'Mona Sans', sans-serif; color: #A1A09A; + width: 80%; text-align: center; `; const NoQuerySVG = styled.svg` - height: 100px; + height: 90px; width: 100%; color: #A1A09A; `; @@ -28,7 +29,7 @@ const CheckboxContainer = styled.div` `; const CheckboxLabel = styled.label` - font-size: 12px; + font-size: 14px; display: flex; align-items: center; cursor: pointer; @@ -53,6 +54,10 @@ const Checkbox = styled.input` vertical-align: middle; margin-right: 7.2px; outline: none; + + &:checked { + background-color: #8279E2; + } `; // TOP HALF @@ -86,7 +91,7 @@ const Subheadline = styled.p` font-family: 'Mona Sans', sans-serif; font-weight: 400; font-size: 16px; - line-height: 18.2px; + line-height: 24px; color: #717069; letter-spacing: 1.5%; `; @@ -101,25 +106,25 @@ const Container = styled.div` const HeadlineContainer = styled.div` width: 364px; - height: 193px; display: flex; flex-direction: column; justify-content: center; align-items: center; margin-right: 80px; /* Gap between HeadlineContainer and WidgetContainer */ + margin-top: 24px; //combine margin `; const WidgetContainer = styled.div` width: 301px; - height: 365px; display: flex; flex-direction: column; justify-content: center; align-items: center; box-shadow: 0 8.2px 19.92px 0 rgba(0, 0, 0, 0.1), 0 2.34px 2.34px 0 rgba(0, 0, 0, 0.15); - margin-top: 183px; /* Gap between WidgetContainer and HeadlineContainer */ + margin-top: 140px; /* Gap between WidgetContainer and HeadlineContainer */ background: #fff; border-radius: 10px; + padding: 16px 0 28px; `; const SubContainer = styled.div` @@ -128,7 +133,7 @@ const SubContainer = styled.div` `; const SubContainerTitle = styled.h2` - font-family: 'Product Sans', sans-serif; + font-family: 'Mona Sans', sans-serif; font-weight: 700; font-size: 14px; line-height: 14.06px; @@ -154,7 +159,7 @@ const MetadataIcon = styled.span` display: flex; align-items: center; justify-content: center; - font-size: 11px; + font-size: 12px; font-weight: normal; width: 23px; height: 17px; @@ -207,7 +212,7 @@ scrollbar-color: #888 #f1f1f1; `; const GenerateButton = styled.button` - margin-top: 16px; + margin-top: 24px; width: 100%; background-color: #37CD83; border: none; @@ -237,6 +242,7 @@ const InputWrapper = styled.div` border-radius: 6px; padding: 0; overflow: hidden; + margin-top: 24px; `; const StyledInput = styled.input` From af08c30ff930b1334999b6ef53a64fa564a142ef Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Thu, 8 Aug 2024 17:00:06 -0700 Subject: [PATCH 05/17] refactor: Move Context object to new class (#929) All logic associated with the creation of the context object resides inside the Indexer class, which bloats the file and complicates unit testing. In addition, it prevents access to the context object itself so that these calls can be made through the Indexer class itself. This PR refactors this logic into its own class, allowing access to context methods through Indexer. The object is still recreated each time it is accessed as the object bakes in some state information (block height and log entry array) which need to be updated on subsequent accesses. I've also reorganized the folders so that we have fewer folders under src as it is getting cluttered. --- .gitignore | 2 + core-indexers/package.json | 3 - core-indexers/receiver-blocks/unit.test.ts | 42 +- core-indexers/tsconfig.json | 5 +- runner/.DS_Store | Bin 6148 -> 0 bytes runner/src/dml-handler/index.ts | 1 - runner/src/indexer-config/index.ts | 1 + .../__snapshots__/indexer.test.ts.snap | 72 -- .../context-builder.test.ts.snap | 158 +++ .../context-builder/context-builder.test.ts | 471 ++++++++ .../context-builder/context-builder.ts | 292 +++++ runner/src/indexer/context-builder/index.ts | 2 + .../dml-handler/dml-handler.test.ts | 10 +- .../{ => indexer}/dml-handler/dml-handler.ts | 8 +- .../dml-handler/in-memory-dml-handler.test.ts | 2 +- .../dml-handler/in-memory-dml-handler.ts | 2 +- runner/src/indexer/dml-handler/index.ts | 3 + runner/src/indexer/index.ts | 3 +- runner/src/indexer/indexer.test.ts | 1015 ++--------------- runner/src/indexer/indexer.ts | 267 +---- .../local-indexer.ts | 14 +- runner/src/local-indexer/index.ts | 1 - runner/src/stream-handler/worker.ts | 8 +- runner/tests/integration.test.ts | 34 +- 24 files changed, 1092 insertions(+), 1324 deletions(-) delete mode 100644 runner/.DS_Store delete mode 100644 runner/src/dml-handler/index.ts delete mode 100644 runner/src/indexer/__snapshots__/indexer.test.ts.snap create mode 100644 runner/src/indexer/context-builder/__snapshots__/context-builder.test.ts.snap create mode 100644 runner/src/indexer/context-builder/context-builder.test.ts create mode 100644 runner/src/indexer/context-builder/context-builder.ts create mode 100644 runner/src/indexer/context-builder/index.ts rename runner/src/{ => indexer}/dml-handler/dml-handler.test.ts (96%) rename runner/src/{ => indexer}/dml-handler/dml-handler.ts (96%) rename runner/src/{ => indexer}/dml-handler/in-memory-dml-handler.test.ts (99%) rename runner/src/{ => indexer}/dml-handler/in-memory-dml-handler.ts (99%) create mode 100644 runner/src/indexer/dml-handler/index.ts rename runner/src/{local-indexer => indexer}/local-indexer.ts (70%) delete mode 100644 runner/src/local-indexer/index.ts diff --git a/.gitignore b/.gitignore index 826b0b188..08f084abe 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ redis/ node_modules/ .vscode/ runner/yarn.lock +**/.DS_Store + diff --git a/core-indexers/package.json b/core-indexers/package.json index c79a64266..ce9f80868 100644 --- a/core-indexers/package.json +++ b/core-indexers/package.json @@ -7,9 +7,6 @@ }, "author": "", "license": "ISC", - "dependencies": { - "queryapi-runner": "file:../runner" - }, "devDependencies": { "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.7.0", diff --git a/core-indexers/receiver-blocks/unit.test.ts b/core-indexers/receiver-blocks/unit.test.ts index 1d0c103bf..fdbc98f75 100644 --- a/core-indexers/receiver-blocks/unit.test.ts +++ b/core-indexers/receiver-blocks/unit.test.ts @@ -1,5 +1,5 @@ import fs from 'fs'; -import LocalIndexer from 'queryapi-runner/src/local-indexer'; +import LocalIndexer from 'queryapi-runner/src/indexer/local-indexer'; import { LocalIndexerConfig } from 'queryapi-runner/src/indexer-config/indexer-config'; import { LogLevel } from 'queryapi-runner/src/indexer-meta/log-entry'; import path from 'path'; @@ -15,6 +15,44 @@ describe('Receiver Blocks Indexer Tests', () => { test('Try executing on a block', async () => { const localIndexer = new LocalIndexer(indexerConfig); - await localIndexer.executeOnBlock(123621232); + const context = localIndexer.getContext(); + + // Run on one block to populate receivers table and initial bitmap + await localIndexer.executeOnBlock(100000000); + const receivers = await context.db.Receivers.select({ + receiver: 'app.nearcrowd.near' + }); + const tokenSweatId = receivers[0].id; + + const correctBitmapOne = { + first_block_height: 100000000, + block_date: '2023-08-30', + receiver_id: tokenSweatId, + bitmap: 'wA==', + last_elias_gamma_start_bit: 1, + max_index: 0, + }; + const correctBitmapTwo = { + first_block_height: 100000000, + block_date: '2023-08-30', + receiver_id: tokenSweatId, + bitmap: 'oA==', + last_elias_gamma_start_bit: 1, + max_index: 1, + }; + + let bitmap = await context.db.Bitmaps.select({ + receiver_id: tokenSweatId + }); + expect(bitmap.length).toBe(1); + expect(bitmap[0]).toEqual(correctBitmapOne); + + // Run on second block and verify bitmap update + await localIndexer.executeOnBlock(100000001); + bitmap = await context.db.Bitmaps.select({ + receiver_id: tokenSweatId + }); + expect(bitmap.length).toBe(1); + expect(bitmap[0]).toEqual(correctBitmapTwo); }); }); diff --git a/core-indexers/tsconfig.json b/core-indexers/tsconfig.json index 9555e4723..0cb90e9df 100644 --- a/core-indexers/tsconfig.json +++ b/core-indexers/tsconfig.json @@ -3,7 +3,10 @@ "target": "es2018", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "lib": ["es2021"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ "module": "commonjs", /* Specify what module code is generated. */ - "rootDir": "..", + "rootDir": "..", + "paths": { + "@queryapi-runner/*": ["../runner/*"], /* Allow imports from runner using queryapi-runner alias */ + }, "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ "resolveJsonModule": true, /* Enable importing .json files. */ "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ diff --git a/runner/.DS_Store b/runner/.DS_Store deleted file mode 100644 index 5758fbfd76fd5a3e7086c2a3bc488249ce571433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJ5Iwu5S>j-WQisvJD;8Plf1J_L}7ZfoDhwPC`V%qJm?Wt_nHRg%*G&VBwDX7CbLDV>Yjyu zql))FqMEKK(KXuM{tq7a?Nutv`6|t!&tINj-*4|XCtaWAw?6gdE>Fxq4QY*iELsc> z?vA&X-Q1gp(b?ORI0OHW0n}`k{7}(*XTTY72EG{J z^C6-!7KV+Y93AN72>{HX7QtBVmcYmgU}4xOLIVjJ3e?bGPmG}9&`0wt3>!rary!ZJ zj%EIQyac=1hA8e73Ptao0cW7iz)+`SuK%a_m3klf?GT?i1J1x7V<2SZteoPbthRPO zk85p2J4a(-zlH}8jHMI { + const MOCK_CONFIG = { + hasuraEndpoint: 'mock-hasura-endpoint', + hasuraAdminSecret: 'mock-hasura-secret', + }; + + const SIMPLE_SCHEMA = `CREATE TABLE + "posts" ( + "id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "accounts_liked" JSONB NOT NULL DEFAULT '[]', + "last_comment_timestamp" DECIMAL(20, 0), + CONSTRAINT "posts_pkey" PRIMARY KEY ("id") + );`; + + const SOCIAL_SCHEMA = ` + CREATE TABLE + "posts" ( + "id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "accounts_liked" JSONB NOT NULL DEFAULT '[]', + "last_comment_timestamp" DECIMAL(20, 0), + CONSTRAINT "posts_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "comments" ( + "id" SERIAL NOT NULL, + "post_id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + CONSTRAINT "comments_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "post_likes" ( + "post_id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0), + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + CONSTRAINT "post_likes_pkey" PRIMARY KEY ("post_id", "account_id") + );`; + + const CASE_SENSITIVE_SCHEMA = ` + CREATE TABLE + Posts ( + "id" SERIAL NOT NULL, + "AccountId" VARCHAR NOT NULL, + BlockHeight DECIMAL(58, 0) NOT NULL, + "receiptId" VARCHAR NOT NULL, + content TEXT NOT NULL, + block_Timestamp DECIMAL(20, 0) NOT NULL, + "Accounts_Liked" JSONB NOT NULL DEFAULT '[]', + "LastCommentTimestamp" DECIMAL(20, 0), + CONSTRAINT "posts_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "CommentsTable" ( + "id" SERIAL NOT NULL, + PostId SERIAL NOT NULL, + "accountId" VARCHAR NOT NULL, + blockHeight DECIMAL(58, 0) NOT NULL, + CONSTRAINT "comments_pkey" PRIMARY KEY ("id") + );`; + + const STRESS_TEST_SCHEMA = ` + CREATE TABLE creator_quest ( + account_id VARCHAR PRIMARY KEY, + num_components_created INTEGER NOT NULL DEFAULT 0, + completed BOOLEAN NOT NULL DEFAULT FALSE + ); + + CREATE TABLE + composer_quest ( + account_id VARCHAR PRIMARY KEY, + num_widgets_composed INTEGER NOT NULL DEFAULT 0, + completed BOOLEAN NOT NULL DEFAULT FALSE + ); + + CREATE TABLE + "contractor - quest" ( + account_id VARCHAR PRIMARY KEY, + num_contracts_deployed INTEGER NOT NULL DEFAULT 0, + completed BOOLEAN NOT NULL DEFAULT FALSE + ); + + CREATE TABLE + "posts" ( + "id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "accounts_liked" JSONB NOT NULL DEFAULT '[]', + "last_comment_timestamp" DECIMAL(20, 0), + CONSTRAINT "posts_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "comments" ( + "id" SERIAL NOT NULL, + "post_id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + CONSTRAINT "comments_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "post_likes" ( + "post_id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0), + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + CONSTRAINT "post_likes_pkey" PRIMARY KEY ("post_id", "account_id") + ); + + CREATE UNIQUE INDEX "posts_account_id_block_height_key" ON "posts" ("account_id" ASC, "block_height" ASC); + + CREATE UNIQUE INDEX "comments_post_id_account_id_block_height_key" ON "comments" ( + "post_id" ASC, + "account_id" ASC, + "block_height" ASC + ); + + CREATE INDEX + "posts_last_comment_timestamp_idx" ON "posts" ("last_comment_timestamp" DESC); + + ALTER TABLE + "comments" + ADD + CONSTRAINT "comments_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "posts" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION; + + ALTER TABLE + "post_likes" + ADD + CONSTRAINT "post_likes_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "posts" ("id") ON DELETE CASCADE ON UPDATE NO ACTION; + + CREATE TABLE IF NOT EXISTS + "My Table1" (id serial PRIMARY KEY); + + CREATE TABLE + "Another-Table" (id serial PRIMARY KEY); + + CREATE TABLE + IF NOT EXISTS + "Third-Table" (id serial PRIMARY KEY); + + CREATE TABLE + yet_another_table (id serial PRIMARY KEY); + `; + + const SIMPLE_REDIS_STREAM = 'test:stream'; + const SIMPLE_ACCOUNT_ID = 'morgs.near'; + const SIMPLE_FUNCTION_NAME = 'test_indexer'; + const SIMPLE_CODE = 'const a = 1;'; + const SIMPLE_SCHEMA_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SIMPLE_SCHEMA, LogLevel.INFO); + const SIMPLE_SOCIAL_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SOCIAL_SCHEMA, LogLevel.INFO); + const CASE_SENSITIVE_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, CASE_SENSITIVE_SCHEMA, LogLevel.INFO); + const STRESS_TEST_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, STRESS_TEST_SCHEMA, LogLevel.INFO); + + const genericMockFetch = jest.fn() + .mockResolvedValue({ + status: 200, + json: async () => ({ + data: 'mock', + }), + }) as unknown as typeof fetch; + + const genericMockDmlHandler = { + insert: jest.fn().mockReturnValue([]), + select: jest.fn().mockReturnValue([]), + update: jest.fn().mockReturnValue([]), + upsert: jest.fn().mockReturnValue([]), + delete: jest.fn().mockReturnValue([]), + } as unknown as DmlHandler; + + test('ContextBuilder can parse various schemas', () => { + const simpleContextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + const socialContextBuilder = new ContextBuilder( + SIMPLE_SOCIAL_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + const caseSensitiveContextBuilder = new ContextBuilder( + CASE_SENSITIVE_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + const stressTestContextBuilder = new ContextBuilder( + STRESS_TEST_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + expect(simpleContextBuilder.buildContext(1, []).db).toMatchSnapshot(); + expect(socialContextBuilder.buildContext(1, []).db).toMatchSnapshot(); + expect(caseSensitiveContextBuilder.buildContext(1, []).db).toMatchSnapshot(); + expect(stressTestContextBuilder.buildContext(1, []).db).toMatchSnapshot(); + }); + + test('ContextBuilder adds CRUD operations for table', () => { + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + context.db.Posts.insert({}); + context.db.Posts.select({}); + context.db.Posts.update({}, {}); + context.db.Posts.upsert({}, [], []); + context.db.Posts.delete({}); + + expect(genericMockDmlHandler.insert).toHaveBeenCalledTimes(1); + expect(genericMockDmlHandler.select).toHaveBeenCalledTimes(1); + expect(genericMockDmlHandler.update).toHaveBeenCalledTimes(1); + expect(genericMockDmlHandler.upsert).toHaveBeenCalledTimes(1); + expect(genericMockDmlHandler.delete).toHaveBeenCalledTimes(1); + expect(context.db.Posts).toMatchSnapshot(); + }); + + test('Context object has empty db object if schema is empty', async () => { + const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'code', '', LogLevel.INFO); + const contextBuilder = new ContextBuilder( + indexerConfig, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + + expect(Object.keys(context.db)).toStrictEqual([]); + }); + + test('Context object has empty db object if schema fails to parse', async () => { + const schemaWithDuplicateSanitizedTableNames = `CREATE TABLE + "test table" ( + "id" SERIAL NOT NULL + ); + CREATE TABLE "test!table" ( + "id" SERIAL NOT NULL + );`; + const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'code', schemaWithDuplicateSanitizedTableNames, LogLevel.INFO); + const contextBuilder = new ContextBuilder( + indexerConfig, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + // Does not outright throw an error but instead returns an empty object + expect(contextBuilder.buildDatabaseContext(1, [])) + .toStrictEqual({}); + }); + + test('Context object allows execution of arbitrary GraphQL operations', async () => { + const mockFetch = jest.fn() + .mockResolvedValueOnce({ + status: 200, + json: async () => ({ + data: { + greet: 'hello' + } + }) + }) + .mockResolvedValueOnce({ + status: 200, + json: async () => ({ + data: { + newGreeting: { + success: true + } + } + }) + }); + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: mockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + const query = ` + query { + greet() + } + `; + const { greet } = await context.graphql(query) as { greet: string }; + + const mutation = ` + mutation { + newGreeting(greeting: "${greet} morgan") { + success + } + } + `; + const { newGreeting: { success } } = await context.graphql(mutation); + + expect(greet).toEqual('hello'); + expect(success).toEqual(true); + expect(mockFetch.mock.calls[0]).toEqual([ + `${MOCK_CONFIG.hasuraEndpoint}/v1/graphql`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Hasura-Use-Backend-Only-Permissions': 'true', + 'X-Hasura-Role': 'morgs_near', + 'X-Hasura-Admin-Secret': MOCK_CONFIG.hasuraAdminSecret + }, + body: JSON.stringify({ query }) + } + ]); + expect(mockFetch.mock.calls[1]).toEqual([ + `${MOCK_CONFIG.hasuraEndpoint}/v1/graphql`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Hasura-Use-Backend-Only-Permissions': 'true', + 'X-Hasura-Role': 'morgs_near', + 'X-Hasura-Admin-Secret': MOCK_CONFIG.hasuraAdminSecret + }, + body: JSON.stringify({ query: mutation }) + } + ]); + }); + + test('Context object social api can fetch from the near social api', async () => { + const mockFetch = jest.fn(); + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: mockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + + await context.fetchFromSocialApi('/index', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + action: 'post', + key: 'main', + options: { + limit: 1, + order: 'desc' + } + }) + }); + + expect(mockFetch.mock.calls).toMatchSnapshot(); + }); + + test('Context object graphql function throws when a GraphQL response contains errors', async () => { + const mockFetch = jest.fn() + .mockResolvedValue({ + json: async () => ({ + errors: ['boom'] + }) + }); + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: mockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + + await expect(async () => await context.graphql('query { hello }')).rejects.toThrow('boom'); + }); + + test('Context object graphl handles GraphQL variables and sets backend only permissions', async () => { + const mockFetch = jest.fn() + .mockResolvedValue({ + status: 200, + json: async () => ({ + data: 'mock', + }), + }); + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: mockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + + const query = 'query($name: String) { hello(name: $name) }'; + const variables = { name: 'morgan' }; + await context.graphql(query, variables); + + expect(mockFetch.mock.calls[0]).toEqual([ + `${MOCK_CONFIG.hasuraEndpoint}/v1/graphql`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Hasura-Use-Backend-Only-Permissions': 'true', + 'X-Hasura-Role': 'morgs_near', + 'X-Hasura-Admin-Secret': MOCK_CONFIG.hasuraAdminSecret + }, + body: JSON.stringify({ + query, + variables, + }), + }, + ]); + }); +}); diff --git a/runner/src/indexer/context-builder/context-builder.ts b/runner/src/indexer/context-builder/context-builder.ts new file mode 100644 index 000000000..0f1507f63 --- /dev/null +++ b/runner/src/indexer/context-builder/context-builder.ts @@ -0,0 +1,292 @@ +import fetch from 'node-fetch'; +import { type Response } from 'node-fetch'; +import { Parser } from 'node-sql-parser'; +import { type DmlHandlerInterface } from '../dml-handler'; +import { type TableDefinitionNames } from '../indexer'; +import type IndexerConfig from '../../indexer-config'; +import { LogEntry } from '../../indexer-meta'; +import { wrapSpan } from '../../utility'; +import assert from 'assert'; +import logger from '../../logger'; +import { trace } from '@opentelemetry/api'; + +export interface ContextObject { + graphql: (operation: string, variables?: Record) => Promise + set: (key: string, value: any) => Promise + debug: (message: string) => void + log: (message: string) => void + warn: (message: string) => void + error: (message: string) => void + fetchFromSocialApi: (path: string, options?: any) => Promise + db: Record any>> +} + +interface Dependencies { + fetch?: typeof fetch + dmlHandler: DmlHandlerInterface + parser?: Parser +} + +interface Config { + hasuraAdminSecret: string + hasuraEndpoint: string +} + +const defaultConfig: Config = { + hasuraAdminSecret: process.env.HASURA_ADMIN_SECRET ?? '', + hasuraEndpoint: process.env.HASURA_ENDPOINT ?? '', +}; + +export default class ContextBuilder { + DEFAULT_HASURA_ROLE: string = 'append'; + + tracer = trace.getTracer('queryapi-runner-context'); + private readonly logger: typeof logger; + tableDefinitions: Map; + deps: Required; + + constructor ( + private readonly indexerConfig: IndexerConfig, + deps: Dependencies, + private readonly config: Config = defaultConfig, + ) { + this.logger = logger.child({ accountId: indexerConfig.accountId, functionName: indexerConfig.functionName, service: this.constructor.name }); + + this.deps = { + fetch, + parser: new Parser(), + ...deps + }; + // TODO: Move Parsing logic to separate class + this.tableDefinitions = getTableNameToDefinitionNamesMapping(indexerConfig.schema); + } + + private sanitizeTableName (tableName: string): string { + // Convert to PascalCase + let pascalCaseTableName = tableName + // Replace special characters with underscores + .replace(/[^a-zA-Z0-9_]/g, '_') + // Makes first letter and any letters following an underscore upper case + .replace(/^([a-zA-Z])|_([a-zA-Z])/g, (match: string) => match.toUpperCase()) + // Removes all underscores + .replace(/_/g, ''); + + // Add underscore if first character is a number + if (/^[0-9]/.test(pascalCaseTableName)) { + pascalCaseTableName = '_' + pascalCaseTableName; + } + + return pascalCaseTableName; + } + + private async runGraphQLQuery (operation: string, variables: any, blockHeight: number, hasuraRoleName: string | null, logError: boolean = true): Promise { + assert(this.config.hasuraAdminSecret !== '' && this.config.hasuraEndpoint !== '', 'hasuraAdminSecret and hasuraEndpoint env variables are required'); + const response: Response = await this.deps.fetch(`${this.config.hasuraEndpoint}/v1/graphql`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Hasura-Use-Backend-Only-Permissions': 'true', + ...(hasuraRoleName && { + 'X-Hasura-Role': hasuraRoleName, + 'X-Hasura-Admin-Secret': this.config.hasuraAdminSecret, + }), + }, + body: JSON.stringify({ + query: operation, + ...(variables && { variables }), + }), + }); + + const { data, errors } = await response.json(); + + if (response.status !== 200 || errors) { + if (logError) { + const message: string = errors ? errors.map((e: any) => e.message).join(', ') : `HTTP ${response.status} error writing with graphql to indexer storage`; + const mutation: string = + `mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){ + insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) { + id + } + }`; + try { + await this.runGraphQLQuery(mutation, { function_name: this.indexerConfig.fullName(), block_height: blockHeight, message }, blockHeight, this.DEFAULT_HASURA_ROLE, false); + } catch (e) { + this.logger.error('Error writing log of graphql error', e); + } + } + throw new Error(`Failed to write graphql, http status: ${response.status}, errors: ${JSON.stringify(errors, null, 2)}`); + } + + return data; + } + + buildContext (blockHeight: number, logEntries: LogEntry[]): ContextObject { + return { + graphql: async (operation: string, variables?: Record) => { + return await wrapSpan(async () => { + return await this.runGraphQLQuery(operation, variables, blockHeight, this.indexerConfig.hasuraRoleName()); + }, this.tracer, `Call graphql ${operation.includes('mutation') ? 'mutation' : 'query'} through Hasura`); + }, + set: async (key, value) => { + const mutation = ` + mutation SetKeyValue($function_name: String!, $key: String!, $value: String!) { + insert_${this.indexerConfig.hasuraRoleName()}_${this.indexerConfig.hasuraFunctionName()}_indexer_storage_one(object: {function_name: $function_name, key_name: $key, value: $value} on_conflict: {constraint: indexer_storage_pkey, update_columns: value}) {key_name} + }`; + const variables = { + function_name: this.indexerConfig.fullName(), + key, + value: value ? JSON.stringify(value) : null + }; + return await wrapSpan(async () => { + return await this.runGraphQLQuery(mutation, variables, blockHeight, this.indexerConfig.hasuraRoleName()); + }, this.tracer, 'call insert mutation through Hasura'); + }, + debug: (...log) => { + const debugLogEntry = LogEntry.userDebug(log.join(' : '), blockHeight); + logEntries.push(debugLogEntry); + }, + log: (...log) => { + const infoLogEntry = LogEntry.userInfo(log.join(' : '), blockHeight); + logEntries.push(infoLogEntry); + }, + warn: (...log) => { + const warnLogEntry = LogEntry.userWarn(log.join(' : '), blockHeight); + logEntries.push(warnLogEntry); + }, + error: (...log) => { + const errorLogEntry = LogEntry.userError(log.join(' : '), blockHeight); + logEntries.push(errorLogEntry); + }, + fetchFromSocialApi: async (path, options) => { + return await this.deps.fetch(`https://api.near.social${path}`, options); + }, + db: this.buildDatabaseContext(blockHeight, logEntries) + }; + } + + buildDatabaseContext ( + blockHeight: number, + logEntries: LogEntry[], + ): Record any>> { + if (this.tableDefinitions.size === 0) { + logEntries.push(LogEntry.systemDebug('No tables found in schema. No context.db methods generated')); + return {}; + } + try { + const tableNames = Array.from(this.tableDefinitions.keys()); + const sanitizedTableNames = new Set(); + const dmlHandler: DmlHandlerInterface = this.deps.dmlHandler; + + // Generate and collect methods for each table name + const result = tableNames.reduce((prev, tableName) => { + // Generate sanitized table name and ensure no conflict + const sanitizedTableName = this.sanitizeTableName(tableName); + const tableDefinitionNames: TableDefinitionNames = this.tableDefinitions.get(tableName) as TableDefinitionNames; + if (sanitizedTableNames.has(sanitizedTableName)) { + throw new Error(`Table ${tableName} has the same sanitized name as another table. Special characters are removed to generate context.db methods. Please rename the table.`); + } else { + sanitizedTableNames.add(sanitizedTableName); + } + + // Generate context.db methods for table + const funcForTable = { + [`${sanitizedTableName}`]: { + insert: async (objectsToInsert: any) => { + const insertLogEntry = LogEntry.userDebug(`Inserting object ${JSON.stringify(objectsToInsert)} into table ${tableName}`, blockHeight); + logEntries.push(insertLogEntry); + + return await dmlHandler.insert(tableDefinitionNames, Array.isArray(objectsToInsert) ? objectsToInsert : [objectsToInsert]); + }, + select: async (filterObj: any, limit = null) => { + const selectLogEntry = LogEntry.userDebug(`Selecting objects in table ${tableName} with values ${JSON.stringify(filterObj)} with ${limit === null ? 'no' : limit} limit`, blockHeight); + logEntries.push(selectLogEntry); + + return await dmlHandler.select(tableDefinitionNames, filterObj, limit); + }, + update: async (filterObj: any, updateObj: any) => { + const updateLogEntry = LogEntry.userDebug(`Updating objects in table ${tableName} that match ${JSON.stringify(filterObj)} with values ${JSON.stringify(updateObj)}`, blockHeight); + logEntries.push(updateLogEntry); + + return await dmlHandler.update(tableDefinitionNames, filterObj, updateObj); + }, + upsert: async (objectsToInsert: any, conflictColumns: string[], updateColumns: string[]) => { + const upsertLogEntry = LogEntry.userDebug(`Inserting objects into table ${tableName} with values ${JSON.stringify(objectsToInsert)}. Conflict on columns ${conflictColumns.join(', ')} will update values in columns ${updateColumns.join(', ')}`, blockHeight); + logEntries.push(upsertLogEntry); + + return await dmlHandler.upsert(tableDefinitionNames, Array.isArray(objectsToInsert) ? objectsToInsert : [objectsToInsert], conflictColumns, updateColumns); + }, + delete: async (filterObj: any) => { + const deleteLogEntry = LogEntry.userDebug(`Deleting objects from table ${tableName} with values ${JSON.stringify(filterObj)}`, blockHeight); + logEntries.push(deleteLogEntry); + + return await dmlHandler.delete(tableDefinitionNames, filterObj); + } + } + }; + return { + ...prev, + ...funcForTable + }; + }, {}); + return result; + } catch (err) { + const error = err as Error; + logEntries.push(LogEntry.systemWarn(`Caught error when generating context.db methods: ${error.message}`)); + } + return {}; // Default to empty object if error + } +} + +// TODO: Migrate all below code to separate class +function getColumnDefinitionNames (columnDefs: any[]): Map { + const columnDefinitionNames = new Map(); + for (const columnDef of columnDefs) { + if (columnDef.column?.type === 'column_ref') { + const columnNameDef = columnDef.column.column.expr; + const actualColumnName = columnNameDef.type === 'double_quote_string' ? `"${columnNameDef.value as string}"` : columnNameDef.value; + columnDefinitionNames.set(columnNameDef.value, actualColumnName); + } + } + return columnDefinitionNames; +} + +function retainOriginalQuoting (schema: string, tableName: string): string { + const createTableQuotedRegex = `\\b(create|CREATE)\\s+(table|TABLE)\\s+"${tableName}"\\s*`; + + if (schema.match(new RegExp(createTableQuotedRegex, 'i'))) { + return `"${tableName}"`; + } + + return tableName; +} + +function getTableNameToDefinitionNamesMapping (schema: string): Map { + const parser = new Parser(); + let schemaSyntaxTree = parser.astify(schema, { database: 'Postgresql' }); + schemaSyntaxTree = Array.isArray(schemaSyntaxTree) ? schemaSyntaxTree : [schemaSyntaxTree]; // Ensure iterable + const tableNameToDefinitionNamesMap = new Map(); + + for (const statement of schemaSyntaxTree) { + if (statement.type === 'create' && statement.keyword === 'table' && statement.table !== undefined) { + const tableName: string = statement.table[0].table; + + if (tableNameToDefinitionNamesMap.has(tableName)) { + throw new Error(`Table ${tableName} already exists in schema. Table names must be unique. Quotes are not allowed as a differentiator between table names.`); + } + + const createDefs = statement.create_definitions ?? []; + for (const columnDef of createDefs) { + if (columnDef.column?.type === 'column_ref') { + const tableDefinitionNames: TableDefinitionNames = { + tableName, + originalTableName: retainOriginalQuoting(schema, tableName), + originalColumnNames: getColumnDefinitionNames(createDefs) + }; + tableNameToDefinitionNamesMap.set(tableName, tableDefinitionNames); + } + } + } + } + + return tableNameToDefinitionNamesMap; +} diff --git a/runner/src/indexer/context-builder/index.ts b/runner/src/indexer/context-builder/index.ts new file mode 100644 index 000000000..c3486cba5 --- /dev/null +++ b/runner/src/indexer/context-builder/index.ts @@ -0,0 +1,2 @@ +export { default } from './context-builder'; +export type { ContextObject } from './context-builder'; diff --git a/runner/src/dml-handler/dml-handler.test.ts b/runner/src/indexer/dml-handler/dml-handler.test.ts similarity index 96% rename from runner/src/dml-handler/dml-handler.test.ts rename to runner/src/indexer/dml-handler/dml-handler.test.ts index 4b7c2ef19..8f52d6a1a 100644 --- a/runner/src/dml-handler/dml-handler.test.ts +++ b/runner/src/indexer/dml-handler/dml-handler.test.ts @@ -1,10 +1,10 @@ import pgFormat from 'pg-format'; import DmlHandler from './dml-handler'; -import type PgClient from '../pg-client'; -import { type TableDefinitionNames } from '../indexer'; -import { type PostgresConnectionParams } from '../pg-client'; -import IndexerConfig from '../indexer-config/indexer-config'; -import { LogLevel } from '../indexer-meta/log-entry'; +import type PgClient from '../../pg-client'; +import { type PostgresConnectionParams } from '../../pg-client'; +import { type TableDefinitionNames } from '../../indexer'; +import IndexerConfig from '../../indexer-config'; +import { LogLevel } from '../../indexer-meta/log-entry'; describe('DML Handler tests', () => { const getDbConnectionParameters: PostgresConnectionParams = { diff --git a/runner/src/dml-handler/dml-handler.ts b/runner/src/indexer/dml-handler/dml-handler.ts similarity index 96% rename from runner/src/dml-handler/dml-handler.ts rename to runner/src/indexer/dml-handler/dml-handler.ts index 29feb7d32..05b36d68b 100644 --- a/runner/src/dml-handler/dml-handler.ts +++ b/runner/src/indexer/dml-handler/dml-handler.ts @@ -1,7 +1,7 @@ -import { wrapError } from '../utility'; -import PgClient, { type PostgresConnectionParams } from '../pg-client'; -import { type TableDefinitionNames } from '../indexer'; -import type IndexerConfig from '../indexer-config/indexer-config'; +import { wrapError } from '../../utility'; +import PgClient, { type PostgresConnectionParams } from '../../pg-client'; +import { type TableDefinitionNames } from '../../indexer'; +import type IndexerConfig from '../../indexer-config/indexer-config'; import { type Tracer, trace, type Span } from '@opentelemetry/api'; import { type QueryResult } from 'pg'; diff --git a/runner/src/dml-handler/in-memory-dml-handler.test.ts b/runner/src/indexer/dml-handler/in-memory-dml-handler.test.ts similarity index 99% rename from runner/src/dml-handler/in-memory-dml-handler.test.ts rename to runner/src/indexer/dml-handler/in-memory-dml-handler.test.ts index 6fbc20c79..b8f946759 100644 --- a/runner/src/dml-handler/in-memory-dml-handler.test.ts +++ b/runner/src/indexer/dml-handler/in-memory-dml-handler.test.ts @@ -1,4 +1,4 @@ -import { type TableDefinitionNames } from '../indexer'; +import { type TableDefinitionNames } from '../../indexer'; import InMemoryDmlHandler from './in-memory-dml-handler'; const DEFAULT_ITEM_1_WITHOUT_ID = { diff --git a/runner/src/dml-handler/in-memory-dml-handler.ts b/runner/src/indexer/dml-handler/in-memory-dml-handler.ts similarity index 99% rename from runner/src/dml-handler/in-memory-dml-handler.ts rename to runner/src/indexer/dml-handler/in-memory-dml-handler.ts index d6fa9f1d4..450ff0104 100644 --- a/runner/src/dml-handler/in-memory-dml-handler.ts +++ b/runner/src/indexer/dml-handler/in-memory-dml-handler.ts @@ -1,5 +1,5 @@ import { type AST, Parser } from 'node-sql-parser'; -import { type TableDefinitionNames } from '../indexer'; +import { type TableDefinitionNames } from '../../indexer'; import { type PostgresRow, type WhereClauseMulti, type WhereClauseSingle, type DmlHandlerInterface } from './dml-handler'; // TODO: Define class to represent specification diff --git a/runner/src/indexer/dml-handler/index.ts b/runner/src/indexer/dml-handler/index.ts new file mode 100644 index 000000000..7bdf14d68 --- /dev/null +++ b/runner/src/indexer/dml-handler/index.ts @@ -0,0 +1,3 @@ +export { default as DmlHandler } from './dml-handler'; +export { default as InMemoryDmlHandler } from './in-memory-dml-handler'; +export type { DmlHandlerInterface } from './dml-handler'; diff --git a/runner/src/indexer/index.ts b/runner/src/indexer/index.ts index f4d7192ae..7c066fb5d 100644 --- a/runner/src/indexer/index.ts +++ b/runner/src/indexer/index.ts @@ -1,2 +1,3 @@ -export { default } from './indexer'; +export { default as Indexer } from './indexer'; +export { default as LocalIndexer } from './local-indexer'; export type { TableDefinitionNames } from './indexer'; diff --git a/runner/src/indexer/indexer.test.ts b/runner/src/indexer/indexer.test.ts index 63e857dce..4dd366207 100644 --- a/runner/src/indexer/indexer.test.ts +++ b/runner/src/indexer/indexer.test.ts @@ -1,213 +1,45 @@ import { Block, type StreamerMessage } from '@near-lake/primitives'; -import type fetch from 'node-fetch'; import Indexer from './indexer'; import { VM } from 'vm2'; -import DmlHandler from '../dml-handler/dml-handler'; -import type PgClient from '../pg-client'; +import type { DmlHandler } from './dml-handler'; import { LogLevel } from '../indexer-meta/log-entry'; import IndexerConfig from '../indexer-config/indexer-config'; import { IndexerStatus } from '../indexer-meta'; import type IndexerMeta from '../indexer-meta'; -import { type PostgresConnectionParams } from '../pg-client'; +import ContextBuilder from './context-builder'; +import { type ContextObject } from './context-builder'; describe('Indexer unit tests', () => { - const SIMPLE_SCHEMA = `CREATE TABLE - "posts" ( - "id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "accounts_liked" JSONB NOT NULL DEFAULT '[]', - "last_comment_timestamp" DECIMAL(20, 0), - CONSTRAINT "posts_pkey" PRIMARY KEY ("id") - );`; - - const SOCIAL_SCHEMA = ` - CREATE TABLE - "posts" ( - "id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "accounts_liked" JSONB NOT NULL DEFAULT '[]', - "last_comment_timestamp" DECIMAL(20, 0), - CONSTRAINT "posts_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "comments" ( - "id" SERIAL NOT NULL, - "post_id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - CONSTRAINT "comments_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "post_likes" ( - "post_id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0), - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - CONSTRAINT "post_likes_pkey" PRIMARY KEY ("post_id", "account_id") - );`; - - const CASE_SENSITIVE_SCHEMA = ` - CREATE TABLE - Posts ( - "id" SERIAL NOT NULL, - "AccountId" VARCHAR NOT NULL, - BlockHeight DECIMAL(58, 0) NOT NULL, - "receiptId" VARCHAR NOT NULL, - content TEXT NOT NULL, - block_Timestamp DECIMAL(20, 0) NOT NULL, - "Accounts_Liked" JSONB NOT NULL DEFAULT '[]', - "LastCommentTimestamp" DECIMAL(20, 0), - CONSTRAINT "posts_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "CommentsTable" ( - "id" SERIAL NOT NULL, - PostId SERIAL NOT NULL, - "accountId" VARCHAR NOT NULL, - blockHeight DECIMAL(58, 0) NOT NULL, - CONSTRAINT "comments_pkey" PRIMARY KEY ("id") - );`; - - const STRESS_TEST_SCHEMA = ` - CREATE TABLE creator_quest ( - account_id VARCHAR PRIMARY KEY, - num_components_created INTEGER NOT NULL DEFAULT 0, - completed BOOLEAN NOT NULL DEFAULT FALSE - ); - - CREATE TABLE - composer_quest ( - account_id VARCHAR PRIMARY KEY, - num_widgets_composed INTEGER NOT NULL DEFAULT 0, - completed BOOLEAN NOT NULL DEFAULT FALSE - ); - - CREATE TABLE - "contractor - quest" ( - account_id VARCHAR PRIMARY KEY, - num_contracts_deployed INTEGER NOT NULL DEFAULT 0, - completed BOOLEAN NOT NULL DEFAULT FALSE - ); - - CREATE TABLE - "posts" ( - "id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "accounts_liked" JSONB NOT NULL DEFAULT '[]', - "last_comment_timestamp" DECIMAL(20, 0), - CONSTRAINT "posts_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "comments" ( - "id" SERIAL NOT NULL, - "post_id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - CONSTRAINT "comments_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "post_likes" ( - "post_id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0), - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - CONSTRAINT "post_likes_pkey" PRIMARY KEY ("post_id", "account_id") - ); - - CREATE UNIQUE INDEX "posts_account_id_block_height_key" ON "posts" ("account_id" ASC, "block_height" ASC); - - CREATE UNIQUE INDEX "comments_post_id_account_id_block_height_key" ON "comments" ( - "post_id" ASC, - "account_id" ASC, - "block_height" ASC - ); - - CREATE INDEX - "posts_last_comment_timestamp_idx" ON "posts" ("last_comment_timestamp" DESC); - - ALTER TABLE - "comments" - ADD - CONSTRAINT "comments_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "posts" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION; - - ALTER TABLE - "post_likes" - ADD - CONSTRAINT "post_likes_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "posts" ("id") ON DELETE CASCADE ON UPDATE NO ACTION; - - CREATE TABLE IF NOT EXISTS - "My Table1" (id serial PRIMARY KEY); - - CREATE TABLE - "Another-Table" (id serial PRIMARY KEY); - - CREATE TABLE - IF NOT EXISTS - "Third-Table" (id serial PRIMARY KEY); - - CREATE TABLE - yet_another_table (id serial PRIMARY KEY); - `; - const SIMPLE_REDIS_STREAM = 'test:stream'; const SIMPLE_ACCOUNT_ID = 'morgs.near'; const SIMPLE_FUNCTION_NAME = 'test_indexer'; const SIMPLE_CODE = 'const a = 1;'; + const SIMPLE_SCHEMA = 'create table posts("id" SERIAL NOT NULL PRIMARY KEY);'; + const SIMPLE_INDEXER_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SIMPLE_SCHEMA, LogLevel.INFO); + + const genericMockContextObject = { + graphql: jest.fn().mockResolvedValue({ data: 'mock' }), + set: jest.fn().mockResolvedValue({ data: 'mock' }), + debug: jest.fn().mockResolvedValue(null), + log: jest.fn().mockResolvedValue(null), + warn: jest.fn().mockResolvedValue(null), + error: jest.fn().mockResolvedValue(null), + fetchFromSocialApi: jest.fn().mockResolvedValue({ data: 'mock' }), + db: { + Posts: { + insert: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + select: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + update: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + upsert: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + delete: jest.fn().mockResolvedValue([{ colA: 'valA' }]) + } + }, + } as unknown as ContextObject; - const simpleSchemaConfig: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SIMPLE_SCHEMA, LogLevel.INFO); - const socialSchemaConfig: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SOCIAL_SCHEMA, LogLevel.INFO); - const caseSensitiveConfig: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, CASE_SENSITIVE_SCHEMA, LogLevel.INFO); - const stressTestConfig: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, STRESS_TEST_SCHEMA, LogLevel.INFO); - - const genericDbCredentials: PostgresConnectionParams = { - database: 'test_near', - host: 'postgres', - password: 'test_pass', - port: 5432, - user: 'test_near' - }; - - const genericMockFetch = jest.fn() - .mockResolvedValue({ - status: 200, - json: async () => ({ - data: 'mock', - }), - }) as unknown as typeof fetch; - - const genericMockDmlHandler = { - insert: jest.fn().mockReturnValue([]), - select: jest.fn().mockReturnValue([]), - update: jest.fn().mockReturnValue([]), - upsert: jest.fn().mockReturnValue([]), - delete: jest.fn().mockReturnValue([]), - } as unknown as DmlHandler; + const genericMockContextBuilder = { + buildContext: jest.fn().mockReturnValue(genericMockContextObject), + } as unknown as ContextBuilder; const genericMockIndexerMeta: any = { writeLogs: jest.fn(), @@ -215,18 +47,29 @@ describe('Indexer unit tests', () => { updateBlockHeight: jest.fn().mockResolvedValue(null), } as unknown as IndexerMeta; - const config = { - hasuraEndpoint: 'mock-hasura-endpoint', - hasuraAdminSecret: 'mock-hasura-secret', - }; + test('Indexer.execute() can call context object functions', async () => { + const mockContextObject = { + graphql: jest.fn().mockResolvedValue({ data: 'mock' }), + set: jest.fn().mockResolvedValue({ data: 'mock' }), + debug: jest.fn().mockResolvedValue(null), + log: jest.fn().mockResolvedValue(null), + warn: jest.fn().mockResolvedValue(null), + error: jest.fn().mockResolvedValue(null), + fetchFromSocialApi: jest.fn().mockResolvedValue({ data: 'mock' }), + db: { + Posts: { + insert: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + select: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + update: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + upsert: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + delete: jest.fn().mockResolvedValue([{ colA: 'valA' }]) + } + }, + } as unknown as ContextObject; + const mockContextBuilder = { + buildContext: jest.fn().mockReturnValue(mockContextObject), + } as unknown as ContextBuilder; - test('Indexer.execute() should execute all functions against the current block', async () => { - const mockFetch = jest.fn(() => ({ - status: 200, - json: async () => ({ - errors: null, - }), - })); const blockHeight = 456; const mockBlock = Block.fromStreamerMessage({ block: { @@ -240,7 +83,10 @@ describe('Indexer unit tests', () => { const code = ` const foo = 3; - block.result = context.graphql(\`mutation { set(functionName: "buildnear.testnet/test", key: "height", data: "\${block.blockHeight}")}\`); + await context.graphql('query { hello }'); + await context.log('log'); + await context.fetchFromSocialApi('query { hello }'); + await context.db.Posts.insert({ foo }); `; const indexerMeta = { writeLogs: jest.fn(), @@ -249,619 +95,20 @@ describe('Indexer unit tests', () => { } as unknown as IndexerMeta; const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); const indexer = new Indexer(indexerConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, + contextBuilder: mockContextBuilder, indexerMeta, - }, config); + }); await indexer.execute(mockBlock); - expect(mockFetch.mock.calls).toMatchSnapshot(); + expect(mockContextObject.graphql).toHaveBeenCalledWith('query { hello }'); + expect(mockContextObject.log).toHaveBeenCalledWith('log'); + expect(mockContextObject.fetchFromSocialApi).toHaveBeenCalledWith('query { hello }'); + expect(mockContextObject.db.Posts.insert).toHaveBeenCalledWith({ foo: 3 }); expect(indexerMeta.setStatus).toHaveBeenCalledWith(IndexerStatus.RUNNING); expect(indexerMeta.updateBlockHeight).toHaveBeenCalledWith(blockHeight); }); - test('Indexer.buildContext() allows execution of arbitrary GraphQL operations', async () => { - const mockFetch = jest.fn() - .mockResolvedValueOnce({ - status: 200, - json: async () => ({ - data: { - greet: 'hello' - } - }) - }) - .mockResolvedValueOnce({ - status: 200, - json: async () => ({ - data: { - newGreeting: { - success: true - } - } - }) - }); - const indexer = new Indexer(simpleSchemaConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - - const context = indexer.buildContext(1, []); - - const query = ` - query { - greet() - } - `; - const { greet } = await context.graphql(query) as { greet: string }; - - const mutation = ` - mutation { - newGreeting(greeting: "${greet} morgan") { - success - } - } - `; - const { newGreeting: { success } } = await context.graphql(mutation); - - expect(greet).toEqual('hello'); - expect(success).toEqual(true); - expect(mockFetch.mock.calls[0]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - 'X-Hasura-Role': 'morgs_near', - 'X-Hasura-Admin-Secret': config.hasuraAdminSecret - }, - body: JSON.stringify({ query }) - } - ]); - expect(mockFetch.mock.calls[1]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - 'X-Hasura-Role': 'morgs_near', - 'X-Hasura-Admin-Secret': config.hasuraAdminSecret - }, - body: JSON.stringify({ query: mutation }) - } - ]); - }); - - test('Indexer.buildContext() can fetch from the near social api', async () => { - const mockFetch = jest.fn(); - const indexer = new Indexer(simpleSchemaConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - - const context = indexer.buildContext(1, []); - - await context.fetchFromSocialApi('/index', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - action: 'post', - key: 'main', - options: { - limit: 1, - order: 'desc' - } - }) - }); - - expect(mockFetch.mock.calls).toMatchSnapshot(); - }); - - test('Indexer.buildContext() throws when a GraphQL response contains errors', async () => { - const mockFetch = jest.fn() - .mockResolvedValue({ - json: async () => ({ - errors: ['boom'] - }) - }); - const indexer = new Indexer(simpleSchemaConfig, { fetch: mockFetch as unknown as typeof fetch, dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - const context = indexer.buildContext(1, []); - - await expect(async () => await context.graphql('query { hello }')).rejects.toThrow('boom'); - }); - - test('Indexer.buildContext() handles GraphQL variables', async () => { - const mockFetch = jest.fn() - .mockResolvedValue({ - status: 200, - json: async () => ({ - data: 'mock', - }), - }); - const indexer = new Indexer(simpleSchemaConfig, { fetch: mockFetch as unknown as typeof fetch, dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - const context = indexer.buildContext(1, []); - - const query = 'query($name: String) { hello(name: $name) }'; - const variables = { name: 'morgan' }; - await context.graphql(query, variables); - - expect(mockFetch.mock.calls[0]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - 'X-Hasura-Role': 'morgs_near', - 'X-Hasura-Admin-Secret': config.hasuraAdminSecret - }, - body: JSON.stringify({ - query, - variables, - }), - }, - ]); - }); - - test('GetTableNameToDefinitionNamesMapping works for a variety of input schemas', async () => { - const indexer = new Indexer(stressTestConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }); - - const tableNameToDefinitionNamesMapping = indexer.getTableNameToDefinitionNamesMapping(STRESS_TEST_SCHEMA); - expect([...tableNameToDefinitionNamesMapping.keys()]).toStrictEqual([ - 'creator_quest', - 'composer_quest', - 'contractor - quest', - 'posts', - 'comments', - 'post_likes', - 'My Table1', - 'Another-Table', - 'Third-Table', - 'yet_another_table']); - - // Test that duplicate table names throw an error - const duplicateTableSchema = `CREATE TABLE - "posts" ( - "id" SERIAL NOT NULL - ); - CREATE TABLE posts ( - "id" SERIAL NOT NULL - );`; - expect(() => { - indexer.getTableNameToDefinitionNamesMapping(duplicateTableSchema); - }).toThrow('Table posts already exists in schema. Table names must be unique. Quotes are not allowed as a differentiator between table names.'); - - // Test that schema with no tables throws an error - expect(() => { - indexer.getTableNameToDefinitionNamesMapping(''); - }).toThrow('Schema does not have any tables. There should be at least one table.'); - }); - - test('GetTableNameToDefinitionNamesMapping works for mixed quotes schema', async () => { - const indexer = new Indexer(caseSensitiveConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }); - - const tableNameToDefinitionNamesMapping = indexer.getTableNameToDefinitionNamesMapping(CASE_SENSITIVE_SCHEMA); - const tableNames = [...tableNameToDefinitionNamesMapping.keys()]; - const originalTableNames = tableNames.map((tableName) => tableNameToDefinitionNamesMapping.get(tableName)?.originalTableName); - expect(tableNames).toStrictEqual(['Posts', 'CommentsTable']); - expect(originalTableNames).toStrictEqual(['Posts', '"CommentsTable"']); - - // Spot check quoting for columnNames - const postsColumnNames = tableNameToDefinitionNamesMapping.get('Posts')?.originalColumnNames; - const commentsColumnNames = tableNameToDefinitionNamesMapping.get('CommentsTable')?.originalColumnNames; - expect(postsColumnNames?.get('id')).toStrictEqual('"id"'); - expect(postsColumnNames?.get('AccountId')).toStrictEqual('"AccountId"'); - expect(postsColumnNames?.get('BlockHeight')).toStrictEqual('BlockHeight'); - expect(commentsColumnNames?.get('accountId')).toStrictEqual('"accountId"'); - expect(commentsColumnNames?.get('blockHeight')).toStrictEqual('blockHeight'); - }); - - test('GetSchemaLookup works for mixed quotes schema', async () => { - const indexer = new Indexer(caseSensitiveConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }); - - const schemaLookup = indexer.getTableNameToDefinitionNamesMapping(CASE_SENSITIVE_SCHEMA); - const tableNames = [...schemaLookup.keys()]; - const originalTableNames = tableNames.map((tableName) => schemaLookup.get(tableName)?.originalTableName); - expect(tableNames).toStrictEqual(['Posts', 'CommentsTable']); - expect(originalTableNames).toStrictEqual(['Posts', '"CommentsTable"']); - - // Spot check quoting for columnNames - expect(schemaLookup.get('Posts')?.originalColumnNames.get('id')).toStrictEqual('"id"'); - expect(schemaLookup.get('Posts')?.originalColumnNames.get('AccountId')).toStrictEqual('"AccountId"'); - expect(schemaLookup.get('Posts')?.originalColumnNames.get('BlockHeight')).toStrictEqual('BlockHeight'); - expect(schemaLookup.get('CommentsTable')?.originalColumnNames.get('accountId')).toStrictEqual('"accountId"'); - expect(schemaLookup.get('CommentsTable')?.originalColumnNames.get('blockHeight')).toStrictEqual('blockHeight'); - }); - - test('SanitizeTableName works properly on many test cases', async () => { - const indexer = new Indexer(simpleSchemaConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - expect(indexer.sanitizeTableName('table_name')).toStrictEqual('TableName'); - expect(indexer.sanitizeTableName('tablename')).toStrictEqual('Tablename'); // name is not capitalized - expect(indexer.sanitizeTableName('table name')).toStrictEqual('TableName'); - expect(indexer.sanitizeTableName('table!name!')).toStrictEqual('TableName'); - expect(indexer.sanitizeTableName('123TABle')).toStrictEqual('_123TABle'); // underscore at beginning - expect(indexer.sanitizeTableName('123_tABLE')).toStrictEqual('_123TABLE'); // underscore at beginning, capitalization - expect(indexer.sanitizeTableName('some-table_name')).toStrictEqual('SomeTableName'); - expect(indexer.sanitizeTableName('!@#$%^&*()table@)*&(%#')).toStrictEqual('Table'); // All special characters removed - expect(indexer.sanitizeTableName('T_name')).toStrictEqual('TName'); - expect(indexer.sanitizeTableName('_table')).toStrictEqual('Table'); // Starting underscore was removed - }); - - test('indexer fails to build context.db due to collision on sanitized table names', async () => { - const schemaWithDuplicateSanitizedTableNames = `CREATE TABLE - "test table" ( - "id" SERIAL NOT NULL - ); - CREATE TABLE "test!table" ( - "id" SERIAL NOT NULL - );`; - const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'code', schemaWithDuplicateSanitizedTableNames, LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - // Does not outright throw an error but instead returns an empty object - expect(indexer.buildDatabaseContext(1, [])) - .toStrictEqual({}); - }); - - test('indexer builds context and inserts an objects into existing table', async () => { - const mockDmlHandler: any = { insert: jest.fn().mockReturnValue([{ colA: 'valA' }, { colA: 'valA' }]) }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const objToInsert = [{ - account_id: 'morgs_near', - block_height: 1, - receipt_id: 'abc', - content: 'test', - block_timestamp: 800, - accounts_liked: JSON.stringify(['cwpuzzles.near', 'devbose.near']) - }, - { - account_id: 'morgs_near', - block_height: 2, - receipt_id: 'abc', - content: 'test', - block_timestamp: 801, - accounts_liked: JSON.stringify(['cwpuzzles.near']) - }]; - - const result = await context.db.Posts.insert(objToInsert); - expect(result.length).toEqual(2); - }); - - test('indexer builds context and does simultaneous upserts', async () => { - const mockPgClient = { - query: jest.fn().mockReturnValue({ rows: [] }), - format: jest.fn().mockReturnValue('mock') - } as unknown as PgClient; - const mockDmlHandler: any = new DmlHandler(genericDbCredentials, socialSchemaConfig, mockPgClient); - const upsertSpy = jest.spyOn(mockDmlHandler, 'upsert'); - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - const promises: any[] = []; - - for (let i = 1; i <= 100; i++) { - const promise = context.db.Posts.upsert( - { - account_id: 'morgs_near', - block_height: i, - receipt_id: 'abc', - content: 'test_content', - block_timestamp: 800, - accounts_liked: JSON.stringify(['cwpuzzles.near', 'devbose.near']) - }, - ['account_id', 'block_height'], - ['content', 'block_timestamp'] - ); - promises.push(promise); - } - await Promise.all(promises); - - expect(upsertSpy).toHaveBeenCalledTimes(100); - }); - - test('indexer builds context and selects objects from existing table', async () => { - const selectFn = jest.fn(); - selectFn.mockImplementation((...args) => { - // Expects limit to be last parameter - return args[args.length - 1] === null ? [{ colA: 'valA' }, { colA: 'valA' }] : [{ colA: 'valA' }]; - }); - const mockDmlHandler: any = { select: selectFn }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const objToSelect = { - account_id: 'morgs_near', - receipt_id: 'abc', - }; - const result = await context.db.Posts.select(objToSelect); - expect(result.length).toEqual(2); - const resultLimit = await context.db.Posts.select(objToSelect, 1); - expect(resultLimit.length).toEqual(1); - }); - - test('indexer builds context and updates multiple objects from existing table', async () => { - const mockDmlHandler: any = { - update: jest.fn().mockImplementation((_, whereObj, updateObj) => { - if (whereObj.account_id === 'morgs_near' && updateObj.content === 'test_content') { - return [{ colA: 'valA' }, { colA: 'valA' }]; - } - return [{}]; - }) - }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const whereObj = { - account_id: 'morgs_near', - receipt_id: 'abc', - }; - const updateObj = { - content: 'test_content', - block_timestamp: 805, - }; - const result = await context.db.Posts.update(whereObj, updateObj); - expect(result.length).toEqual(2); - }); - - test('indexer builds context and upserts on existing table', async () => { - const mockDmlHandler: any = { - upsert: jest.fn().mockImplementation((_, objects, conflict, update) => { - if (objects.length === 2 && conflict.includes('account_id') && update.includes('content')) { - return [{ colA: 'valA' }, { colA: 'valA' }]; - } else if (objects.length === 1 && conflict.includes('account_id') && update.includes('content')) { - return [{ colA: 'valA' }]; - } - return [{}]; - }) - }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const objToInsert = [{ - account_id: 'morgs_near', - block_height: 1, - receipt_id: 'abc', - content: 'test', - block_timestamp: 800, - accounts_liked: JSON.stringify(['cwpuzzles.near', 'devbose.near']) - }, - { - account_id: 'morgs_near', - block_height: 2, - receipt_id: 'abc', - content: 'test', - block_timestamp: 801, - accounts_liked: JSON.stringify(['cwpuzzles.near']) - }]; - - let result = await context.db.Posts.upsert(objToInsert, ['account_id', 'block_height'], ['content', 'block_timestamp']); - expect(result.length).toEqual(2); - result = await context.db.Posts.upsert(objToInsert[0], ['account_id', 'block_height'], ['content', 'block_timestamp']); - expect(result.length).toEqual(1); - }); - - test('indexer builds context and deletes objects from existing table', async () => { - const mockDmlHandler: any = { delete: jest.fn().mockReturnValue([{ colA: 'valA' }, { colA: 'valA' }]) }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const deleteFilter = { - account_id: 'morgs_near', - receipt_id: 'abc', - }; - const result = await context.db.Posts.delete(deleteFilter); - expect(result.length).toEqual(2); - }); - - test('indexer builds context and verifies all methods generated', async () => { - const indexer = new Indexer(stressTestConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - expect(Object.keys(context.db)).toStrictEqual([ - 'CreatorQuest', - 'ComposerQuest', - 'ContractorQuest', - 'Posts', - 'Comments', - 'PostLikes', - 'MyTable1', - 'AnotherTable', - 'ThirdTable', - 'YetAnotherTable']); - expect(Object.keys(context.db.CreatorQuest)).toStrictEqual([ - 'insert', - 'select', - 'update', - 'upsert', - 'delete']); - expect(Object.keys(context.db.PostLikes)).toStrictEqual([ - 'insert', - 'select', - 'update', - 'upsert', - 'delete']); - expect(Object.keys(context.db.MyTable1)).toStrictEqual([ - 'insert', - 'select', - 'update', - 'upsert', - 'delete']); - }); - - test('indexer builds context and returns empty array if failed to generate db methods', async () => { - const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'code', '', LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - expect(Object.keys(context.db)).toStrictEqual([]); - }); - - test('Indexer.execute() allows imperative execution of GraphQL operations', async () => { - const postId = 1; - const commentId = 2; - const blockHeight = 82699904; - const mockFetch = jest.fn() - .mockReturnValueOnce({ // "running function on ..." log - status: 200, - json: async () => ({ - data: { - indexer_log_store: [ - { - id: '12345', - }, - ], - }, - }), - }) - .mockReturnValueOnce({ // set status - status: 200, - json: async () => ({ - errors: null, - }), - }) - .mockReturnValueOnce({ // query - status: 200, - json: async () => ({ - data: { - posts: [ - { - id: postId, - }, - ], - }, - }), - }) - .mockReturnValueOnce({ // mutation - status: 200, - json: async () => ({ - data: { - insert_comments: { - returning: { - id: commentId, - }, - }, - }, - }), - }) - .mockReturnValueOnce({ - status: 200, - json: async () => ({ - errors: null, - }), - }); - - const mockBlock = Block.fromStreamerMessage({ - block: { - chunks: [0], - header: { - height: blockHeight - } - }, - shards: {} - } as unknown as StreamerMessage) as unknown as Block; - - const code = ` - const { posts } = await context.graphql(\` - query { - posts(where: { id: { _eq: 1 } }) { - id - } - } - \`); - - if (!posts || posts.length === 0) { - return; - } - - const [post] = posts; - - const { insert_comments: { returning: { id } } } = await context.graphql(\` - mutation { - insert_comments( - objects: {account_id: "morgs.near", block_height: \${block.blockHeight}, content: "cool post", post_id: \${post.id}} - ) { - returning { - id - } - } - } - \`); - - return (\`Created comment \${id} on post \${post.id}\`) - `; - const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta - }, config); - - await indexer.execute(mockBlock); - - expect(mockFetch.mock.calls).toMatchSnapshot(); - }); - - test('Indexer.execute() console.logs', async () => { - const logs: string[] = []; - const context = { - log: (...m: string[]) => { - logs.push(...m); - } - }; - const vm = new VM(); - vm.freeze(context, 'context'); - vm.freeze(context, 'console'); - await vm.run('console.log("hello", "brave new"); context.log("world")'); - expect(logs).toEqual(['hello', 'brave new', 'world']); - }); - test('Errors thrown in VM can be caught outside the VM', async () => { const vm = new VM(); expect(() => { @@ -870,12 +117,6 @@ describe('Indexer unit tests', () => { }); test('Indexer.execute() catches errors', async () => { - const mockFetch = jest.fn(() => ({ - status: 200, - json: async () => ({ - errors: null, - }), - })); const blockHeight = 456; const mockBlock = Block.fromStreamerMessage({ block: { @@ -896,57 +137,16 @@ describe('Indexer unit tests', () => { } as unknown as IndexerMeta; const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); const indexer = new Indexer(indexerConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, + contextBuilder: genericMockContextBuilder, indexerMeta, - }, config); + }); await expect(indexer.execute(mockBlock)).rejects.toThrow(new Error('Execution error: boom')); - expect(mockFetch.mock.calls).toMatchSnapshot(); expect(indexerMeta.setStatus).toHaveBeenNthCalledWith(1, IndexerStatus.RUNNING); expect(indexerMeta.setStatus).toHaveBeenNthCalledWith(2, IndexerStatus.FAILING); expect(indexerMeta.updateBlockHeight).not.toHaveBeenCalled(); }); - test('Indexer.execute() supplies the required role to the GraphQL endpoint', async () => { - const blockHeight = 82699904; - const mockFetch = jest.fn(() => ({ - status: 200, - json: async () => ({ - errors: null, - }), - })); - const mockBlock = Block.fromStreamerMessage({ - block: { - chunks: [0], - header: { - height: blockHeight - } - }, - shards: {} - } as unknown as StreamerMessage) as unknown as Block; - const indexerMeta = { - writeLogs: jest.fn(), - setStatus: jest.fn(), - updateBlockHeight: jest.fn().mockResolvedValue(null) - } as unknown as IndexerMeta; - const code = ` - context.graphql(\`mutation { set(functionName: "buildnear.testnet/test", key: "height", data: "\${block.blockHeight}")}\`); - `; - const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'morgs.near', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta, - }, config); - - await indexer.execute(mockBlock); - - expect(indexerMeta.setStatus).toHaveBeenNthCalledWith(1, IndexerStatus.RUNNING); - expect(mockFetch.mock.calls).toMatchSnapshot(); - expect(indexerMeta.updateBlockHeight).toHaveBeenCalledWith(blockHeight); - }); - test('Indexer passes all relevant logs to writeLogs', async () => { const mockDebugIndexerMeta = { writeLogs: jest.fn(), @@ -987,33 +187,28 @@ describe('Indexer unit tests', () => { const infoIndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); const errorIndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.ERROR); const mockDmlHandler: DmlHandler = { select: jest.fn() } as unknown as DmlHandler; + const partialMockContextBuilder: ContextBuilder = new ContextBuilder(SIMPLE_INDEXER_CONFIG, { dmlHandler: mockDmlHandler }); const indexerDebug = new Indexer( debugIndexerConfig, { - fetch: jest.fn() as unknown as typeof fetch, - dmlHandler: mockDmlHandler, + contextBuilder: partialMockContextBuilder, indexerMeta: mockDebugIndexerMeta as unknown as IndexerMeta }, - config ); const indexerInfo = new Indexer( infoIndexerConfig, { - fetch: jest.fn() as unknown as typeof fetch, - dmlHandler: mockDmlHandler, + contextBuilder: partialMockContextBuilder, indexerMeta: mockInfoIndexerMeta as unknown as IndexerMeta }, - config ); const indexerError = new Indexer( errorIndexerConfig, { - fetch: jest.fn() as unknown as typeof fetch, - dmlHandler: mockDmlHandler, + contextBuilder: partialMockContextBuilder, indexerMeta: mockErrorIndexerMeta as unknown as IndexerMeta }, - config ); await indexerDebug.execute(mockBlock); @@ -1036,49 +231,7 @@ describe('Indexer unit tests', () => { expect(mockErrorIndexerMeta.updateBlockHeight).toHaveBeenCalledWith(blockHeight); }); - test('attaches the backend only header to requests to hasura', async () => { - const mockFetch = jest.fn() - .mockResolvedValueOnce({ - status: 200, - json: async () => ({ - data: {} - }) - }); - const indexer = new Indexer(simpleSchemaConfig, { fetch: mockFetch as unknown as typeof fetch, dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - const context = indexer.buildContext(1, []); - - const mutation = ` - mutation { - newGreeting(greeting: "howdy") { - success - } - } - `; - - await context.graphql(mutation); - - expect(mockFetch.mock.calls[0]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - 'X-Hasura-Role': simpleSchemaConfig.hasuraRoleName(), - 'X-Hasura-Admin-Secret': config.hasuraAdminSecret - }, - body: JSON.stringify({ query: mutation }) - } - ]); - }); - it('call writeLogs method at the end of execution with correct and all logs are present', async () => { - const mockFetchDebug = jest.fn(() => ({ - status: 200, - json: async () => ({ - errors: null, - }), - })); const blockHeight = 456; const mockBlock = Block.fromStreamerMessage({ block: { @@ -1108,52 +261,20 @@ describe('Indexer unit tests', () => { const debugIndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.DEBUG); const mockDmlHandler: DmlHandler = { select: jest.fn() } as unknown as DmlHandler; + const partialMockContextBuilder: ContextBuilder = new ContextBuilder(debugIndexerConfig, { dmlHandler: mockDmlHandler }); const indexerDebug = new Indexer( debugIndexerConfig, - { fetch: mockFetchDebug as unknown as typeof fetch, dmlHandler: mockDmlHandler, indexerMeta }, - config + { contextBuilder: partialMockContextBuilder, indexerMeta }, ); await indexerDebug.execute(mockBlock); expect(indexerMeta.writeLogs).toHaveBeenCalledTimes(1); expect(indexerMeta.writeLogs.mock.calls[0][0]).toHaveLength(5); }); - test('does not attach the hasura admin secret header when no role specified', async () => { - const mockFetch = jest.fn() - .mockResolvedValueOnce({ - status: 200, - json: async () => ({ - data: {} - }) - }); - const indexer = new Indexer(simpleSchemaConfig, { fetch: mockFetch as unknown as typeof fetch, dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - const mutation = ` - mutation { - newGreeting(greeting: "howdy") { - success - } - } - `; - - await indexer.runGraphQLQuery(mutation, null, 0, null); - - expect(mockFetch.mock.calls[0]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - }, - body: JSON.stringify({ query: mutation }) - } - ]); - }); test('transformedCode applies the correct transformations', () => { const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'console.log(\'hello\')', SIMPLE_SCHEMA, LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); + const indexer = new Indexer(indexerConfig, { contextBuilder: genericMockContextBuilder, indexerMeta: genericMockIndexerMeta }); const transformedFunction = indexer.transformIndexerFunction(); expect(transformedFunction).toEqual(` diff --git a/runner/src/indexer/indexer.ts b/runner/src/indexer/indexer.ts index 3e1891b10..f4f24fce3 100644 --- a/runner/src/indexer/indexer.ts +++ b/runner/src/indexer/indexer.ts @@ -1,4 +1,3 @@ -import fetch, { type Response } from 'node-fetch'; import { VM } from 'vm2'; import * as lakePrimitives from '@near-lake/primitives'; import { Parser } from 'node-sql-parser'; @@ -9,65 +8,36 @@ import logger from '../logger'; import LogEntry from '../indexer-meta/log-entry'; import type IndexerConfig from '../indexer-config'; import { IndexerStatus } from '../indexer-meta'; -import { wrapSpan } from '../utility'; import { type IndexerMetaInterface } from '../indexer-meta/indexer-meta'; -import { type DmlHandlerInterface } from '../dml-handler/dml-handler'; -import assert from 'assert'; +import type ContextBuilder from './context-builder'; interface Dependencies { - fetch?: typeof fetch - dmlHandler: DmlHandlerInterface + contextBuilder: ContextBuilder indexerMeta: IndexerMetaInterface parser?: Parser }; -interface Context { - graphql: (operation: string, variables?: Record) => Promise - set: (key: string, value: any) => Promise - debug: (message: string) => void - log: (message: string) => void - warn: (message: string) => void - error: (message: string) => void - fetchFromSocialApi: (path: string, options?: any) => Promise - db: Record any>> -} - export interface TableDefinitionNames { tableName: string originalTableName: string originalColumnNames: Map } -interface Config { - hasuraAdminSecret: string - hasuraEndpoint: string - -} - -const defaultConfig: Config = { - hasuraAdminSecret: process.env.HASURA_ADMIN_SECRET ?? '', - hasuraEndpoint: process.env.HASURA_ENDPOINT ?? '', -}; - export default class Indexer { - DEFAULT_HASURA_ROLE: string; IS_FIRST_EXECUTION: boolean = true; tracer = trace.getTracer('queryapi-runner-indexer'); private readonly logger: typeof logger; - private readonly deps: Required; + readonly deps: Required; private currentStatus?: string; constructor ( private readonly indexerConfig: IndexerConfig, deps: Dependencies, - private readonly config: Config = defaultConfig, ) { this.logger = logger.child({ accountId: indexerConfig.accountId, functionName: indexerConfig.functionName, service: this.constructor.name }); - this.DEFAULT_HASURA_ROLE = 'append'; this.deps = { - fetch, parser: new Parser(), ...deps }; @@ -94,7 +64,7 @@ export default class Indexer { this.logger.error('Failed to set status to RUNNING', e); })); const vm = new VM({ allowAsync: true }); - const context = this.buildContext(blockHeight, logEntries); + const context = this.deps.contextBuilder.buildContext(blockHeight, logEntries); vm.freeze(block, 'block'); vm.freeze(lakePrimitives, 'primitives'); @@ -133,194 +103,6 @@ export default class Indexer { } } - buildContext (blockHeight: number, logEntries: LogEntry[]): Context { - return { - graphql: async (operation, variables) => { - return await wrapSpan(async () => { - return await this.runGraphQLQuery(operation, variables, blockHeight, this.indexerConfig.hasuraRoleName()); - }, this.tracer, `Call graphql ${operation.includes('mutation') ? 'mutation' : 'query'} through Hasura`); - }, - set: async (key, value) => { - const mutation = ` - mutation SetKeyValue($function_name: String!, $key: String!, $value: String!) { - insert_${this.indexerConfig.hasuraRoleName()}_${this.indexerConfig.hasuraFunctionName()}_indexer_storage_one(object: {function_name: $function_name, key_name: $key, value: $value} on_conflict: {constraint: indexer_storage_pkey, update_columns: value}) {key_name} - }`; - const variables = { - function_name: this.indexerConfig.fullName(), - key, - value: value ? JSON.stringify(value) : null - }; - return await wrapSpan(async () => { - return await this.runGraphQLQuery(mutation, variables, blockHeight, this.indexerConfig.hasuraRoleName()); - }, this.tracer, 'call insert mutation through Hasura'); - }, - debug: (...log) => { - const debugLogEntry = LogEntry.userDebug(log.join(' : '), blockHeight); - logEntries.push(debugLogEntry); - }, - log: (...log) => { - const infoLogEntry = LogEntry.userInfo(log.join(' : '), blockHeight); - logEntries.push(infoLogEntry); - }, - warn: (...log) => { - const warnLogEntry = LogEntry.userWarn(log.join(' : '), blockHeight); - logEntries.push(warnLogEntry); - }, - error: (...log) => { - const errorLogEntry = LogEntry.userError(log.join(' : '), blockHeight); - logEntries.push(errorLogEntry); - }, - fetchFromSocialApi: async (path, options) => { - return await this.deps.fetch(`https://api.near.social${path}`, options); - }, - db: this.buildDatabaseContext(blockHeight, logEntries) - }; - } - - private getColumnDefinitionNames (columnDefs: any[]): Map { - const columnDefinitionNames = new Map(); - for (const columnDef of columnDefs) { - if (columnDef.column?.type === 'column_ref') { - const columnNameDef = columnDef.column.column.expr; - const actualColumnName = columnNameDef.type === 'double_quote_string' ? `"${columnNameDef.value as string}"` : columnNameDef.value; - columnDefinitionNames.set(columnNameDef.value, actualColumnName); - } - } - return columnDefinitionNames; - } - - private retainOriginalQuoting (schema: string, tableName: string): string { - const createTableQuotedRegex = `\\b(create|CREATE)\\s+(table|TABLE)\\s+"${tableName}"\\s*`; - - if (schema.match(new RegExp(createTableQuotedRegex, 'i'))) { - return `"${tableName}"`; - } - - return tableName; - } - - getTableNameToDefinitionNamesMapping (schema: string): Map { - let schemaSyntaxTree = this.deps.parser.astify(schema, { database: 'Postgresql' }); - schemaSyntaxTree = Array.isArray(schemaSyntaxTree) ? schemaSyntaxTree : [schemaSyntaxTree]; // Ensure iterable - const tableNameToDefinitionNamesMap = new Map(); - - for (const statement of schemaSyntaxTree) { - if (statement.type === 'create' && statement.keyword === 'table' && statement.table !== undefined) { - const tableName: string = statement.table[0].table; - - if (tableNameToDefinitionNamesMap.has(tableName)) { - throw new Error(`Table ${tableName} already exists in schema. Table names must be unique. Quotes are not allowed as a differentiator between table names.`); - } - - const createDefs = statement.create_definitions ?? []; - for (const columnDef of createDefs) { - if (columnDef.column?.type === 'column_ref') { - const tableDefinitionNames: TableDefinitionNames = { - tableName, - originalTableName: this.retainOriginalQuoting(schema, tableName), - originalColumnNames: this.getColumnDefinitionNames(createDefs) - }; - tableNameToDefinitionNamesMap.set(tableName, tableDefinitionNames); - } - } - } - } - - if (tableNameToDefinitionNamesMap.size === 0) { - throw new Error('Schema does not have any tables. There should be at least one table.'); - } - - return tableNameToDefinitionNamesMap; - } - - sanitizeTableName (tableName: string): string { - // Convert to PascalCase - let pascalCaseTableName = tableName - // Replace special characters with underscores - .replace(/[^a-zA-Z0-9_]/g, '_') - // Makes first letter and any letters following an underscore upper case - .replace(/^([a-zA-Z])|_([a-zA-Z])/g, (match: string) => match.toUpperCase()) - // Removes all underscores - .replace(/_/g, ''); - - // Add underscore if first character is a number - if (/^[0-9]/.test(pascalCaseTableName)) { - pascalCaseTableName = '_' + pascalCaseTableName; - } - - return pascalCaseTableName; - } - - buildDatabaseContext ( - blockHeight: number, - logEntries: LogEntry[], - ): Record any>> { - try { - const tableNameToDefinitionNamesMapping = this.getTableNameToDefinitionNamesMapping(this.indexerConfig.schema); - const tableNames = Array.from(tableNameToDefinitionNamesMapping.keys()); - const sanitizedTableNames = new Set(); - const dmlHandler: DmlHandlerInterface = this.deps.dmlHandler; - - // Generate and collect methods for each table name - const result = tableNames.reduce((prev, tableName) => { - // Generate sanitized table name and ensure no conflict - const sanitizedTableName = this.sanitizeTableName(tableName); - const tableDefinitionNames: TableDefinitionNames = tableNameToDefinitionNamesMapping.get(tableName) as TableDefinitionNames; - if (sanitizedTableNames.has(sanitizedTableName)) { - throw new Error(`Table ${tableName} has the same sanitized name as another table. Special characters are removed to generate context.db methods. Please rename the table.`); - } else { - sanitizedTableNames.add(sanitizedTableName); - } - - // Generate context.db methods for table - const funcForTable = { - [`${sanitizedTableName}`]: { - insert: async (objectsToInsert: any) => { - const insertLogEntry = LogEntry.userDebug(`Inserting object ${JSON.stringify(objectsToInsert)} into table ${tableName}`, blockHeight); - logEntries.push(insertLogEntry); - - return await dmlHandler.insert(tableDefinitionNames, Array.isArray(objectsToInsert) ? objectsToInsert : [objectsToInsert]); - }, - select: async (filterObj: any, limit = null) => { - const selectLogEntry = LogEntry.userDebug(`Selecting objects in table ${tableName} with values ${JSON.stringify(filterObj)} with ${limit === null ? 'no' : limit} limit`, blockHeight); - logEntries.push(selectLogEntry); - - return await dmlHandler.select(tableDefinitionNames, filterObj, limit); - }, - update: async (filterObj: any, updateObj: any) => { - const updateLogEntry = LogEntry.userDebug(`Updating objects in table ${tableName} that match ${JSON.stringify(filterObj)} with values ${JSON.stringify(updateObj)}`, blockHeight); - logEntries.push(updateLogEntry); - - return await dmlHandler.update(tableDefinitionNames, filterObj, updateObj); - }, - upsert: async (objectsToInsert: any, conflictColumns: string[], updateColumns: string[]) => { - const upsertLogEntry = LogEntry.userDebug(`Inserting objects into table ${tableName} with values ${JSON.stringify(objectsToInsert)}. Conflict on columns ${conflictColumns.join(', ')} will update values in columns ${updateColumns.join(', ')}`, blockHeight); - logEntries.push(upsertLogEntry); - - return await dmlHandler.upsert(tableDefinitionNames, Array.isArray(objectsToInsert) ? objectsToInsert : [objectsToInsert], conflictColumns, updateColumns); - }, - delete: async (filterObj: any) => { - const deleteLogEntry = LogEntry.userDebug(`Deleting objects from table ${tableName} with values ${JSON.stringify(filterObj)}`, blockHeight); - logEntries.push(deleteLogEntry); - - return await dmlHandler.delete(tableDefinitionNames, filterObj); - } - } - }; - return { - ...prev, - ...funcForTable - }; - }, {}); - return result; - } catch (error) { - if (this.IS_FIRST_EXECUTION) { - this.logger.warn('Caught error when generating context.db methods', error); - } - } - return {}; // Default to empty object if error - } - async setStatus (status: IndexerStatus): Promise { if (this.currentStatus === status) { return; @@ -332,47 +114,6 @@ export default class Indexer { await this.deps.indexerMeta?.setStatus(status); } - async runGraphQLQuery (operation: string, variables: any, blockHeight: number, hasuraRoleName: string | null, logError: boolean = true): Promise { - assert(this.config.hasuraAdminSecret !== '' && this.config.hasuraEndpoint !== '', 'hasuraAdminSecret and hasuraEndpoint env variables are required'); - const response: Response = await this.deps.fetch(`${this.config.hasuraEndpoint}/v1/graphql`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - ...(hasuraRoleName && { - 'X-Hasura-Role': hasuraRoleName, - 'X-Hasura-Admin-Secret': this.config.hasuraAdminSecret, - }), - }, - body: JSON.stringify({ - query: operation, - ...(variables && { variables }), - }), - }); - - const { data, errors } = await response.json(); - - if (response.status !== 200 || errors) { - if (logError) { - const message: string = errors ? errors.map((e: any) => e.message).join(', ') : `HTTP ${response.status} error writing with graphql to indexer storage`; - const mutation: string = - `mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){ - insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) { - id - } - }`; - try { - await this.runGraphQLQuery(mutation, { function_name: this.indexerConfig.fullName(), block_height: blockHeight, message }, blockHeight, this.DEFAULT_HASURA_ROLE, false); - } catch (e) { - this.logger.error('Error writing log of graphql error', e); - } - } - throw new Error(`Failed to write graphql, http status: ${response.status}, errors: ${JSON.stringify(errors, null, 2)}`); - } - - return data; - } - private enableAwaitTransform (code: string): string { return ` async function f(){ diff --git a/runner/src/local-indexer/local-indexer.ts b/runner/src/indexer/local-indexer.ts similarity index 70% rename from runner/src/local-indexer/local-indexer.ts rename to runner/src/indexer/local-indexer.ts index d84dfebaf..9baeaa145 100644 --- a/runner/src/local-indexer/local-indexer.ts +++ b/runner/src/indexer/local-indexer.ts @@ -1,8 +1,9 @@ -import InMemoryDmlHandler from '../dml-handler/in-memory-dml-handler'; +import ContextBuilder, { type ContextObject } from './context-builder'; +import InMemoryDmlHandler from './dml-handler/in-memory-dml-handler'; import IndexerConfig from '../indexer-config'; -import { type LocalIndexerConfig } from '../indexer-config/indexer-config'; +import { type LocalIndexerConfig } from '../indexer-config'; import NoOpIndexerMeta from '../indexer-meta/no-op-indexer-meta'; -import Indexer from '../indexer/indexer'; +import Indexer from './indexer'; import LakeClient from '../lake-client/lake-client'; export default class LocalIndexer { @@ -20,11 +21,16 @@ export default class LocalIndexer { logLevel: config.logLevel, }); const dmlHandler = new InMemoryDmlHandler(config.schema); + const contextBuilder = new ContextBuilder(fullIndexerConfig, { dmlHandler }); const indexerMeta = new NoOpIndexerMeta(config); - this.indexer = new Indexer(fullIndexerConfig, { indexerMeta, dmlHandler }); + this.indexer = new Indexer(fullIndexerConfig, { indexerMeta, contextBuilder }); this.lakeClient = new LakeClient(); } + getContext (): ContextObject { + return this.indexer.deps.contextBuilder.buildContext(0, []); + } + async executeOnBlock (blockHeight: number): Promise { // TODO: Cache Block data locally const block = await this.lakeClient.fetchBlock(blockHeight); diff --git a/runner/src/local-indexer/index.ts b/runner/src/local-indexer/index.ts deleted file mode 100644 index b05461694..000000000 --- a/runner/src/local-indexer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './local-indexer'; diff --git a/runner/src/stream-handler/worker.ts b/runner/src/stream-handler/worker.ts index 1403d6605..3ca3e5c9f 100644 --- a/runner/src/stream-handler/worker.ts +++ b/runner/src/stream-handler/worker.ts @@ -3,7 +3,7 @@ import { trace, type Span, context } from '@opentelemetry/api'; import promClient from 'prom-client'; import { Block } from '@near-lake/primitives'; -import Indexer from '../indexer'; +import { Indexer } from '../indexer'; import RedisClient from '../redis-client'; import { METRICS } from '../metrics'; import LakeClient from '../lake-client'; @@ -14,7 +14,8 @@ import IndexerConfig from '../indexer-config'; import parentLogger from '../logger'; import { wrapSpan } from '../utility'; import { type PostgresConnectionParams } from '../pg-client'; -import DmlHandler from '../dml-handler/dml-handler'; +import { DmlHandler } from '../indexer/dml-handler'; +import ContextBuilder from '../indexer/context-builder'; if (isMainThread) { throw new Error('Worker should not be run on main thread'); @@ -102,8 +103,9 @@ async function blockQueueConsumer (workerContext: WorkerContext): Promise const indexerConfig: IndexerConfig = workerContext.indexerConfig; const dmlHandler: DmlHandler = new DmlHandler(workerContext.databaseConnectionParams, indexerConfig); + const contextBuilder: ContextBuilder = new ContextBuilder(indexerConfig, { dmlHandler }); const indexerMeta: IndexerMeta = new IndexerMeta(indexerConfig, workerContext.databaseConnectionParams); - const indexer = new Indexer(indexerConfig, { dmlHandler, indexerMeta }); + const indexer = new Indexer(indexerConfig, { contextBuilder, indexerMeta }); let streamMessageId = ''; let currBlockHeight = 0; diff --git a/runner/tests/integration.test.ts b/runner/tests/integration.test.ts index 7b2112b00..1fd71d9c2 100644 --- a/runner/tests/integration.test.ts +++ b/runner/tests/integration.test.ts @@ -2,7 +2,7 @@ import { Block, type StreamerMessage } from '@near-lake/primitives'; import { Network, type StartedNetwork } from 'testcontainers'; import { gql, GraphQLClient } from 'graphql-request'; -import Indexer from '../src/indexer'; +import { Indexer } from '../src/indexer'; import HasuraClient from '../src/hasura-client'; import Provisioner from '../src/provisioner'; import PgClient from '../src/pg-client'; @@ -14,7 +14,8 @@ import block_115185109 from './blocks/00115185109/streamer_message.json'; import { LogLevel } from '../src/indexer-meta/log-entry'; import IndexerConfig from '../src/indexer-config'; import IndexerMeta from '../src/indexer-meta/indexer-meta'; -import DmlHandler from '../src/dml-handler/dml-handler'; +import { DmlHandler } from '../src/indexer/dml-handler'; +import ContextBuilder from '../src/indexer/context-builder'; describe('Indexer integration', () => { jest.setTimeout(300_000); @@ -271,27 +272,30 @@ describe('Indexer integration', () => { }); }); -async function prepareIndexer(indexerConfig: IndexerConfig, provisioner: Provisioner, hasuraContainer: StartedHasuraGraphQLContainer): Promise { +async function prepareIndexer (indexerConfig: IndexerConfig, provisioner: Provisioner, hasuraContainer: StartedHasuraGraphQLContainer): Promise { await provisioner.provisionUserApi(indexerConfig); - const db_connection_params = await provisioner.getPostgresConnectionParameters(indexerConfig.userName()); - const dmlHandler = new DmlHandler(db_connection_params, indexerConfig); - const indexerMeta = new IndexerMeta(indexerConfig, db_connection_params); + const dbConnectionParams = await provisioner.getPostgresConnectionParameters(indexerConfig.userName()); + const dmlHandler = new DmlHandler(dbConnectionParams, indexerConfig); + const contextBuilder = new ContextBuilder( + indexerConfig, + { dmlHandler }, + { + hasuraAdminSecret: hasuraContainer.getAdminSecret(), + hasuraEndpoint: hasuraContainer.getEndpoint(), + }); + const indexerMeta = new IndexerMeta(indexerConfig, dbConnectionParams); return new Indexer( indexerConfig, { - dmlHandler, + contextBuilder, indexerMeta, - }, - { - hasuraAdminSecret: hasuraContainer.getAdminSecret(), - hasuraEndpoint: hasuraContainer.getEndpoint(), } ); } -async function indexerLogsQuery(indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { +async function indexerLogsQuery (indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { const graphqlResult: any = await graphqlClient.request(gql` query { ${indexerSchemaName}_sys_logs { @@ -302,15 +306,15 @@ async function indexerLogsQuery(indexerSchemaName: string, graphqlClient: GraphQ return graphqlResult[`${indexerSchemaName}_sys_logs`]; } -async function indexerStatusQuery(indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { +async function indexerStatusQuery (indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { return await indexerMetadataQuery(indexerSchemaName, 'STATUS', graphqlClient); } -async function indexerBlockHeightQuery(indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { +async function indexerBlockHeightQuery (indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { return await indexerMetadataQuery(indexerSchemaName, 'LAST_PROCESSED_BLOCK_HEIGHT', graphqlClient); } -async function indexerMetadataQuery(indexerSchemaName: string, attribute: string, graphqlClient: GraphQLClient): Promise { +async function indexerMetadataQuery (indexerSchemaName: string, attribute: string, graphqlClient: GraphQLClient): Promise { const graphqlResult: any = await graphqlClient.request(gql` query { ${indexerSchemaName}_sys_metadata(where: {attribute: {_eq: "${attribute}"}}) { From 5e30e6148628c08f20ce6e734b50ce0006ba3138 Mon Sep 17 00:00:00 2001 From: Kevin Zhang <42101107+Kevin101Zhang@users.noreply.github.com> Date: Thu, 8 Aug 2024 20:51:03 -0400 Subject: [PATCH 06/17] feat: wrap generated wizard code with header code (#997) wizard code is wrapped with default header --- .../Editor/EditorComponents/Editor.tsx | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/frontend/src/components/Editor/EditorComponents/Editor.tsx b/frontend/src/components/Editor/EditorComponents/Editor.tsx index 6247e04cb..1ca0de9c9 100644 --- a/frontend/src/components/Editor/EditorComponents/Editor.tsx +++ b/frontend/src/components/Editor/EditorComponents/Editor.tsx @@ -15,7 +15,14 @@ import { } from '@/constants/Strings'; import { IndexerDetailsContext } from '@/contexts/IndexerDetailsContext'; import { useModal } from '@/contexts/ModalContext'; -import { defaultCode, defaultSchema, defaultSchemaTypes, formatIndexingCode, formatSQL } from '@/utils/formatters'; +import { + defaultCode, + defaultSchema, + defaultSchemaTypes, + formatIndexingCode, + formatSQL, + wrapCode, +} from '@/utils/formatters'; import { getLatestBlockHeight } from '@/utils/getLatestBlockHeight'; import IndexerRunner from '@/utils/indexerRunner'; import { PgSchemaTypeGen } from '@/utils/pgSchemaTypeGen'; @@ -141,25 +148,23 @@ const Editor: React.FC = (): ReactElement => { }; useEffect(() => { - const fetchData = async () => { + (async () => { try { - const response = await fetchWizardData(''); - const { wizardContractFilter, wizardMethods, wizardEvents } = response; + const { wizardContractFilter, wizardMethods, wizardEvents } = await fetchWizardData(''); - if (wizardContractFilter === 'noFilter') { - return; - } + if (wizardContractFilter === 'noFilter') return; + + const { jsCode, sqlCode } = await generateCode(wizardContractFilter, wizardMethods, wizardEvents); + const wrappedIndexingCode = wrapCode(jsCode) ? wrapCode(jsCode) : jsCode; + const { validatedCode, validatedSchema } = reformatAll(wrappedIndexingCode, sqlCode); - const codeResponse = await generateCode(wizardContractFilter, wizardMethods, wizardEvents); - const { validatedCode, validatedSchema } = reformatAll(codeResponse.jsCode, codeResponse.sqlCode); validatedCode && setIndexingCode(validatedCode); validatedSchema && setSchema(validatedSchema); } catch (error: unknown) { //todo: figure out best course of action for user if api fails console.error(error); } - }; - fetchData(); + })(); }, []); useEffect(() => { From 44bc2ebd6e4afa187419757f2c8df6c9ef77cb93 Mon Sep 17 00:00:00 2001 From: Morgan McCauley Date: Fri, 9 Aug 2024 14:12:14 +1200 Subject: [PATCH 07/17] feat: Surface provisioning failures to user (#1002) This PR updates provisioning such that user-related errors are written to the user-owned logs table, allowing them to debug issues with their schema. Logging to the user table is tricky, since this table is created _during_ the provisioning step itself. Therefore, I have split provisioning in to two phases: 1. System Resources - Setups up system related entities: database, schema, logs table/jobs etc. 2. User Resources - Applies user schema, configures Hasura etc. This separation allows us to isolate the tasks which are likely to fail due to user error, and therefore only surface errors which are relevant. The creation of the logs table _should always succeed_, if it doesn't there is something wrong with the system, i.e. some form of bug has been introduced. Errors thrown during the System portion of provisioning will be error logged to the machine, and I will tune the existing alert so that we are notified of these errors. Additionally, I have converted all non-critical error logs to warnings, so that we don't get alerted on non-issues. closes: #901 --- runner/src/indexer-config/indexer-config.ts | 5 +- runner/src/indexer-meta/indexer-meta.ts | 6 +- runner/src/provisioner/provisioner.test.ts | 8 +- runner/src/provisioner/provisioner.ts | 103 +++++++++++++----- .../services/data-layer/data-layer-service.ts | 8 +- .../server/services/runner/runner-service.ts | 2 +- runner/src/stream-handler/stream-handler.ts | 4 +- runner/src/stream-handler/worker.ts | 2 +- runner/tests/integration.test.ts | 17 +++ 9 files changed, 111 insertions(+), 44 deletions(-) diff --git a/runner/src/indexer-config/indexer-config.ts b/runner/src/indexer-config/indexer-config.ts index f975f4845..04b4b136f 100644 --- a/runner/src/indexer-config/indexer-config.ts +++ b/runner/src/indexer-config/indexer-config.ts @@ -17,7 +17,8 @@ export class ProvisioningConfig extends BaseConfig { constructor ( public readonly accountId: string, public readonly functionName: string, - public readonly schema: string + public readonly schema: string, + public readonly logLevel: LogLevel = LogLevel.INFO ) { super(accountId, functionName); } @@ -101,7 +102,7 @@ export default class IndexerConfig extends ProvisioningConfig { public readonly schema: string, public readonly logLevel: LogLevel ) { - super(accountId, functionName, schema); + super(accountId, functionName, schema, logLevel); const hash = crypto.createHash('sha256'); hash.update(`${accountId}/${functionName}`); this.executorId = hash.digest('hex'); diff --git a/runner/src/indexer-meta/indexer-meta.ts b/runner/src/indexer-meta/indexer-meta.ts index f0da10b98..d09b41390 100644 --- a/runner/src/indexer-meta/indexer-meta.ts +++ b/runner/src/indexer-meta/indexer-meta.ts @@ -4,7 +4,7 @@ import PgClient, { type PostgresConnectionParams } from '../pg-client'; import { trace } from '@opentelemetry/api'; import type LogEntry from './log-entry'; import { LogLevel } from './log-entry'; -import type IndexerConfig from '../indexer-config'; +import { type ProvisioningConfig } from '../indexer-config/indexer-config'; export enum IndexerStatus { PROVISIONING = 'PROVISIONING', @@ -29,11 +29,11 @@ export default class IndexerMeta implements IndexerMetaInterface { tracer = trace.getTracer('queryapi-runner-indexer-logger'); private readonly pgClient: PgClient; - private readonly indexerConfig: IndexerConfig; + private readonly indexerConfig: ProvisioningConfig; private readonly logInsertQueryTemplate: string = 'INSERT INTO %I.sys_logs (block_height, date, timestamp, type, level, message) VALUES %L'; constructor ( - indexerConfig: IndexerConfig, + indexerConfig: ProvisioningConfig, databaseConnectionParameters: PostgresConnectionParams, pgClientInstance: PgClient | undefined = undefined, ) { diff --git a/runner/src/provisioner/provisioner.test.ts b/runner/src/provisioner/provisioner.test.ts index 8ef123714..0b58c4864 100644 --- a/runner/src/provisioner/provisioner.test.ts +++ b/runner/src/provisioner/provisioner.test.ts @@ -72,7 +72,13 @@ describe('Provisioner', () => { }; }); - provisioner = new Provisioner(hasuraClient, adminPgClient, cronPgClient, undefined, crypto, pgFormat, PgClient as any, testingRetryConfig); + const IndexerMeta = jest.fn().mockImplementation(() => { + return { + writeLogs: jest.fn() + }; + }); + + provisioner = new Provisioner(hasuraClient, adminPgClient, cronPgClient, undefined, crypto, pgFormat, PgClient as any, testingRetryConfig, IndexerMeta); indexerConfig = new IndexerConfig('', accountId, functionName, 0, '', databaseSchema, LogLevel.INFO); }); diff --git a/runner/src/provisioner/provisioner.ts b/runner/src/provisioner/provisioner.ts index f9d4e5118..237bdb1e6 100644 --- a/runner/src/provisioner/provisioner.ts +++ b/runner/src/provisioner/provisioner.ts @@ -10,7 +10,8 @@ import { logsTableDDL } from './schemas/logs-table'; import { metadataTableDDL } from './schemas/metadata-table'; import PgClientClass, { type PostgresConnectionParams } from '../pg-client'; import { type ProvisioningConfig } from '../indexer-config/indexer-config'; -import { METADATA_TABLE_UPSERT, MetadataFields, IndexerStatus } from '../indexer-meta'; +import IndexerMetaClass, { METADATA_TABLE_UPSERT, MetadataFields, IndexerStatus, LogEntry } from '../indexer-meta'; +import logger from '../logger'; const DEFAULT_PASSWORD_LENGTH = 16; @@ -60,6 +61,9 @@ const defaultRetryConfig: RetryConfig = { export default class Provisioner { tracer: Tracer = trace.getTracer('queryapi-runner-provisioner'); + private readonly SYSTEM_TABLES = ['sys_logs', 'sys_metadata']; + private readonly logger: typeof logger; + constructor ( private readonly hasuraClient: HasuraClient = new HasuraClient(), private readonly adminDefaultPgClient: PgClientClass = adminDefaultPgClientGlobal, @@ -69,7 +73,10 @@ export default class Provisioner { private readonly pgFormat: typeof pgFormatLib = pgFormatLib, private readonly PgClient: typeof PgClientClass = PgClientClass, private readonly retryConfig: RetryConfig = defaultRetryConfig, - ) {} + private readonly IndexerMeta: typeof IndexerMetaClass = IndexerMetaClass + ) { + this.logger = logger.child({ service: 'Provisioner' }); + } generatePassword (length: number = DEFAULT_PASSWORD_LENGTH): string { return this.crypto @@ -322,42 +329,82 @@ export default class Provisioner { }, 'Failed to deprovision'); } - async provisionUserApi (indexerConfig: ProvisioningConfig): Promise { // replace any with actual type + async provisionUserApi (indexerConfig: ProvisioningConfig): Promise { + const logger = this.logger.child({ accountId: indexerConfig.accountId, functionName: indexerConfig.functionName }); + + await wrapSpan(async () => { + await wrapError(async () => { + try { + await this.provisionSystemResources(indexerConfig); + } catch (error) { + logger.error('Failed to provision system resources', error); + throw error; + } + + try { + await this.provisionUserResources(indexerConfig); + } catch (err) { + const error = err as Error; + + try { + await this.writeFailureToUserLogs(indexerConfig, error); + } catch (error) { + logger.error('Failed to log provisioning failure', error); + } + + logger.warn('Failed to provision user resources', error); + throw error; + } + }, 'Failed to provision endpoint'); + }, this.tracer, 'provision indexer resources'); + } + + async writeFailureToUserLogs (indexerConfig: ProvisioningConfig, error: Error): Promise { + const indexerMeta = new this.IndexerMeta(indexerConfig, await this.getPostgresConnectionParameters(indexerConfig.userName())); + await indexerMeta.writeLogs([LogEntry.systemError(error.message)]); + } + + async provisionSystemResources (indexerConfig: ProvisioningConfig): Promise { const userName = indexerConfig.userName(); const databaseName = indexerConfig.databaseName(); const schemaName = indexerConfig.schemaName(); - await wrapSpan(async () => { - await wrapError( - async () => { - if (!await this.hasuraClient.doesSourceExist(databaseName)) { - const password = this.generatePassword(); - await this.createUserDb(userName, password, databaseName); - await this.addDatasource(userName, password, databaseName); - } + if (!await this.hasuraClient.doesSourceExist(databaseName)) { + const password = this.generatePassword(); + await this.createUserDb(userName, password, databaseName); + await this.addDatasource(userName, password, databaseName); + } - await this.createSchema(databaseName, schemaName); + await this.createSchema(databaseName, schemaName); - await this.createMetadataTable(databaseName, schemaName); - await this.setProvisioningStatus(userName, schemaName); - await this.setupPartitionedLogsTable(userName, databaseName, schemaName); - await this.runIndexerSql(databaseName, schemaName, indexerConfig.schema); + await this.createMetadataTable(databaseName, schemaName); + await this.setProvisioningStatus(userName, schemaName); + await this.setupPartitionedLogsTable(userName, databaseName, schemaName); - const updatedTableNames = await this.getTableNames(schemaName, databaseName); + await this.trackTables(schemaName, this.SYSTEM_TABLES, databaseName); - await this.trackTables(schemaName, updatedTableNames, databaseName); + await this.exponentialRetry(async () => { + await this.addPermissionsToTables(indexerConfig, this.SYSTEM_TABLES, ['select', 'insert', 'update', 'delete']); + }); + } - await this.exponentialRetry(async () => { - await this.trackForeignKeyRelationships(schemaName, databaseName); - }); + async provisionUserResources (indexerConfig: ProvisioningConfig): Promise { + const databaseName = indexerConfig.databaseName(); + const schemaName = indexerConfig.schemaName(); - await this.exponentialRetry(async () => { - await this.addPermissionsToTables(indexerConfig, updatedTableNames, ['select', 'insert', 'update', 'delete']); - }); - }, - 'Failed to provision endpoint' - ); - }, this.tracer, 'provision indexer resources'); + await this.runIndexerSql(databaseName, schemaName, indexerConfig.schema); + + const userTableNames = (await this.getTableNames(schemaName, databaseName)).filter((tableName) => !this.SYSTEM_TABLES.includes(tableName)); + + await this.trackTables(schemaName, userTableNames, databaseName); + + await this.exponentialRetry(async () => { + await this.trackForeignKeyRelationships(schemaName, databaseName); + }); + + await this.exponentialRetry(async () => { + await this.addPermissionsToTables(indexerConfig, userTableNames, ['select', 'insert', 'update', 'delete']); + }); } async exponentialRetry (fn: () => Promise): Promise { diff --git a/runner/src/server/services/data-layer/data-layer-service.ts b/runner/src/server/services/data-layer/data-layer-service.ts index d24befa02..61a1c94e6 100644 --- a/runner/src/server/services/data-layer/data-layer-service.ts +++ b/runner/src/server/services/data-layer/data-layer-service.ts @@ -111,16 +111,12 @@ export function createDataLayerService ( .then(() => { logger.info('Successfully provisioned Data Layer'); }) - .catch((err) => { - logger.error('Failed to provision Data Layer', err); - throw err; - }) ); callback(null, { taskId }); }) .catch((err) => { - logger.error('Failed to check if Data Layer is provisioned', err); + logger.warn('Failed to check if Data Layer is provisioned', err); const internal = new StatusBuilder() .withCode(status.INTERNAL) @@ -148,7 +144,7 @@ export function createDataLayerService ( logger.info('Successfully deprovisioned Data Layer'); }) .catch((err) => { - logger.error('Failed to deprovision Data Layer', err); + logger.warn('Failed to deprovision Data Layer', err); throw err; }) ); diff --git a/runner/src/server/services/runner/runner-service.ts b/runner/src/server/services/runner/runner-service.ts index 6299beac5..dd29d3921 100644 --- a/runner/src/server/services/runner/runner-service.ts +++ b/runner/src/server/services/runner/runner-service.ts @@ -81,7 +81,7 @@ export function getRunnerService ( executors.set(indexerConfig.executorId, streamHandler); callback(null, { executorId: indexerConfig.executorId }); streamHandler.start().catch((error: Error) => { - logger.error('Failed to start executor', error); + logger.warn('Failed to start executor', error); }); } catch (e) { const error = e as Error; diff --git a/runner/src/stream-handler/stream-handler.ts b/runner/src/stream-handler/stream-handler.ts index b6742840d..9b9ea9eed 100644 --- a/runner/src/stream-handler/stream-handler.ts +++ b/runner/src/stream-handler/stream-handler.ts @@ -74,7 +74,7 @@ export default class StreamHandler { this.executorContext.executionState = ExecutionState.RUNNING; } catch (error: any) { const errorContent = error instanceof Error ? error.toString() : JSON.stringify(error); - this.logger.error('Terminating thread', error); + this.logger.warn('Terminating thread', error); this.executorContext.executionState = ExecutionState.STALLED; throw new Error(`Failed to start Indexer: ${errorContent}`); } @@ -92,7 +92,7 @@ export default class StreamHandler { } private handleError (error: Error): void { - this.logger.error('Terminating thread', error); + this.logger.warn('Terminating thread', error); this.executorContext.executionState = ExecutionState.STALLED; if (this.indexerMeta) { diff --git a/runner/src/stream-handler/worker.ts b/runner/src/stream-handler/worker.ts index 3ca3e5c9f..38a6483b5 100644 --- a/runner/src/stream-handler/worker.ts +++ b/runner/src/stream-handler/worker.ts @@ -189,7 +189,7 @@ async function blockQueueConsumer (workerContext: WorkerContext): Promise const error = err as Error; if (previousError !== error.message) { previousError = error.message; - workerContext.logger.error(`Failed on block ${currBlockHeight}`, err); + workerContext.logger.warn(`Failed on block ${currBlockHeight}`, err); } const sleepSpan = tracer.startSpan('Sleep for 10 seconds after failing', {}, context.active()); await sleep(10000); diff --git a/runner/tests/integration.test.ts b/runner/tests/integration.test.ts index 1fd71d9c2..cca359990 100644 --- a/runner/tests/integration.test.ts +++ b/runner/tests/integration.test.ts @@ -270,6 +270,23 @@ describe('Indexer integration', () => { await expect(pgClient.query('SELECT * FROM cron.job WHERE jobname like $1', ['provisioning_near_test_provisioning%']).then(({ rows }) => rows)).resolves.toHaveLength(0); await expect(hasuraClient.doesSourceExist(testConfig1.databaseName())).resolves.toBe(false); }); + + it('Writes provisioning errors to user logs table', async () => { + const testConfig = new IndexerConfig( + 'test:stream', + 'user-failures.near', // must be unique to prevent conflicts with other tests + 'test', + 0, + '', + 'broken schema', + LogLevel.INFO + ); + + await expect(provisioner.provisionUserApi(testConfig)).rejects.toThrow(); + + const logs: any = await indexerLogsQuery(testConfig.schemaName(), graphqlClient); + expect(logs[0].message).toContain('Failed to run user script'); + }); }); async function prepareIndexer (indexerConfig: IndexerConfig, provisioner: Provisioner, hasuraContainer: StartedHasuraGraphQLContainer): Promise { From 4af58bc82a964f7b1342c9216547fcc23ad1d8f3 Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Fri, 9 Aug 2024 10:31:31 -0700 Subject: [PATCH 08/17] chore: Add additional logs for state transitions (#989) I added a little bit more logging to the lifecycle state changes, as well as renamed the `Stopping/Stopped` states to `Suspending/Suspended` states to more accurately capture the intention. --- coordinator/src/indexer_state.rs | 72 ++++++++++++++++++++++++++++++-- coordinator/src/lifecycle.rs | 44 ++++++++++--------- 2 files changed, 93 insertions(+), 23 deletions(-) diff --git a/coordinator/src/indexer_state.rs b/coordinator/src/indexer_state.rs index 9e7b7a341..8fdb9ff81 100644 --- a/coordinator/src/indexer_state.rs +++ b/coordinator/src/indexer_state.rs @@ -16,13 +16,18 @@ pub enum ProvisionedState { Failed, } +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +pub enum OldLifecycleState { + Stopping, + Stopped, +} #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] pub struct OldIndexerState { pub account_id: AccountId, pub function_name: String, pub block_stream_synced_at: Option, pub enabled: bool, - pub provisioned_state: ProvisionedState, + pub lifecycle_state: OldLifecycleState, } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] @@ -75,15 +80,23 @@ impl IndexerStateManagerImpl { tracing::info!("Migrating {}", raw_state); let old_state: OldIndexerState = serde_json::from_str(&raw_state)?; + let migrated_lifecycle_state = + if old_state.lifecycle_state == OldLifecycleState::Stopping { + LifecycleState::Suspending + } else if old_state.lifecycle_state == OldLifecycleState::Stopped { + LifecycleState::Suspended + } else { + tracing::warn!("Unknown lifecycle state: {:?}", old_state.lifecycle_state); + continue; + }; let state = IndexerState { account_id: old_state.account_id, function_name: old_state.function_name, block_stream_synced_at: old_state.block_stream_synced_at, enabled: old_state.enabled, - lifecycle_state: LifecycleState::Running, + lifecycle_state: migrated_lifecycle_state, }; - self.redis_client .set(state.get_state_key(), serde_json::to_string(&state)?) .await?; @@ -182,6 +195,59 @@ mod tests { use mockall::predicate; use registry_types::{Rule, StartBlock, Status}; + #[tokio::test] + async fn migrate_state() { + let mut mock_redis_client = RedisClient::default(); + let valid_state = serde_json::json!({ "account_id": "morgs.near", "function_name": "test_valid_1", "block_stream_synced_at": 200, "enabled": true, "lifecycle_state": "Initializing" }).to_string(); + let valid_state_two = serde_json::json!({ "account_id": "morgs.near", "function_name": "test_valid_2", "block_stream_synced_at": 200, "enabled": true, "lifecycle_state": "Running" }).to_string(); + let state_to_migrate_stopping = serde_json::json!({ "account_id": "morgs.near", "function_name": "test_migrate_stopping", "block_stream_synced_at": 200, "enabled": true, "lifecycle_state": "Stopping" }).to_string(); + let state_to_migrate_stopped = serde_json::json!({ "account_id": "morgs.near", "function_name": "test_migrate_stopped", "block_stream_synced_at": 200, "enabled": true, "lifecycle_state": "Stopped" }).to_string(); + let migrated_suspending = IndexerState { + account_id: "morgs.near".parse().unwrap(), + function_name: "test_migrate_stopping".to_string(), + block_stream_synced_at: Some(200), + enabled: true, + lifecycle_state: LifecycleState::Suspending, + }; + let migrated_suspended = IndexerState { + account_id: "morgs.near".parse().unwrap(), + function_name: "test_migrate_stopped".to_string(), + block_stream_synced_at: Some(200), + enabled: true, + lifecycle_state: LifecycleState::Suspended, + }; + mock_redis_client + .expect_list_indexer_states() + .returning(move || { + Ok(vec![ + valid_state.clone(), + valid_state_two.clone(), + state_to_migrate_stopping.clone(), + state_to_migrate_stopped.clone(), + ]) + }) + .once(); + mock_redis_client + .expect_set::() + .with( + predicate::eq(migrated_suspending.get_state_key()), + predicate::eq(serde_json::to_string(&migrated_suspending).unwrap()), + ) + .returning(|_, _| Ok(())) + .once(); + mock_redis_client + .expect_set::() + .with( + predicate::eq(migrated_suspended.get_state_key()), + predicate::eq(serde_json::to_string(&migrated_suspended).unwrap()), + ) + .returning(|_, _| Ok(())) + .once(); + + let indexer_manager = IndexerStateManagerImpl::new(mock_redis_client); + let _ = indexer_manager.migrate().await; + } + #[tokio::test] async fn list_indexer_states() { let mut mock_redis_client = RedisClient::default(); diff --git a/coordinator/src/lifecycle.rs b/coordinator/src/lifecycle.rs index 32fb2f9f0..11bb1cfa7 100644 --- a/coordinator/src/lifecycle.rs +++ b/coordinator/src/lifecycle.rs @@ -24,22 +24,22 @@ pub enum LifecycleState { /// they are running the latest version of the Indexer. /// /// Transitions: - /// - `Stopping` if suspended + /// - `Suspending` if suspended /// - `Running` if Block Stream or Executor fails to synchronise, essentially triggering a /// retry /// - `Running` on success Running, - /// Indexer is being stopped, Block Stream and Executors are being stopped. + /// Indexer is being suspended, Block Stream and Executors are being stopped. /// /// Transitions: - /// - `Stopping` on failure, triggering a retry - /// - `Stopped` on success - Stopping, - /// Indexer is stopped, Block Stream and Executors are not running. + /// - `Suspending` on failure, triggering a retry + /// - `Suspended` on success + Suspending, + /// Indexer is suspended, Block Stream and Executors are not running. /// /// Transitions: /// - `Running` if unsuspended - Stopped, + Suspended, /// Indexer is in a bad state, currently requires manual intervention, but should eventually /// self heal. This is a dead-end state /// @@ -103,6 +103,7 @@ impl<'a> LifecycleManager<'a> { .await .is_err() { + tracing::warn!("Failed to provision data layer"); return LifecycleState::Repairing; } @@ -120,7 +121,7 @@ impl<'a> LifecycleManager<'a> { } if !state.enabled { - return LifecycleState::Stopping; + return LifecycleState::Suspending; } if let Err(error) = self @@ -129,7 +130,6 @@ impl<'a> LifecycleManager<'a> { .await { warn!(?error, "Failed to synchronise block stream, retrying..."); - return LifecycleState::Running; } @@ -137,15 +137,14 @@ impl<'a> LifecycleManager<'a> { if let Err(error) = self.executors_handler.synchronise(config).await { warn!(?error, "Failed to synchronise executor, retrying..."); - return LifecycleState::Running; } LifecycleState::Running } - #[tracing::instrument(name = "stopping", skip_all)] - async fn handle_stopping(&self, config: &IndexerConfig) -> LifecycleState { + #[tracing::instrument(name = "suspending", skip_all)] + async fn handle_suspending(&self, config: &IndexerConfig) -> LifecycleState { if config.is_deleted() { return LifecycleState::Deleting; } @@ -156,7 +155,7 @@ impl<'a> LifecycleManager<'a> { .await { warn!(?error, "Failed to stop block stream, retrying..."); - return LifecycleState::Stopping; + return LifecycleState::Suspending; } if let Err(error) = self @@ -165,14 +164,18 @@ impl<'a> LifecycleManager<'a> { .await { warn!(?error, "Failed to stop executor, retrying..."); - return LifecycleState::Stopping; + return LifecycleState::Suspending; } - LifecycleState::Stopped + LifecycleState::Suspended } - #[tracing::instrument(name = "stopped", skip_all)] - async fn handle_stopped(&self, config: &IndexerConfig, state: &IndexerState) -> LifecycleState { + #[tracing::instrument(name = "suspended", skip_all)] + async fn handle_suspended( + &self, + config: &IndexerConfig, + state: &IndexerState, + ) -> LifecycleState { if config.is_deleted() { return LifecycleState::Deleting; } @@ -180,10 +183,11 @@ impl<'a> LifecycleManager<'a> { // TODO Transistion to `Running` on config update if state.enabled { + tracing::debug!("Suspended indexer was reactivated"); return LifecycleState::Running; } - LifecycleState::Stopped + LifecycleState::Suspended } #[tracing::instrument(name = "repairing", skip_all)] @@ -299,8 +303,8 @@ impl<'a> LifecycleManager<'a> { let desired_lifecycle_state = match state.lifecycle_state { LifecycleState::Initializing => self.handle_initializing(&config, &state).await, LifecycleState::Running => self.handle_running(&config, &mut state).await, - LifecycleState::Stopping => self.handle_stopping(&config).await, - LifecycleState::Stopped => self.handle_stopped(&config, &state).await, + LifecycleState::Suspending => self.handle_suspending(&config).await, + LifecycleState::Suspended => self.handle_suspended(&config, &state).await, LifecycleState::Repairing => self.handle_repairing(&config, &state).await, LifecycleState::Deleting => self.handle_deleting(&state).await, LifecycleState::Deleted => LifecycleState::Deleted, From 89e3700ea5837b317537d9ec5e2349d6bd8d9a0a Mon Sep 17 00:00:00 2001 From: Morgan McCauley Date: Mon, 12 Aug 2024 09:15:30 +1200 Subject: [PATCH 09/17] test: Add tests for `LifecycleManager` (#1003) closes: #977 --- coordinator/src/handlers/block_streams.rs | 30 +- coordinator/src/handlers/data_layer.rs | 28 +- coordinator/src/handlers/executors.rs | 24 +- coordinator/src/indexer_config.rs | 2 +- coordinator/src/lifecycle.rs | 942 ++++++++++++++++++++-- 5 files changed, 941 insertions(+), 85 deletions(-) diff --git a/coordinator/src/handlers/block_streams.rs b/coordinator/src/handlers/block_streams.rs index c3dc21e4a..b1c004b09 100644 --- a/coordinator/src/handlers/block_streams.rs +++ b/coordinator/src/handlers/block_streams.rs @@ -67,13 +67,19 @@ impl BlockStreamsClientWrapperImpl { } } +#[cfg(not(test))] +pub use BlockStreamsHandlerImpl as BlockStreamsHandler; +#[cfg(test)] +pub use MockBlockStreamsHandlerImpl as BlockStreamsHandler; + #[derive(Clone)] -pub struct BlockStreamsHandler { +pub struct BlockStreamsHandlerImpl { client: BlockStreamsClientWrapper, redis_client: RedisClient, } -impl BlockStreamsHandler { +#[cfg_attr(test, mockall::automock)] +impl BlockStreamsHandlerImpl { pub fn connect(block_streamer_url: &str, redis_client: RedisClient) -> anyhow::Result { let channel = Channel::from_shared(block_streamer_url.to_string()) .context("Block Streamer URL is invalid")? @@ -368,6 +374,12 @@ mod tests { } } + impl Clone for MockBlockStreamsHandlerImpl { + fn clone(&self) -> Self { + Self::default() + } + } + #[tokio::test] async fn resumes_stopped_streams() { let config = IndexerConfig::default(); @@ -401,7 +413,7 @@ mod tests { .expect_get_last_published_block::() .returning(move |_| Ok(Some(last_published_block))); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; @@ -463,7 +475,7 @@ mod tests { .returning(|_| Ok(())) .once(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; @@ -507,7 +519,7 @@ mod tests { let mock_redis = RedisClient::default(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; @@ -551,7 +563,7 @@ mod tests { .returning(|_| Ok(())) .once(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; @@ -617,7 +629,7 @@ mod tests { .expect_get_last_published_block::() .returning(move |_| Ok(Some(last_published_block))); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; @@ -672,7 +684,7 @@ mod tests { let mock_redis = RedisClient::default(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; @@ -723,7 +735,7 @@ mod tests { .returning(|_| Ok(None)) .once(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; diff --git a/coordinator/src/handlers/data_layer.rs b/coordinator/src/handlers/data_layer.rs index e0ea273cc..4b50f38b9 100644 --- a/coordinator/src/handlers/data_layer.rs +++ b/coordinator/src/handlers/data_layer.rs @@ -73,12 +73,18 @@ impl DataLayerClientWrapperImpl { } } +#[cfg(not(test))] +pub use DataLayerHandlerImpl as DataLayerHandler; +#[cfg(test)] +pub use MockDataLayerHandlerImpl as DataLayerHandler; + #[derive(Clone)] -pub struct DataLayerHandler { +pub struct DataLayerHandlerImpl { client: DataLayerClientWrapper, } -impl DataLayerHandler { +#[cfg_attr(test, mockall::automock)] +impl DataLayerHandlerImpl { pub fn connect(runner_url: &str) -> anyhow::Result { let channel = Channel::from_shared(runner_url.to_string()) .context("Runner URL is invalid")? @@ -249,6 +255,12 @@ mod tests { use mockall::predicate::*; + impl Clone for MockDataLayerHandlerImpl { + fn clone(&self) -> Self { + Self::default() + } + } + #[tokio::test] async fn provisions_data_layer() { let config = IndexerConfig::default(); @@ -290,7 +302,7 @@ mod tests { }) .once(); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -329,7 +341,7 @@ mod tests { }) .times(610); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -371,7 +383,7 @@ mod tests { }) .once(); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -423,7 +435,7 @@ mod tests { }) .once(); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -464,7 +476,7 @@ mod tests { }) .times(610); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -507,7 +519,7 @@ mod tests { }) .once(); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; diff --git a/coordinator/src/handlers/executors.rs b/coordinator/src/handlers/executors.rs index 4fc67a671..8b761e99f 100644 --- a/coordinator/src/handlers/executors.rs +++ b/coordinator/src/handlers/executors.rs @@ -63,12 +63,18 @@ impl ExecutorsClientWrapperImpl { } } +#[cfg(not(test))] +pub use ExecutorsHandlerImpl as ExecutorsHandler; +#[cfg(test)] +pub use MockExecutorsHandlerImpl as ExecutorsHandler; + #[derive(Clone)] -pub struct ExecutorsHandler { +pub struct ExecutorsHandlerImpl { client: ExecutorsClientWrapper, } -impl ExecutorsHandler { +#[cfg_attr(test, mockall::automock)] +impl ExecutorsHandlerImpl { pub fn connect(runner_url: &str) -> anyhow::Result { let channel = Channel::from_shared(runner_url.to_string()) .context("Runner URL is invalid")? @@ -225,6 +231,12 @@ mod tests { } } + impl Clone for MockExecutorsHandlerImpl { + fn clone(&self) -> Self { + Self::default() + } + } + #[tokio::test] async fn resumes_stopped_executors() { let config = IndexerConfig::default(); @@ -255,7 +267,7 @@ mod tests { }) .once(); - let handler = ExecutorsHandler { + let handler = ExecutorsHandlerImpl { client: mock_client, }; @@ -308,7 +320,7 @@ mod tests { .returning(move |_| Ok(Response::new(executor.clone()))) .once(); - let handler = ExecutorsHandler { + let handler = ExecutorsHandlerImpl { client: mock_client, }; @@ -365,7 +377,7 @@ mod tests { .returning(move |_| Ok(Response::new(executor.clone()))) .once(); - let handler = ExecutorsHandler { + let handler = ExecutorsHandlerImpl { client: mock_client, }; @@ -408,7 +420,7 @@ mod tests { .with(always()) .returning(move |_| Ok(Response::new(executor.clone()))); - let handler = ExecutorsHandler { + let handler = ExecutorsHandlerImpl { client: mock_client, }; diff --git a/coordinator/src/indexer_config.rs b/coordinator/src/indexer_config.rs index a29eab2d0..233cf852b 100644 --- a/coordinator/src/indexer_config.rs +++ b/coordinator/src/indexer_config.rs @@ -40,7 +40,7 @@ impl Default for IndexerConfig { }, created_at_block_height: 1, updated_at_block_height: Some(2), - deleted_at_block_height: Some(3), + deleted_at_block_height: None, start_block: StartBlock::Height(100), } } diff --git a/coordinator/src/lifecycle.rs b/coordinator/src/lifecycle.rs index 11bb1cfa7..b6715112f 100644 --- a/coordinator/src/lifecycle.rs +++ b/coordinator/src/lifecycle.rs @@ -254,6 +254,79 @@ impl<'a> LifecycleManager<'a> { // LifecycleState::Deleted } + pub async fn handle_transitions(&self, first_iteration: bool) -> bool { + let config = match self + .registry + .fetch_indexer( + &self.initial_config.account_id, + &self.initial_config.function_name, + ) + .await + { + Ok(Some(config)) => config, + Ok(None) => { + warn!("No matching indexer config was found"); + return false; + } + Err(error) => { + warn!(?error, "Failed to fetch config"); + return false; + } + }; + + let mut state = match self.state_manager.get_state(&self.initial_config).await { + Ok(state) => state, + Err(error) => { + warn!(?error, "Failed to get state"); + return false; + } + }; + + if first_iteration { + info!("Initial lifecycle state: {:?}", state.lifecycle_state); + } + + let desired_lifecycle_state = match state.lifecycle_state { + LifecycleState::Initializing => self.handle_initializing(&config, &state).await, + LifecycleState::Running => self.handle_running(&config, &mut state).await, + LifecycleState::Suspending => self.handle_suspending(&config).await, + LifecycleState::Suspended => self.handle_suspended(&config, &state).await, + LifecycleState::Repairing => self.handle_repairing(&config, &state).await, + LifecycleState::Deleting => self.handle_deleting(&state).await, + LifecycleState::Deleted => LifecycleState::Deleted, + }; + + if desired_lifecycle_state != state.lifecycle_state { + info!( + "Transitioning lifecycle state: {:?} -> {:?}", + state.lifecycle_state, desired_lifecycle_state, + ); + } + + if desired_lifecycle_state == LifecycleState::Deleted { + return true; + } + + state.lifecycle_state = desired_lifecycle_state; + + loop { + match self + .state_manager + .set_state(&self.initial_config, state.clone()) + .await + { + Ok(_) => break, + Err(e) => { + warn!("Failed to set state: {:?}. Retrying...", e); + + tokio::time::sleep(std::time::Duration::from_millis(1000)).await; + } + } + } + + false + } + #[tracing::instrument( name = "lifecycle_manager", skip(self), @@ -267,76 +340,823 @@ impl<'a> LifecycleManager<'a> { loop { tokio::time::sleep(std::time::Duration::from_millis(LOOP_THROTTLE_MS)).await; + let should_exit = self.handle_transitions(first_iteration).await; + + if should_exit { + break; + } + + first_iteration = false; + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use mockall::predicate::*; + + mod initializing { + use super::*; + + #[tokio::test] + async fn transitions_to_running_on_provisioning_success() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); - let config = match self - .registry - .fetch_indexer( - &self.initial_config.account_id, - &self.initial_config.function_name, + let mut data_layer_handler = DataLayerHandler::default(); + data_layer_handler + .expect_ensure_provisioned() + .returning(|_| Ok(())); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Initializing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Running + }), ) - .await - { - Ok(Some(config)) => config, - Ok(None) => { - warn!("No matching indexer config was found"); - continue; - } - Err(error) => { - warn!(?error, "Failed to fetch config"); - continue; - } - }; + .returning(|_, _| Ok(())); - let mut state = match self.state_manager.get_state(&self.initial_config).await { - Ok(state) => state, - Err(error) => { - warn!(?error, "Failed to get state"); - continue; - } - }; + let redis_client = RedisClient::default(); - if first_iteration { - info!("Initial lifecycle state: {:?}", state.lifecycle_state,); - first_iteration = false; - } + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); - let desired_lifecycle_state = match state.lifecycle_state { - LifecycleState::Initializing => self.handle_initializing(&config, &state).await, - LifecycleState::Running => self.handle_running(&config, &mut state).await, - LifecycleState::Suspending => self.handle_suspending(&config).await, - LifecycleState::Suspended => self.handle_suspended(&config, &state).await, - LifecycleState::Repairing => self.handle_repairing(&config, &state).await, - LifecycleState::Deleting => self.handle_deleting(&state).await, - LifecycleState::Deleted => LifecycleState::Deleted, - }; - - if desired_lifecycle_state != state.lifecycle_state { - info!( - "Transitioning lifecycle state: {:?} -> {:?}", - state.lifecycle_state, desired_lifecycle_state, - ); - } + lifecycle_manager.handle_transitions(true).await; + } - if desired_lifecycle_state == LifecycleState::Deleted { - break; - } + #[tokio::test] + async fn transitions_to_repairing_on_provisioning_failure() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); - state.lifecycle_state = desired_lifecycle_state; + let mut data_layer_handler = DataLayerHandler::default(); + data_layer_handler + .expect_ensure_provisioned() + .returning(|_| anyhow::bail!("failed")); - loop { - match self - .state_manager - .set_state(&self.initial_config, state.clone()) - .await - { - Ok(_) => break, - Err(e) => { - warn!("Failed to set state: {:?}. Retrying...", e); + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); - tokio::time::sleep(std::time::Duration::from_millis(1000)).await; - } - } - } + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Initializing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Repairing + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + + let mut data_layer_handler = DataLayerHandler::default(); + data_layer_handler + .expect_ensure_provisioned() + .returning(|_| anyhow::bail!("failed")); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Initializing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod running { + use super::*; + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_suspending_on_disabled() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: false, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn synchronises_streams_and_executors() { + let config = IndexerConfig::default(); + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_synchronise() + .returning(|_, _| Ok(())) + .once(); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_synchronise() + .returning(|_| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Running + && state.block_stream_synced_at == Some(2) + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod suspending { + use super::*; + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspending, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn stops_streams_and_executors() { + let config = IndexerConfig::default(); + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_stop_if_needed() + .returning(|_, _| Ok(())) + .once(); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_stop_if_needed() + .returning(|_, _| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspending, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Suspended + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod suspended { + use super::*; + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspended, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: false, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_running_on_enabled() { + let config = IndexerConfig::default(); + + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspended, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Running + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_suspended() { + let config = IndexerConfig::default(); + + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspended, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: false, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Suspended + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod repairing { + use super::*; + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Repairing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_repairing() { + let config = IndexerConfig::default(); + + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Repairing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Repairing + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod deleting { + use super::*; + + #[tokio::test] + async fn stops_streams_and_executors() { + let config = IndexerConfig::default(); + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_stop_if_needed() + .returning(|_, _| Ok(())) + .once(); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_stop_if_needed() + .returning(|_, _| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Deleting, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleted + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod deleted { + use super::*; + + #[tokio::test] + async fn exits() { + tokio::time::pause(); + + let config = IndexerConfig::default(); + + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Deleted, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleted + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.run().await; } } } From ab5a83669ea159754a129904a66cf8a566dcda33 Mon Sep 17 00:00:00 2001 From: Kevin Zhang <42101107+Kevin101Zhang@users.noreply.github.com> Date: Mon, 12 Aug 2024 13:38:21 -0400 Subject: [PATCH 10/17] feat: editor DiffView now recognizes LaunchPad generated code (#999) --- .../Editor/EditorComponents/Editor.tsx | 16 ++++++++++++++-- .../EditorComponents/ResizableLayoutEditor.jsx | 15 ++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/Editor/EditorComponents/Editor.tsx b/frontend/src/components/Editor/EditorComponents/Editor.tsx index 1ca0de9c9..cfdf8c071 100644 --- a/frontend/src/components/Editor/EditorComponents/Editor.tsx +++ b/frontend/src/components/Editor/EditorComponents/Editor.tsx @@ -42,6 +42,7 @@ const SCHEMA_TAB_NAME = 'schema.sql'; const originalSQLCode = formatSQL(defaultSchema); const originalIndexingCode = formatIndexingCode(defaultCode); const pgSchemaTypeGen = new PgSchemaTypeGen(); + interface WizardResponse { wizardContractFilter: string; wizardMethods: Method[]; @@ -55,6 +56,9 @@ const fetchWizardData = (req: string): Promise => { const Editor: React.FC = (): ReactElement => { const { indexerDetails, isCreateNewIndexer } = useContext(IndexerDetailsContext); + const contextCode = indexerDetails.code && formatIndexingCode(indexerDetails.code); + const contextSchema = indexerDetails.schema && formatSQL(indexerDetails.schema); + const storageManager = useMemo(() => { if (indexerDetails.accountId && indexerDetails.indexerName) { return new QueryAPIStorageManager(indexerDetails.accountId, indexerDetails.indexerName); @@ -79,6 +83,10 @@ const Editor: React.FC = (): ReactElement => { const [diffView, setDiffView] = useState(false); const [blockView, setBlockView] = useState(false); + + const [launchPadDefaultCode, setLaunchPadDefaultCode] = useState(''); + const [launchPadDefaultSchema, setLaunchPadDefaultSchema] = useState(''); + const { showModal } = useModal(); const [isExecutingIndexerFunction, setIsExecutingIndexerFunction] = useState(false); @@ -158,8 +166,8 @@ const Editor: React.FC = (): ReactElement => { const wrappedIndexingCode = wrapCode(jsCode) ? wrapCode(jsCode) : jsCode; const { validatedCode, validatedSchema } = reformatAll(wrappedIndexingCode, sqlCode); - validatedCode && setIndexingCode(validatedCode); - validatedSchema && setSchema(validatedSchema); + validatedCode && (setIndexingCode(validatedCode), setLaunchPadDefaultCode(validatedCode)); + validatedSchema && (setSchema(validatedSchema), setLaunchPadDefaultSchema(validatedSchema)); } catch (error: unknown) { //todo: figure out best course of action for user if api fails console.error(error); @@ -471,6 +479,10 @@ const Editor: React.FC = (): ReactElement => { schema={schema} isCreateNewIndexer={isCreateNewIndexer} onMount={handleEditorWillMount} + launchPadDefaultCode={launchPadDefaultCode} + launchPadDefaultSchema={launchPadDefaultSchema} + contextCode={contextCode} + contextSchema={contextSchema} /> diff --git a/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx b/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx index f9c60ba92..73b55e164 100644 --- a/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx +++ b/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx @@ -8,7 +8,7 @@ const containerStyle = { display: 'flex', flexDirection: 'row', width: '100%', - height: '100%', + height: '100vh', }; const editorContainerStyle = { @@ -145,6 +145,10 @@ export default function ResizableLayoutEditor({ indexingCode, onMount, isCreateNewIndexer, + launchPadDefaultCode, + launchPadDefaultSchema, + contextCode, + contextSchema, }) { const { dragBarRef: dragBarRefConsole, @@ -157,7 +161,8 @@ export default function ResizableLayoutEditor({ sizeThresholdFirst: 60, sizeThresholdSecond: 20, }); - + const defaultCode = launchPadDefaultCode ? launchPadDefaultCode : contextCode ? contextCode : originalIndexingCode; + const defaultSchema = launchPadDefaultSchema ? launchPadDefaultSchema : contextSchema ? contextSchema : originalSQLCode; return (
{/* Code Editor */} @@ -165,15 +170,15 @@ export default function ResizableLayoutEditor({
From e75908072a10ad93bfc6394cf2af9995edf71b25 Mon Sep 17 00:00:00 2001 From: Kevin Zhang <42101107+Kevin101Zhang@users.noreply.github.com> Date: Mon, 12 Aug 2024 14:07:07 -0400 Subject: [PATCH 11/17] type generation for launchpad code (#1001) types are now generated for launchpad code --- .../Editor/EditorComponents/Editor.tsx | 54 +++++++++---------- .../ResizableLayoutEditor.jsx | 2 + 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/frontend/src/components/Editor/EditorComponents/Editor.tsx b/frontend/src/components/Editor/EditorComponents/Editor.tsx index cfdf8c071..9d7d949cc 100644 --- a/frontend/src/components/Editor/EditorComponents/Editor.tsx +++ b/frontend/src/components/Editor/EditorComponents/Editor.tsx @@ -53,6 +53,30 @@ const fetchWizardData = (req: string): Promise => { return request('launchpad-create-indexer', req); }; +const fetchGeneratedCode = async (contractFilter: string, selectedMethods: Method[], selectedEvents?: Event[]) => { + try { + const response = await fetch('/api/generateCode', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ contractFilter, selectedMethods, selectedEvents }), + }); + if (!response.ok) { + throw new Error('Network response was not ok'); + } + const data = await response.json(); + + if (!data.hasOwnProperty('jsCode') || !data.hasOwnProperty('sqlCode')) { + throw new Error('No code was returned from the server with properties jsCode and sqlCode'); + } + + return data; + } catch (error) { + throw error; + } +}; + const Editor: React.FC = (): ReactElement => { const { indexerDetails, isCreateNewIndexer } = useContext(IndexerDetailsContext); @@ -131,38 +155,13 @@ const Editor: React.FC = (): ReactElement => { return; }; - const generateCode = async (contractFilter: string, selectedMethods: Method[], selectedEvents?: Event[]) => { - try { - const response = await fetch('/api/generateCode', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ contractFilter, selectedMethods, selectedEvents }), - }); - if (!response.ok) { - throw new Error('Network response was not ok'); - } - const data = await response.json(); - - if (!data.hasOwnProperty('jsCode') || !data.hasOwnProperty('sqlCode')) { - throw new Error('No code was returned from the server with properties jsCode and sqlCode'); - } - - return data; - } catch (error) { - throw error; - } - }; - useEffect(() => { (async () => { try { const { wizardContractFilter, wizardMethods, wizardEvents } = await fetchWizardData(''); if (wizardContractFilter === 'noFilter') return; - - const { jsCode, sqlCode } = await generateCode(wizardContractFilter, wizardMethods, wizardEvents); + const { jsCode, sqlCode } = await fetchGeneratedCode(wizardContractFilter, wizardMethods, wizardEvents); const wrappedIndexingCode = wrapCode(jsCode) ? wrapCode(jsCode) : jsCode; const { validatedCode, validatedSchema } = reformatAll(wrappedIndexingCode, sqlCode); @@ -207,7 +206,6 @@ const Editor: React.FC = (): ReactElement => { useEffect(() => { const { error: schemaError } = validateSQLSchema(schema); const { error: codeError } = validateJSCode(indexingCode); - if (schemaError || codeError) { if (schemaError) schemaErrorHandler(schemaError); if (codeError) indexerErrorHandler(codeError); @@ -215,7 +213,7 @@ const Editor: React.FC = (): ReactElement => { } handleCodeGen(); - }, [fileName]); + }, [fileName, launchPadDefaultSchema]); useEffect(() => { cacheToLocal(); diff --git a/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx b/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx index 73b55e164..698433343 100644 --- a/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx +++ b/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx @@ -161,8 +161,10 @@ export default function ResizableLayoutEditor({ sizeThresholdFirst: 60, sizeThresholdSecond: 20, }); + const defaultCode = launchPadDefaultCode ? launchPadDefaultCode : contextCode ? contextCode : originalIndexingCode; const defaultSchema = launchPadDefaultSchema ? launchPadDefaultSchema : contextSchema ? contextSchema : originalSQLCode; + return (
{/* Code Editor */} From 0507e3af46acb346316bdcbb675a000dcfd74052 Mon Sep 17 00:00:00 2001 From: Kevin Zhang <42101107+Kevin101Zhang@users.noreply.github.com> Date: Tue, 13 Aug 2024 14:21:30 -0400 Subject: [PATCH 12/17] feat: consolidated checkbox state to single checkbox (#1011) consolidated 2 checkboxes 'select all' and 'unselect all' into a single checkbox. Default is checked. Onclick would uncheck and subsequent clicked woud do vice versa. --- frontend/widgets/src/QueryApi.Launchpad.jsx | 28 ++++----------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/frontend/widgets/src/QueryApi.Launchpad.jsx b/frontend/widgets/src/QueryApi.Launchpad.jsx index 5ff436a5f..503378896 100644 --- a/frontend/widgets/src/QueryApi.Launchpad.jsx +++ b/frontend/widgets/src/QueryApi.Launchpad.jsx @@ -369,7 +369,7 @@ useEffect(() => { setCheckboxEvents(initializeCheckboxState(eventsData, 'event_name')); }, [methodsData, eventsData]); -const generateMethods = () => { +const generateProperties = () => { const filterData = (data, checkboxState, keyName) => { return data .map(item => { @@ -463,7 +463,7 @@ const handleFetchCheckboxData = async () => { }; const toggleAllSelection = (action) => { - const isSelectAll = action === 'select_all'; + const isSelectAll = !selectAllMethods; const isMethodsTab = tab === 'methods_tab'; const isEventsTab = tab === 'events_tab'; @@ -632,20 +632,11 @@ return ( toggleAllSelection('select_all')} + onChange={() => toggleAllSelection(selectAllMethods)} checked={selectAllMethods} /> Select All - - toggleAllSelection('unselect_all')} - checked={!selectAllMethods} - /> - Unselect All - {methodsData.map((item, index) => ( @@ -686,20 +677,11 @@ return ( toggleAllSelection('select_all')} + onChange={() => toggleAllSelection(selectAllEvents)} checked={selectAllEvents} /> Select All Events - - toggleAllSelection('unselect_all')} - checked={!selectAllEvents} - /> - Unselect All Events - {eventsData.map((item, index) => ( @@ -737,7 +719,7 @@ return ( )} - Generate + Generate From 8dd78c7af3ebe52923aff1113ec74fbf618a4b19 Mon Sep 17 00:00:00 2001 From: Kevin Zhang <42101107+Kevin101Zhang@users.noreply.github.com> Date: Tue, 13 Aug 2024 14:21:48 -0400 Subject: [PATCH 13/17] feat: refactor monaco initialization (#1012) all removed files: ``` DiffEditorComponent.js MonacoEditorComponent.js resize.js block_details.js ``` refactored ResizableLayout to house the functionality in a reusable dp. Results are some absurdly fast transitions between tabs. New [Resizable Editor File](https://github.com/near/queryapi/blob/f00ab7dc8fa65199a40de1b638970479760b6bfe/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx) Encompasses logic from **MonacoEditorComponent**,**DiffEditorComponent**, **ResizableLayout**, **ResizeableLayoutEditor** Upon refactoring resizable (resize.js), and block_details.js were removed as there are no real functionality used around them. --- .../EditorComponents/DiffEditorComponent.jsx | 14 - .../Editor/EditorComponents/Editor.tsx | 16 +- .../MonacoEditorComponent.jsx | 22 - .../ResizableLayoutEditor.jsx | 263 +-- .../Editor/EditorComponents/block_details.js | 1643 ----------------- frontend/src/utils/resize.js | 236 --- 6 files changed, 99 insertions(+), 2095 deletions(-) delete mode 100644 frontend/src/components/Editor/EditorComponents/DiffEditorComponent.jsx delete mode 100644 frontend/src/components/Editor/EditorComponents/MonacoEditorComponent.jsx delete mode 100644 frontend/src/components/Editor/EditorComponents/block_details.js delete mode 100644 frontend/src/utils/resize.js diff --git a/frontend/src/components/Editor/EditorComponents/DiffEditorComponent.jsx b/frontend/src/components/Editor/EditorComponents/DiffEditorComponent.jsx deleted file mode 100644 index 1bffd6647..000000000 --- a/frontend/src/components/Editor/EditorComponents/DiffEditorComponent.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import { DiffEditor } from '@monaco-editor/react'; - -export const DiffEditorComponent = ({ original, modified, language, readOnly, options, onMount }) => ( - -); diff --git a/frontend/src/components/Editor/EditorComponents/Editor.tsx b/frontend/src/components/Editor/EditorComponents/Editor.tsx index 9d7d949cc..d4ded1109 100644 --- a/frontend/src/components/Editor/EditorComponents/Editor.tsx +++ b/frontend/src/components/Editor/EditorComponents/Editor.tsx @@ -31,14 +31,12 @@ import { validateJSCode, validateSQLSchema } from '@/utils/validators'; import DeveloperToolsContainer from '../EditorViewContainer/DeveloperToolsContainer'; import EditorMenuContainer from '../EditorViewContainer/EditorMenuContainer'; import QueryAPIStorageManager from '../QueryApiStorageManager'; -import { block_details } from './block_details'; import { FileSwitcher } from './FileSwitcher'; import { GlyphContainer } from './GlyphContainer'; import ResizableLayoutEditor from './ResizableLayoutEditor'; declare const monaco: any; const INDEXER_TAB_NAME = 'indexer.js'; -const SCHEMA_TAB_NAME = 'schema.sql'; const originalSQLCode = formatSQL(defaultSchema); const originalIndexingCode = formatIndexingCode(defaultCode); const pgSchemaTypeGen = new PgSchemaTypeGen(); @@ -106,7 +104,6 @@ const Editor: React.FC = (): ReactElement => { const [heights, setHeights] = useState(initialHeights); const [diffView, setDiffView] = useState(false); - const [blockView, setBlockView] = useState(false); const [launchPadDefaultCode, setLaunchPadDefaultCode] = useState(''); const [launchPadDefaultSchema, setLaunchPadDefaultSchema] = useState(''); @@ -463,24 +460,21 @@ const Editor: React.FC = (): ReactElement => { indexerError={indexerError} /> - {/* @ts-ignore remove after refactoring Resizable Editor to ts*/}
diff --git a/frontend/src/components/Editor/EditorComponents/MonacoEditorComponent.jsx b/frontend/src/components/Editor/EditorComponents/MonacoEditorComponent.jsx deleted file mode 100644 index 041d7e08c..000000000 --- a/frontend/src/components/Editor/EditorComponents/MonacoEditorComponent.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import MonacoEditor from '@monaco-editor/react'; -export const MonacoEditorComponent = ({ - value, - defaultValue, - defaultLanguage, - readOnly, - onChange, - onMount, - options, -}) => ( - -); diff --git a/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx b/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx index 698433343..1d95d4241 100644 --- a/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx +++ b/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx @@ -1,189 +1,114 @@ -import { DiffEditorComponent } from './DiffEditorComponent'; -import { MonacoEditorComponent } from './MonacoEditorComponent'; -import { defaultCode, defaultSchema } from '@/utils/formatters'; -import { useDragResize } from '@/utils/resize'; +import React from 'react'; +import MonacoEditor, { DiffEditor } from '@monaco-editor/react'; import GraphqlPlayground from '../../Playground'; -const containerStyle = { - display: 'flex', - flexDirection: 'row', - width: '100%', - height: '100vh', +const editorOptions = { + wordWrap: 'on', + minimap: { enabled: false }, + folding: false, + lineNumberMinChars: 3, + scrollBeyondLastLine: true, + automaticLayout: true, + formatOnPaste: true, + definitionLinkOpensInPeek: true, + font: 'serif', }; -const editorContainerStyle = { - width: '100%', - display: 'flex', - justifyContent: 'center', - minWidth: '100px', -}; +const getEditorOptions = (options, readOnly) => ({ + ...options, + readOnly, +}); -const dragBarStyle = { - width: '10px', - backgroundColor: 'gray', - cursor: 'col-resize', -}; +const getDiffEditorOptions = (options, readOnly) => ({ + ...options, + readOnly, +}); + +const getDefaultValues = (launchPadDefault, context, original) => launchPadDefault || context || original; -const ResizableEditor = ({ - accountId, +const ResizableLayoutEditor = ({ fileName, - blockView, diffView, - consoleView, - onChangeCode, - onChangeSchema, - block_details, + launchPadDefaultSchema, + contextSchema, originalSQLCode, + launchPadDefaultCode, + contextCode, originalIndexingCode, schema, indexingCode, - onMount, isCreateNewIndexer, + onMount, + onChangeSchema, + onChangeCode, }) => { - const { firstRef, secondRef, dragBarRef } = useDragResize({ - direction: 'horizontal', - initiallyHidden: null, - defaultSizeRelation: 3, - sizeThresholdFirst: 60, - sizeThresholdSecond: 60, - }); + const determineEditorProps = () => { + const isSchemaEditor = fileName === 'schema.sql'; + const isCodeEditor = fileName === 'indexer.js'; - // Render logic based on fileName - const editorComponents = { - GraphiQL: () => , - 'indexer.js': () => - diffView ? ( - - ) : ( - - ), - 'schema.sql': () => - diffView ? ( - - ) : ( - { + if (fileName === 'GraphiQL') return ; + + const { editorProps, diffProps } = determineEditorProps(); + + if (diffView) { + return ( + - ), + ); + } + + return ( + + ); }; - return ( -
-
- {editorComponents[fileName] && editorComponents[fileName]()} -
-
-
- ); + return
{renderEditor()}
; }; -export default function ResizableLayoutEditor({ - accountId, - fileName, - blockView, - diffView, - consoleView, - onChangeCode, - onChangeSchema, - block_details, - originalSQLCode, - originalIndexingCode, - schema, - indexingCode, - onMount, - isCreateNewIndexer, - launchPadDefaultCode, - launchPadDefaultSchema, - contextCode, - contextSchema, -}) { - const { - dragBarRef: dragBarRefConsole, - firstRef: firstRefEditor, - secondRef: secondRefConsole, - } = useDragResize({ - direction: 'vertical', - initiallyHidden: 'second', - defaultSizeRelation: 3, - sizeThresholdFirst: 60, - sizeThresholdSecond: 20, - }); - - const defaultCode = launchPadDefaultCode ? launchPadDefaultCode : contextCode ? contextCode : originalIndexingCode; - const defaultSchema = launchPadDefaultSchema ? launchPadDefaultSchema : contextSchema ? contextSchema : originalSQLCode; - - return ( -
- {/* Code Editor */} -
- -
-
- ); -} +export default React.memo(ResizableLayoutEditor); diff --git a/frontend/src/components/Editor/EditorComponents/block_details.js b/frontend/src/components/Editor/EditorComponents/block_details.js deleted file mode 100644 index 64780ad94..000000000 --- a/frontend/src/components/Editor/EditorComponents/block_details.js +++ /dev/null @@ -1,1643 +0,0 @@ -export const block_details = { - block: { - author: 'continue.poolv1.near', - chunks: [ - { - balanceBurnt: '1486252472505500000000', - chunkHash: '3qxSWuuo5QLdgpYSuwtQcAcAoX91b6p55CLxjda2wNNw', - encodedLength: 1772, - encodedMerkleRoot: 'ChpbnZdB2NdSaC2ir443zB4Bv6WUMSDBY6n3RfDyEVs', - gasLimit: 1000000000000000, - gasUsed: 16028665261860, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'G5c89nTRQSRYPdJQFcP47YXccbmbrbutNwLZzKUeRG3f', - outgoingReceiptsRoot: '5GrcVRVw9njFAskhcEbUyPZAoKMEEjGnC6edUhupEDkj', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'CRaTBLfd55cw6i5GfVvVSo1rw5ioZ91hT3ZVo5eBmNCi', - rentPaid: '0', - shardId: 0, - signature: 'ed25519:4Fzq1idZFShNtErzbK5uZWDcnWhHTMshVBvXG9c8cvc3YPkHF8SVgRsMym6V3WNHVY29gNaw1kXPCLBApcZ2bA1h', - txRoot: '5uqwhjC7wRJsvidh7gjtRRPvvUVwyefdQCivBMTL1hak', - validatorProposals: [], - validatorReward: '0', - }, - { - balanceBurnt: '1433581134734200000000', - chunkHash: 'BqfFW2NyLJuyp1pGgXd2ffYPGptNswNVH6ZJuTq5zSNa', - encodedLength: 161, - encodedMerkleRoot: 'EB5tG2a3aVfXv41ESuQVT1ZvQFvuwKnkYGLc2CDVCf5w', - gasLimit: 1000000000000000, - gasUsed: 19438956235189, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'Cp7GeqLAqZ1Z1GbtCL5nG13wxy6mV6PaRdwLddDHjhVc', - outgoingReceiptsRoot: 'DP1DT6QP1tNHM5ZjHMJ3C8G2mHJd8kGoFFNEdZPN8Hyx', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: '73sn3JyP1LU58r1FsTo5ZVgvErdbEGFxtiGExkWwhQUd', - rentPaid: '0', - shardId: 1, - signature: 'ed25519:3RYj6fpboT1ALHsVxYtYmofT8fGf1VRhNaJhWY45hsKdePcX3AZb3rdKBAZMThF5PVn5j5boKWHPb9zd1xZWYzex', - txRoot: '11111111111111111111111111111111', - validatorProposals: [], - validatorReward: '0', - }, - { - balanceBurnt: '242806857164400000000', - chunkHash: '6uDUqFuYwGohFMQ9UyRaHbmHALf8HS9F6WcNnZWypkka', - encodedLength: 1474, - encodedMerkleRoot: '9rtC25N5jqfLxMumUwvupL9MpMNUAEKuXZB8RmfkdD7p', - gasLimit: 1000000000000000, - gasUsed: 2428068571644, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'AvRw1DBT1JFB2KNuahMvYucvttrem74GSEnwMacxbkv6', - outgoingReceiptsRoot: 'C2QjTGsH8HcfR6W7ecLYwuYD3Vkw6mi9Pf9tFXuGdMLr', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'CtxzDGCGs1SAr7GEqrA8gSKCcbaPDMKegnTyPEJmU7mb', - rentPaid: '0', - shardId: 2, - signature: 'ed25519:66LFkWB13BEUYRsmockx9LbiBzko9zohGkfbLwJertYWAa5TJY5ELFxPycps6poroh1C7Tfbh6NH7tQpgHZFr43d', - txRoot: 'DVr9U4uYvJY1cz5awdSmKm4CovJmr1VcPyqCMonat8bD', - validatorProposals: [], - validatorReward: '0', - }, - { - balanceBurnt: '599537042985400000000', - chunkHash: '3Q39LzrowGBhqRZvkjDqQNjkfUEYEK6Zis5LUzqvrtFj', - encodedLength: 1837, - encodedMerkleRoot: '2d1EBsn1UspGLYjyFkrzPoawjghZe4fBbWkZfmsPJRbM', - gasLimit: 1000000000000000, - gasUsed: 7599093905353, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'CUmJsZfPtNYEggezXf6wW7NX2i7Vn9yuPz7RWfVKxR7p', - outgoingReceiptsRoot: '8TG5j9ahcEtGUNREhCEJW3SgHyeCzochf4foYxSU7b8Q', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'EPbgnc5qJFvFGqqAyQQu2SrFcVr6mr3AVbSuXnHvZ1ie', - rentPaid: '0', - shardId: 3, - signature: 'ed25519:RgPmNaXij3pNFdMVi1Ex8WXyQiYr12uUyRk5tuoddJvCTwJXcxQZZLCdy1XqB6uB9imMz9NsXQwT1M993NBMsjS', - txRoot: '8V1iVH9TSzWsPtNVorScHc4ha9ESNqNEG13tZiRSDzk7', - validatorProposals: [], - validatorReward: '0', - }, - ], - header: { - approvals: [ - 'ed25519:3XJG7eriCesmFBP78Q6iECzr34boAvEKn1nMintoQyf8MGf6TUzkjH91jvnb3putUvCicXDzgQjYrjbqTrgQZdTB', - 'ed25519:238a4WVjhbpubpMhMi2wKzR6wjoVLZ7788KPE3a3RzkppLzd22CChmEHHEyqsFj5VpWFVr13iTmgcgh2MomMxhxQ', - null, - 'ed25519:3hE7715teaeQE2UNWuZy9T6B7yA833NeBZuEsfYnHWGmGvQtApVwyX5QsVF1NV8cT24yQTus1u98JPjUr3X1XBdG', - 'ed25519:2JFfKfhtZFLrqNHSKWfojnQ63986w9BDVckL88ny3wzmEgextjkvAAmg12EjsmCwXUdc2VZ6zFBwto2pMVSovHcE', - 'ed25519:3V28c6KbuvuV21W5h8AsbjfZYQXA7aPJEsBi97xpJWAtULikSqqjSVhoLk6ckiAhG83G2nUWc12M8bcroyRB9Lso', - 'ed25519:5rp3ZGsLKo6oHrUix29cEDdfMAeiWuPmaQEh4T22pCPFEGMQ4jf5WRG8PZKv8zKGeia7NJrWy5iR88k2KF554c7A', - 'ed25519:2is1ybPjjGhJGJx7BTWbtXVbQNauwEAZLywtZFGrjLPyXdekxGqG695K3W9q7xnfCJYEXzUxpcANhcL1viG7fG3F', - 'ed25519:3h8Bx2e8Zb5wRw9Cph29FGm1pvWhopqSfbWzQeeawQAssSAd2fcy32yJGtZabHtLp2VRRznv6CgotS4Cc2JWRjUR', - 'ed25519:v7cD1AUXxnqamFqZU3mg3h7zAx6rWZvWARsZhCc28zAHrTM3YgEJiEJCbqcTDtRRCxC2uyBwzzmZftaDum8p5Py', - 'ed25519:5VDMQYTp59pwJ1eVHjcFSUeQnmnkBC9F8jEHwjxoJb1YewM8VAgQCb718r4EpV9Z41MHW57i9H3gP9JHSWJiZUL2', - 'ed25519:2zwMz7w2MJHpg8F4G9AAu5UEy6Yo2TFw1VGFCAUsQrP3WwGDwUbsCR63Y88M9v4aWFdyr38no6yzd2DEsrQQCq7b', - 'ed25519:3M3cA2X1DqWdiELg7PKuFDf8u9MJC2rNhiHccZBYJxZcvKeomgRhGLcgjniEiAmC4uaYq86ePKY7e68smydbXRFr', - 'ed25519:5hX41Uom35xmLD5pTVaxEXzzQMJiS5Vi4Eyd3bBHcd2dKbE4g49AyCmCJ3Mpqr1xEEMsWGKtcLAFpAkhEyiTS73H', - 'ed25519:42kqMAMQdA1b1No1PhLwp8FL2g789vkwHTshiHLjvqSfJ4t6B8krevBj3Z2AmeEYduGMZGNaMcDmFG43vifoX15F', - null, - 'ed25519:4AxJBk1cK9sqHwP4F32KQ21tj37kroBqMyesqXy2ksF8MWmXpxC3R2UKwFJRp3EztNaD8EM2vy7oFRmdumZcM2Gf', - 'ed25519:3KJDnpo4vxwyBDE11AWVRrnyGh9fYgq1GrsinEUKdwkVSCGKGv3rQrm19y5drxZEsqRw39D1bws1scc1TniCv1AX', - 'ed25519:PapbiGeqfur5csDNK3C9Cky6eLUQxzQXDPmE441MqFv5x1VDmEe2ZqHQecjiU6p18o1sQMGwgMARQZxHFDenYLB', - 'ed25519:57Pz4cEpBK2WCMnSaqt4jswZ4QYyhcRx1xG9pD44mp8mLCG3ogJhrq23eFF2xMizUzEDSD7AVMG1tByRob8VCZYm', - null, - null, - 'ed25519:5qNA6byTPhr6GHyTGxEZfRX12tYbqiYy7dQ4kdZVx4PW3i7s5i4q3ZUmwqP5rq6bdxx5fGkdMUVc3sqomz2dErE7', - 'ed25519:5YcgeAxawhVaTnvuRTWbPCtDtS6NH2UrNjeXcn89eXbKHTqeWtHsXKAb1NptrLgKr8K5WUGXjTKicz1xJyv9HgNh', - 'ed25519:sqZFxPtQpBnWUzcuPJeQUqyp3z3vYDYYe7Fvgcu4pVA46ueaU1oyTBpoMakY7pkZGyPq4jmgEamS3Bupf1W8KW3', - null, - null, - null, - null, - null, - 'ed25519:291jQZp5NAeogGttS75JYoqaenVKkQHP8M1YXSB8kpB2UJWN4wn7CCPZUxSPPSsPYmvYfpX3pkrxhJ7gAms9h743', - null, - 'ed25519:W2igco7sqdc9am1aVYA59yfPUVCJ8v4y6G5GAgfN9xpHy9r5QCKmatHpVJ6FMzinhy9GkCiZ3qJizbQBSWScwcP', - null, - 'ed25519:4q7PyxNTZtEdoSQf4azWVmXVs851JH9aYJc9B2H67AdkmM5sBz2gDFce1b9c36xWccUtf7cDDGBE6YPAf5eELax6', - 'ed25519:3ECDJscq5C3JLy6XeqAX5qKSvk8KXRjucJPjCiTW7vLmwb5C1MHR8VUZa6ufpN5chHMgFie2L4D82nMuPABPkXmz', - 'ed25519:29VK9ikBVSp2ZDBKhLDXC4QbA3XXAp5gdMRvVtANNDW29M6boo939HXpwhazhVSJydft8x4WFNfrJUykGrPHtQi6', - null, - null, - null, - null, - 'ed25519:5nUAvGput21GYcbAYuPncCvhyMSQuoKD2eLxb3pUVhLcPyYCxETWwtY4k5AL1p5aR7c9aBG1cfEqUXRB99Y2zwYJ', - 'ed25519:3mae6hCDVnY1WrV1N74xnTkvN5ihTn8Y9SKUPY32zS4jpqJWKzdopgX7KZniiFkC41JhD4vQjWwKChvxfaztBKq6', - null, - 'ed25519:5XjF6gyHudHwy3b48eGsED47myBjxB2dxvYZG2m954eQquMyLcVwKRZJvAXbzbHKehXUP8r9eeL3rm2LriYsx1dD', - 'ed25519:5vtjieSMvoYXYYP3zit9x6Dd7qVRDPYmoBZfELvouSX5ur9dnHmUnjEAXsWSWB69obm6hnfJz1Bx5gkXjLvyen3X', - null, - null, - null, - 'ed25519:3WK1bgn3qqzSiZcEphbKcw6UajNSDdLSYeGYMSMGH4YMdS7FnFKAhdigotRZ8z32adAzZp1URjd39yBHBibJVnDJ', - 'ed25519:3hkDFUQhi9pDWKtb6YtcuFy56QY9CkhAKvEwrg99wFYtmcYicN5N3tSu3bSKpFFEWop3qsvr5rCc3zWwkqKVT2nb', - null, - 'ed25519:rpALm3QcZov6qnDscsyyKwtgLSXVjppugEgM1DAzMw6Ewk2ovVAtow5frCV7nc1umnDLuxfLSfRNxkjeDqgAr4S', - 'ed25519:282Bw4icWLoUEAa6KUmixVeGSjjt6o1GAMcLypc1ruCqneENnzPC9hVqUWWGe9PmHU6GCEDoe79Y8hGpP9GuDYdA', - 'ed25519:2JQENivaSR9iDsbEXB3gz6PdqBiNbWRKU1e9XvcChzwtHp3gcCMW6Gnr362ktodDcjtcxZzyR4mHKBgREm2iRDJC', - null, - 'ed25519:35ffy6YAW7V1VSF1XcYNQUXnQxgYyNpsaUWEF3Gu7LgijZkdFqVdbPxfQpKCntWuC3LLrb8Vs1a3WNHgmEcub4Ng', - null, - null, - 'ed25519:53swEewwpM15AN4uBW3DPSdX4VTcx7XvP7d7LZNtxDga7JnNXZXVYJeNw31ui9LB1ffnHMNyAFoiQMLm5bnPQcsq', - 'ed25519:3Wb7R4K6DXA3o3DDAEwaYNY72SwqUadjqesMYvq9cmhoHm2UtyDMp1wPWCWMLQ4BfrshGdMgryvSn8cpeiVuv5HN', - null, - 'ed25519:5gGB9iTkt31SvAYaR52WfYf51uhhUb3CTf9RDN3MXoD3VR4m8fwBgRpmeu2Txb1RQJCwczxfYByYuRJR3orKkXA', - 'ed25519:2L7h92UaYwSXGBTqVkuhpRKZwRpW2wB7568U6jcBnH3iQtj71jERJdAtru62dx17teRngxJjDzMAG2Hs273Nt4cn', - 'ed25519:DL2QVuWC6CWrr519nQiKRtgC2H59ebBKNb5MjAKyv64zF3VrguWKQCcfaRUGgugiVeUjx12m2QfQigHmrqHWPmi', - 'ed25519:2uRyW8QrTaxdeX11tKxFmCY1FZbHbz7iWKxrNzGV9jiJg56BJgRKSZKbFpzPTakWMsesUfUUq4HNB4YsE6pvJSsN', - 'ed25519:2JB1CzirhvYfDVhay5jdzW5zGhGCLftfAB2Ff1ByNRnrvN7osvswuzLGHYDbmdMPdhC1ZTqeNCmKnQHzqQxKSjzN', - null, - 'ed25519:4YNGqdPNKGGDcuWAnW1DFJfJ6Qeqz5wh7rGLj7gSK2jXYUh9vnuXcKoC2fBWsTKtfawncDyKE7sAfW3THaSqrDDM', - null, - null, - null, - null, - 'ed25519:KhbmAUdmHgTuVkUsBX2PdbPsLgKMtr8ds7pWrb1otn5dKidQJc8Vdtq5MBZUrn6pRL2d96YWL9jxTBpgBqrbn2M', - null, - 'ed25519:MZT25bZDDxDJP4CRhyTK17Qfr8oWroVdyRuTccpA3Ynhf3PwB1WcC31XwugD6L5LCtMU1hyCPbE16bk7NksHhHC', - null, - 'ed25519:2BWXNtCGqwLG9yu8KkRnT1tui8GcynBN5DrhtfNQtFotSHphtABu1iNucrd82aPTegFogSMDA2cvhhrgpu4SRevc', - null, - 'ed25519:4EFt6q2MUjvcvZrCFXY2amqBcd36gKezF3FFHWsGwtJcqbH4brTHMH5THio3pXFYCWY8mtQTpLZ9SnPUWDyVKxnA', - 'ed25519:57js3GUGprV3Rc5Aci4Ws2JciuuWMhmApPPmyhYJXcz67LuwTT4KCnhFNZYDzGnV2ueP1irNUFFUXhC6HXa7amUQ', - null, - 'ed25519:2uJEgTHUV1qSLLDSjuA6NBDdJur5Xh9wKQ9sHWmpwpePyknc93J64YVZxnidG2EDAKVBSDm9kpBndMXGNEXjqEew', - 'ed25519:BzXpv857MvdsUkgCdZRAspbAhrKqibxXs7JqSt2KkzjCm9JgsxiCGf5GJCYC3gV3NJfC4p6zst8UYezQ43LAkT1', - 'ed25519:3hX4uGLHK2GRCTng7SBazenaXxSHSscJyRCKgUpKiQfHMJ7BsVvJb9obJfSNN3ynfCNmRtoUiB3tE46xHKqZ73rt', - null, - 'ed25519:2VyXyzSMCS6nzA2rDVwoZJLt2k1Zx3c4wQMx15SBx3mYbjevfdt6ErHH4GvF7PMqnXAUEgCTzWoJ54NeV5nWbM9b', - null, - 'ed25519:2FURA8ZJGN7gTtoaGgYvNkQE46rNLmrwSqqNVhzevUg3MP6GNt821vqMpsfrR5t7mFy5pk5inzrWYZcELZw5LHKz', - null, - 'ed25519:3JHQcPV1nTLsqSTboA4NavexkhmYxDsiDun49KFVEZQRuxoNHuigJL1jBW78T4nRRPPowESosCZgmpgsWDb5UDAK', - 'ed25519:2yqmma3px8io4Dd7ezg5H5d3C4Rueyi3aok9agpzpowU4vPxj2Y58h3Mu2qPSYBUtT75DgEcTtiZaMjQsBMfjCj7', - null, - 'ed25519:647bt2zPCma9kZqZmaR4HshKrERRUiFg3KT1G6S5aeowmoELvLhHcwZyAki4hW8BtgdW5GuEu2pPRXFsoTbEcASC', - null, - 'ed25519:4kv1RTxeFCRxc6shxqwfmmL398dJDGjKvFPn9PuaJJoFZTBkkFDaNuMDagoBrfgZYBhb7eZ26vKAoPK3vBVUGZgp', - 'ed25519:4P183Ceq88jLBs1cKoANgrmTBDCsvbJVRYgBH4iYyK76bYrw795DkgMaQKsWo3ZFjMHH3fC9nZ8C4WNLwkJZVfE4', - 'ed25519:CbQsnkfYhEZ32hfTrj4d4MYd4duFep6zY1cqRUFqt74WtxQHWU4mVL4qoxgvQgfeWPLiev9FRVaFLK4VnL9jYsZ', - 'ed25519:4kFsUdepZzP9oVCYWdzNq3iHURJdNn9GHj4gJgeaHPVWFpbue52zagJpmh4hsNjhDXX5tkL3TQzcd5HTWjNcqgDC', - null, - ], - blockMerkleRoot: 'FYpXxjbPZ5FoB57ZcPMvvs94x52wbCJdhxYs6qnGaZsm', - blockOrdinal: 75337992, - challengesResult: [], - challengesRoot: '11111111111111111111111111111111', - chunkHeadersRoot: '5AzFQd9Ds8yWynns4B4TFFcBGSh24ze2jApisECRYEib', - chunkMask: [true, true, true, true], - chunkReceiptsRoot: 'CsBRzd4FJe8Qr22wDkQXtxaVs5z2Jmrk2ZQC1PBrHRoV', - chunkTxRoot: '9DwCvRfUYzaxHCjWEWDR3WxJfn9gPoignTYXmEN9D6wC', - chunksIncluded: 4, - epochId: '4GoC7oSPLfaXo3Gz9z2Rkb86nN1fM8qVd578gTAmf1fn', - epochSyncDataHash: null, - gasPrice: '100000000', - hash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - height: 85376002, - lastDsFinalBlock: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - lastFinalBlock: 'C3KNVyUKZ8uR166dc5vUKPQdsW5CL2mn4oerbMQFcQp5', - latestProtocolVersion: 58, - nextBpHash: '5BaNTEgDB11HxTGNKvQRJSytiv6ZM73YrJjxBymYau7', - nextEpochId: '3jvt2LuA1LZGQwKtbcThcjT4twe4juCfqwSEiuktBrqH', - outcomeRoot: '5dDKr6oN9bh1bxePyq2HbAWTA792ZRQSvfvcmTTrySi9', - prevHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevHeight: 85376001, - prevStateRoot: '6Y3XsdVvhHj3wcGVbXNQNg3qh46HHQA5FPKUoigHPVYr', - randomValue: '3SPgojnHE7CFj7bue5w8CsYDvg5Ffskue8qPDZohqQJh', - rentPaid: '0', - signature: 'ed25519:5kjuiCWar11gt9BSRncbEaUnwoL1Nx5tzdnxrnBzgWhjHdfH2QfDajYqdy4bkXaU3UJ6TQDGcLz7pPiNLR3mmnQS', - timestamp: 1676579182274205000, - timestampNanosec: '1676579182274204901', - totalSupply: '1121201720917794037313140715777439', - validatorProposals: [], - validatorReward: '0', - }, - }, - shards: [ - { - chunk: { - author: 'figment.poolv1.near', - header: { - balanceBurnt: '1486252472505500000000', - chunkHash: '3qxSWuuo5QLdgpYSuwtQcAcAoX91b6p55CLxjda2wNNw', - encodedLength: 1772, - encodedMerkleRoot: 'ChpbnZdB2NdSaC2ir443zB4Bv6WUMSDBY6n3RfDyEVs', - gasLimit: 1000000000000000, - gasUsed: 16028665261860, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'G5c89nTRQSRYPdJQFcP47YXccbmbrbutNwLZzKUeRG3f', - outgoingReceiptsRoot: '5GrcVRVw9njFAskhcEbUyPZAoKMEEjGnC6edUhupEDkj', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'CRaTBLfd55cw6i5GfVvVSo1rw5ioZ91hT3ZVo5eBmNCi', - rentPaid: '0', - shardId: 0, - signature: 'ed25519:4Fzq1idZFShNtErzbK5uZWDcnWhHTMshVBvXG9c8cvc3YPkHF8SVgRsMym6V3WNHVY29gNaw1kXPCLBApcZ2bA1h', - txRoot: '5uqwhjC7wRJsvidh7gjtRRPvvUVwyefdQCivBMTL1hak', - validatorProposals: [], - validatorReward: '0', - }, - receipts: [ - { - predecessorId: 'app.nearcrowd.near', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJhY2NvdW50X2lkIjoicmV6ZXJ2LTI5Lm5lYXIiLCJzb2x1dGlvbl9oYXNoIjpbMTY2LDIwNCw2NSw3NCwxMTksMiwyOSwzMywyMTMsMTA1LDE2OCw0LDE5NCwxNzksMTk3LDUyLDI0MSw1NSwxLDEwMSwxNTcsNjQsMTI0LDAsMTE4LDY3LDE4NywxMjEsMTMzLDQxLDIzOSwyNDNdfQ==', - deposit: '0', - gas: 200000000000000, - methodName: 'approve_solution', - }, - }, - ], - gasPrice: '335989893', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'app.nearcrowd.near', - signerPublicKey: 'ed25519:CXYkSHvK2rj6sCGbaKPbTtwhcMrPvWxs1ntVvA6vLtm2', - }, - }, - receiptId: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', - receiverId: 'app.nearcrowd.near', - }, - { - predecessorId: '7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6InJld2FyZC1vcHRpbi5zd2VhdCIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAwMCIsIm1lbW8iOiJzdzpyZXc6b3B0aW46WUdSV3ZncFhLMC03YThiYTFiZDgwNDg2Mzg4M2FjZTEwZWQ3NjQ0MWU2YWQyMjM5YWU3OTE3Yjc4Yzg5NzAwYjcwMWY3NWNlMWFiIn0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - gasPrice: '109272700', - inputDataIds: [], - outputDataReceivers: [], - signerId: '7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab', - signerPublicKey: 'ed25519:9FNEMP92rkuvRVefVkBW38RmbZ648XvQGeWbFYtdC7hk', - }, - }, - receiptId: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', - receiverId: 'token.sweat', - }, - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '67682508099918060916120' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'app.nearcrowd.near', - signerPublicKey: 'ed25519:6MP4bCPHEud33eKXM9kg7f9fVNhmn97CNUyn5ZwM375U', - }, - }, - receiptId: '5GMwBgfhgASLVXkCsqMn2riVbByJPh2pmyxCeQmbHHWe', - receiverId: 'app.nearcrowd.near', - }, - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '13222602662027447938448' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'olezha4.near', - signerPublicKey: 'ed25519:EnLNUDncRuw4AYLcGmi1Hr2YQ1DLu12VutsubZ6k8c2F', - }, - }, - receiptId: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', - receiverId: 'olezha4.near', - }, - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '13239855304236542651168' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'marthacecilia.near', - signerPublicKey: 'ed25519:8W28RYFfXztNA7ENP4VTaitsqEjSbABQJDqELwbwXswq', - }, - }, - receiptId: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', - receiverId: 'marthacecilia.near', - }, - ], - transactions: [ - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '3W8KnZUsb7Mb3SZk7yygL5F2L2C6djxZ3fVumodB2KQe', - outcome: { - executorId: 'app.nearcrowd.near', - gasBurnt: 2428314524384, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY'], - status: { SuccessReceiptId: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY' }, - tokensBurnt: '242831452438400000000', - }, - proof: [ - { direction: 'Right', hash: '8AS32PCfmnnsgkmrm2QH6ULKdTBS4o3EjcU2FZ34dTux' }, - { direction: 'Right', hash: '8PVbKv5bqbBoTUkXbcQ8sWEYbUDKo8hv8S1JHKVrftCz' }, - { direction: 'Right', hash: '8VRHTUKsUcZRDgrKizV5sup3Zvzg6reRacn3KmeUVY9n' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJhY2NvdW50X2lkIjoicmV6ZXJ2LTI5Lm5lYXIiLCJzb2x1dGlvbl9oYXNoIjpbMTY2LDIwNCw2NSw3NCwxMTksMiwyOSwzMywyMTMsMTA1LDE2OCw0LDE5NCwxNzksMTk3LDUyLDI0MSw1NSwxLDEwMSwxNTcsNjQsMTI0LDAsMTE4LDY3LDE4NywxMjEsMTMzLDQxLDIzOSwyNDNdfQ==', - deposit: '0', - gas: 200000000000000, - methodName: 'approve_solution', - }, - }, - ], - hash: '3W8KnZUsb7Mb3SZk7yygL5F2L2C6djxZ3fVumodB2KQe', - nonce: 43616777771952, - publicKey: 'ed25519:CXYkSHvK2rj6sCGbaKPbTtwhcMrPvWxs1ntVvA6vLtm2', - receiverId: 'app.nearcrowd.near', - signature: - 'ed25519:5KcVvC1zzJZkk92uWzMoD9e2fvded6JdgUApuV6NDCcY7YEhzVtUQaVPomQ4ZpDydtUyZmgxTXcqaVp5c54wciEX', - signerId: 'app.nearcrowd.near', - }, - }, - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '3GYUTXHUQMH1kpccEms6yNVzckyAedUTWKPQpEN4tc5K', - outcome: { - executorId: '2fe75000c84efd3b64f88f61d88cd08c339b8c6654e6239f7d4e3592aa92c659', - gasBurnt: 2428312288450, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['7CmRnTXnY3LmX7PojrByXqZpirVNVSuHgL9k3uhbdKm1'], - status: { SuccessReceiptId: '7CmRnTXnY3LmX7PojrByXqZpirVNVSuHgL9k3uhbdKm1' }, - tokensBurnt: '242831228845000000000', - }, - proof: [ - { direction: 'Left', hash: '5Bf7Pbbnwt6THJBxQ3mBkpc8WD2GBLoXrte6HYJZU6yh' }, - { direction: 'Right', hash: '8PVbKv5bqbBoTUkXbcQ8sWEYbUDKo8hv8S1JHKVrftCz' }, - { direction: 'Right', hash: '8VRHTUKsUcZRDgrKizV5sup3Zvzg6reRacn3KmeUVY9n' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6InJld2FyZC1vcHRpbi5zd2VhdCIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAwMCIsIm1lbW8iOiJzdzpyZXc6b3B0aW46WUdSV3ZncFhLMC0yZmU3NTAwMGM4NGVmZDNiNjRmODhmNjFkODhjZDA4YzMzOWI4YzY2NTRlNjIzOWY3ZDRlMzU5MmFhOTJjNjU5In0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - hash: '3GYUTXHUQMH1kpccEms6yNVzckyAedUTWKPQpEN4tc5K', - nonce: 70681752000024, - publicKey: 'ed25519:4Dzjg5EJX1RBYctnzmi1SNoq6fswSowsiWB5m3sEcC4Q', - receiverId: 'token.sweat', - signature: - 'ed25519:5NuszWGgsVB5yPWqvGMGP3yCjs5YVh3QtWw79kch5mf3ApSVqpzTD42TzAsKcmhauDYDhzU8SUU9dGx2rHodJRLn', - signerId: '2fe75000c84efd3b64f88f61d88cd08c339b8c6654e6239f7d4e3592aa92c659', - }, - }, - ], - }, - receiptExecutionOutcomes: [ - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', - outcome: { - executorId: 'app.nearcrowd.near', - gasBurnt: 3300309921959, - logs: [], - metadata: { - gasProfile: [ - { cost: 'BASE', costCategory: 'WASM_HOST_COST', gasUsed: '3177217332' }, - { cost: 'CONTRACT_LOADING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '35445963' }, - { cost: 'CONTRACT_LOADING_BYTES', costCategory: 'WASM_HOST_COST', gasUsed: '104961404250' }, - { cost: 'READ_CACHED_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '86640000000' }, - { cost: 'READ_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '13049316000' }, - { cost: 'READ_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '315510639' }, - { cost: 'READ_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '7551495558' }, - { cost: 'READ_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '19712400' }, - { cost: 'STORAGE_READ_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '56356845750' }, - { cost: 'STORAGE_READ_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '154762665' }, - { cost: 'STORAGE_READ_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '123442110' }, - { cost: 'STORAGE_WRITE_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '128393472000' }, - { cost: 'STORAGE_WRITE_EVICTED_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '706580754' }, - { cost: 'STORAGE_WRITE_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1691588808' }, - { cost: 'STORAGE_WRITE_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1675001106' }, - { cost: 'TOUCHING_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '418650854076' }, - { cost: 'WASM_INSTRUCTION', costCategory: 'WASM_HOST_COST', gasUsed: '24383196816' }, - { cost: 'WRITE_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '11215179444' }, - { cost: 'WRITE_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '588334752' }, - { cost: 'WRITE_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '11462089944' }, - { cost: 'WRITE_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '843947208' }, - ], - version: 1, - }, - receiptIds: ['8kGPN9gvU8dhZy3374rTa3LjtxcZcHcZkXRAf56si2vh'], - status: { SuccessValue: '' }, - tokensBurnt: '330030992195900000000', - }, - proof: [ - { direction: 'Right', hash: '8uFcqYe8azbspu5mofVCt5TC6K4n6kTbNBRwDt3CRT6Z' }, - { direction: 'Left', hash: '9C9aaY5ECUzq1t2NtXQVXTH6wZ8sBExs33KhVNmjFnQJ' }, - { direction: 'Right', hash: '8VRHTUKsUcZRDgrKizV5sup3Zvzg6reRacn3KmeUVY9n' }, - ], - }, - receipt: { - predecessorId: 'app.nearcrowd.near', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJhY2NvdW50X2lkIjoicmV6ZXJ2LTI5Lm5lYXIiLCJzb2x1dGlvbl9oYXNoIjpbMTY2LDIwNCw2NSw3NCwxMTksMiwyOSwzMywyMTMsMTA1LDE2OCw0LDE5NCwxNzksMTk3LDUyLDI0MSw1NSwxLDEwMSwxNTcsNjQsMTI0LDAsMTE4LDY3LDE4NywxMjEsMTMzLDQxLDIzOSwyNDNdfQ==', - deposit: '0', - gas: 200000000000000, - methodName: 'approve_solution', - }, - }, - ], - gasPrice: '335989893', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'app.nearcrowd.near', - signerPublicKey: 'ed25519:CXYkSHvK2rj6sCGbaKPbTtwhcMrPvWxs1ntVvA6vLtm2', - }, - }, - receiptId: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', - receiverId: 'app.nearcrowd.near', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', - outcome: { - executorId: 'app.nearcrowd.near', - gasBurnt: 5360036359518, - logs: [], - metadata: { - gasProfile: [ - { cost: 'BASE', costCategory: 'WASM_HOST_COST', gasUsed: '15091782327' }, - { cost: 'CONTRACT_LOADING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '35445963' }, - { cost: 'CONTRACT_LOADING_BYTES', costCategory: 'WASM_HOST_COST', gasUsed: '104961404250' }, - { cost: 'READ_CACHED_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '592800000000' }, - { cost: 'READ_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '62636716800' }, - { cost: 'READ_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2698946430' }, - { cost: 'READ_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '42791808162' }, - { cost: 'READ_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '125075178' }, - { cost: 'STORAGE_HAS_KEY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '54039896625' }, - { cost: 'STORAGE_HAS_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '738980280' }, - { cost: 'STORAGE_READ_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '281784228750' }, - { cost: 'STORAGE_READ_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '4859547681' }, - { cost: 'STORAGE_READ_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '4253141790' }, - { cost: 'STORAGE_REMOVE_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '160419091500' }, - { cost: 'STORAGE_REMOVE_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1605256128' }, - { cost: 'STORAGE_REMOVE_RET_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1141624044' }, - { cost: 'STORAGE_WRITE_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '449377152000' }, - { cost: 'STORAGE_WRITE_EVICTED_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '9121315188' }, - { cost: 'STORAGE_WRITE_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '6977803833' }, - { cost: 'STORAGE_WRITE_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '11880100437' }, - { cost: 'TOUCHING_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '933913443708' }, - { cost: 'WASM_INSTRUCTION', costCategory: 'WASM_HOST_COST', gasUsed: '83208605304' }, - { cost: 'WRITE_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '50468307498' }, - { cost: 'WRITE_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '3500047020' }, - { cost: 'WRITE_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '48713882262' }, - { cost: 'WRITE_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '4824184716' }, - ], - version: 1, - }, - receiptIds: ['HF5rs8fq4n8HygFMYiQ8nWZSpVncKBnCXj9aNpvzZsAP'], - status: { SuccessValue: 'ZmFsc2U=' }, - tokensBurnt: '536003635951800000000', - }, - proof: [ - { direction: 'Left', hash: '2Lon5RSqBvnuGcXgkneYZTUUup6CotQYqEbi1eYfBfVK' }, - { direction: 'Left', hash: '9C9aaY5ECUzq1t2NtXQVXTH6wZ8sBExs33KhVNmjFnQJ' }, - { direction: 'Right', hash: '8VRHTUKsUcZRDgrKizV5sup3Zvzg6reRacn3KmeUVY9n' }, - ], - }, - receipt: { - predecessorId: 'evaenergy.near', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJ0YXNrX29yZGluYWwiOjEsImJpZCI6IjQ0NDQ2ODcxMTE2MjIyODMzODczMDc2In0=', - deposit: '0', - gas: 30000000000000, - methodName: 'claim_assignment', - }, - }, - ], - gasPrice: '122987387', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'evaenergy.near', - signerPublicKey: 'ed25519:9Q53x5kiLChb4tX3J5dV2wNAdTetejEcnizyQ3n3PZdg', - }, - }, - receiptId: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', - receiverId: 'app.nearcrowd.near', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '5GMwBgfhgASLVXkCsqMn2riVbByJPh2pmyxCeQmbHHWe', - outcome: { - executorId: 'app.nearcrowd.near', - gasBurnt: 223182562500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [{ direction: 'Left', hash: 'BcJG6WkrSgW8dsc8iBJHNZcP7576vvRQGBagZZfuXkmG' }], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '67682508099918060916120' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'app.nearcrowd.near', - signerPublicKey: 'ed25519:6MP4bCPHEud33eKXM9kg7f9fVNhmn97CNUyn5ZwM375U', - }, - }, - receiptId: '5GMwBgfhgASLVXkCsqMn2riVbByJPh2pmyxCeQmbHHWe', - receiverId: 'app.nearcrowd.near', - }, - }, - ], - shardId: 0, - stateChanges: [ - { - cause: { txHash: '3GYUTXHUQMH1kpccEms6yNVzckyAedUTWKPQpEN4tc5K', type: 'transaction_processing' }, - change: { - accountId: '2fe75000c84efd3b64f88f61d88cd08c339b8c6654e6239f7d4e3592aa92c659', - amount: '31778755366428489684978', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 182, - }, - type: 'account_update', - }, - { - cause: { txHash: '3W8KnZUsb7Mb3SZk7yygL5F2L2C6djxZ3fVumodB2KQe', type: 'transaction_processing' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406007009136306129113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976751, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406007009136306129113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976842, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', type: 'action_receipt_gas_reward' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406033168998233329113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976842, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406033168998233329113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976788, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'action_receipt_gas_reward' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406121128031869529113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976788, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '5GMwBgfhgASLVXkCsqMn2riVbByJPh2pmyxCeQmbHHWe', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559473803636131787590029296', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976788, - }, - type: 'account_update', - }, - { - cause: { txHash: '3GYUTXHUQMH1kpccEms6yNVzckyAedUTWKPQpEN4tc5K', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 70681752000024, permission: 'FullAccess' }, - accountId: '2fe75000c84efd3b64f88f61d88cd08c339b8c6654e6239f7d4e3592aa92c659', - publicKey: 'ed25519:4Dzjg5EJX1RBYctnzmi1SNoq6fswSowsiWB5m3sEcC4Q', - }, - type: 'access_key_update', - }, - { - cause: { txHash: '3W8KnZUsb7Mb3SZk7yygL5F2L2C6djxZ3fVumodB2KQe', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 43616777771952, permission: 'FullAccess' }, - accountId: 'app.nearcrowd.near', - publicKey: 'ed25519:CXYkSHvK2rj6sCGbaKPbTtwhcMrPvWxs1ntVvA6vLtm2', - }, - type: 'access_key_update', - }, - { - cause: { receiptHash: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'U1RBVEU=', - valueBase64: 'EgAAAGFwcC5uZWFyY3Jvd2QubmVhcg==', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'YQ4AAAByZXplcnYtMjkubmVhcg==', - valueBase64: 'psxBSncCHSHVaagEwrPFNPE3AWWdQHwAdkO7eYUp7/M=', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'cAEAAAA=', - valueBase64: - 'AABAe6XwY4GWCgAAAAAAAAAA9ESCkWNFAAAAAAAAAAAsAQAAAAAAABACoJtTF3zmCgkAAAAAAADcEUiC7mdEF6E7rAAAAAAABgAAAHQBAAAAYrtzrAAAAAAABgAAAHQBAAAAYh0EAAAAAAAABgAAAHQBAAAAYwYAAAB0AQAAAGUGAAAAdAEAAABmBgAAAHQBAAAAZwEGAAAAdAEAAABtAA==', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { accountId: 'app.nearcrowd.near', keyBase64: 'dAEAAABjHQQAAAAAAAA=' }, - type: 'data_deletion', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'dAEAAABjIgEAAAAAAAA=', - valueBase64: 'epIvaamXn1S0leE2SA8w+TxNWM4rEC75i6V3XS7gjvAE', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'dAEAAABjmwAAAAAAAAA=', - valueBase64: '0h0vJmTB/V9IK0xVxNBid+JAmsnySRFNF3jnQNl2m8sB', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'dAEAAABjqQEAAAAAAAA=', - valueBase64: 's+OZU4d49W6Qv/gFmkBPsmVUX1WVbDiJAJzJse0tXVEE', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'dAEAAABnDgAAAGV2YWVuZXJneS5uZWFy', - valueBase64: 'A/UhKZel+/gCMLF4XhBcxERDBIa48p9qlYBMRIbWALUgA+XURCXiZ0QXWujnX0t/H7y0BAAAAAAAAA==', - }, - type: 'data_update', - }, - ], - }, - { - chunk: { - author: 'bisontrails.poolv1.near', - header: { - balanceBurnt: '1433581134734200000000', - chunkHash: 'BqfFW2NyLJuyp1pGgXd2ffYPGptNswNVH6ZJuTq5zSNa', - encodedLength: 161, - encodedMerkleRoot: 'EB5tG2a3aVfXv41ESuQVT1ZvQFvuwKnkYGLc2CDVCf5w', - gasLimit: 1000000000000000, - gasUsed: 19438956235189, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'Cp7GeqLAqZ1Z1GbtCL5nG13wxy6mV6PaRdwLddDHjhVc', - outgoingReceiptsRoot: 'DP1DT6QP1tNHM5ZjHMJ3C8G2mHJd8kGoFFNEdZPN8Hyx', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: '73sn3JyP1LU58r1FsTo5ZVgvErdbEGFxtiGExkWwhQUd', - rentPaid: '0', - shardId: 1, - signature: 'ed25519:3RYj6fpboT1ALHsVxYtYmofT8fGf1VRhNaJhWY45hsKdePcX3AZb3rdKBAZMThF5PVn5j5boKWHPb9zd1xZWYzex', - txRoot: '11111111111111111111111111111111', - validatorProposals: [], - validatorReward: '0', - }, - receipts: [ - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '187086049935277727891452' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'relay.aurora', - signerPublicKey: 'ed25519:8j2e8u9t1SoTgMPn5G65ChU5WskpcnemBjwzkAnxDtZq', - }, - }, - receiptId: 'CdUSBwV29D1P1qvxCwnbfNsTsdxfdRY6PxezsSWRFyqN', - receiverId: 'relay.aurora', - }, - ], - transactions: [], - }, - receiptExecutionOutcomes: [ - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '821S5L8Htxafh2DDuDKtA4qapudN3mRq2AMv2qPeBhpj', - outcome: { - executorId: 'aurora', - gasBurnt: 3497076222351, - logs: ['signer_address Address(0x605ce19532c7121d1b5e632eb776e5aa7bfb8990)'], - metadata: { - gasProfile: [ - { cost: 'BASE', costCategory: 'WASM_HOST_COST', gasUsed: '5295362220' }, - { cost: 'CONTRACT_LOADING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '35445963' }, - { cost: 'CONTRACT_LOADING_BYTES', costCategory: 'WASM_HOST_COST', gasUsed: '207231423750' }, - { cost: 'ECRECOVER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '278821988457' }, - { cost: 'KECCAK256_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '17638473825' }, - { cost: 'KECCAK256_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '8889037470' }, - { cost: 'LOG_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '3543313050' }, - { cost: 'LOG_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '871120206' }, - { cost: 'READ_CACHED_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '9120000000' }, - { cost: 'READ_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '20878905600' }, - { cost: 'READ_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2128746480' }, - { cost: 'READ_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '22654486674' }, - { cost: 'READ_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '65642292' }, - { cost: 'STORAGE_READ_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '112713691500' }, - { cost: 'STORAGE_READ_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '897623457' }, - { cost: 'STORAGE_READ_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '482546430' }, - { cost: 'TOUCHING_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '209325427038' }, - { cost: 'UTF8_DECODING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '6223558122' }, - { cost: 'UTF8_DECODING_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '24784340715' }, - { cost: 'WASM_INSTRUCTION', costCategory: 'WASM_HOST_COST', gasUsed: '84250214400' }, - { cost: 'WRITE_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '22430358888' }, - { cost: 'WRITE_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1639710744' }, - { cost: 'WRITE_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '25789702374' }, - { cost: 'WRITE_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2531841624' }, - ], - version: 1, - }, - receiptIds: ['H4FHCm5scAbLHhki995o2UoJsHYuJHfbbCx5egAjNmk9'], - status: { - Failure: { - ActionError: { - index: 0, - kind: { FunctionCallError: { ExecutionError: 'Smart contract panicked: ERR_INCORRECT_NONCE' } }, - }, - }, - }, - tokensBurnt: '349707622235100000000', - }, - proof: [], - }, - receipt: { - predecessorId: 'relay.aurora', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: '+QGPggpehAQsHYCCUgiU5ShUyG+2SwTdHXetVCh23cBAxPSAuQEkGMuv5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGiUDx20tY/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/fZpFXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAGBc4ZUyxxIdG15jLrd25ap7+4mQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhaeq/ToAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAADCXWsrHC113TW91as0DqbkM1NT1AAAAAAAAAAAAAAAASYiolrEichjkpob95eq9yr2RVx8AAAAAAAAAAAAAAADJve7TPNAVQeHu0Q+QUZ0sBv4/64ScioLIoNNwZYHzq18jJVWwzwd9vJY1JV4H29H/wOgwyQVM2FJzoCUAB6Nz+98pSh9AfalXBMbThpftEUVyF49fYhEKwmJf', - deposit: '0', - gas: 300000000000000, - methodName: 'submit', - }, - }, - ], - gasPrice: '625040174', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'relay.aurora', - signerPublicKey: 'ed25519:2WmTnJeWZYKhh6NC3z3xTDKU5sHHAmHF96V6KAB3eHK5', - }, - }, - receiptId: '821S5L8Htxafh2DDuDKtA4qapudN3mRq2AMv2qPeBhpj', - receiverId: 'aurora', - }, - }, - ], - shardId: 1, - stateChanges: [ - { - cause: { receiptHash: '821S5L8Htxafh2DDuDKtA4qapudN3mRq2AMv2qPeBhpj', type: 'action_receipt_gas_reward' }, - change: { - accountId: 'aurora', - amount: '62420509105129651830808079298', - codeHash: 'qorYWFPQKMbJGcmjtWUhD3ee7fJJakRRUYFk3cao4W3', - locked: '0', - storagePaidAt: 0, - storageUsage: 6176907778, - }, - type: 'account_update', - }, - ], - }, - { - chunk: { - author: 'republic.poolv1.near', - header: { - balanceBurnt: '242806857164400000000', - chunkHash: '6uDUqFuYwGohFMQ9UyRaHbmHALf8HS9F6WcNnZWypkka', - encodedLength: 1474, - encodedMerkleRoot: '9rtC25N5jqfLxMumUwvupL9MpMNUAEKuXZB8RmfkdD7p', - gasLimit: 1000000000000000, - gasUsed: 2428068571644, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'AvRw1DBT1JFB2KNuahMvYucvttrem74GSEnwMacxbkv6', - outgoingReceiptsRoot: 'C2QjTGsH8HcfR6W7ecLYwuYD3Vkw6mi9Pf9tFXuGdMLr', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'CtxzDGCGs1SAr7GEqrA8gSKCcbaPDMKegnTyPEJmU7mb', - rentPaid: '0', - shardId: 2, - signature: 'ed25519:66LFkWB13BEUYRsmockx9LbiBzko9zohGkfbLwJertYWAa5TJY5ELFxPycps6poroh1C7Tfbh6NH7tQpgHZFr43d', - txRoot: 'DVr9U4uYvJY1cz5awdSmKm4CovJmr1VcPyqCMonat8bD', - validatorProposals: [], - validatorReward: '0', - }, - receipts: [ - { - predecessorId: 'evaenergy.near', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJ0YXNrX29yZGluYWwiOjEsImJpZCI6IjQ0NDQ2ODcxMTE2MjIyODMzODczMDc2In0=', - deposit: '0', - gas: 30000000000000, - methodName: 'claim_assignment', - }, - }, - ], - gasPrice: '122987387', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'evaenergy.near', - signerPublicKey: 'ed25519:9Q53x5kiLChb4tX3J5dV2wNAdTetejEcnizyQ3n3PZdg', - }, - }, - receiptId: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', - receiverId: 'app.nearcrowd.near', - }, - ], - transactions: [ - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'F4z3CFPjUGRJEF9rNSVhz4hZG2LpBvA3rR3AHv68432i', - outcome: { - executorId: 'chadmoney.near', - gasBurnt: 2428372658668, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['Ht6wAxzHfyCwWmfkngi9n6DaJu6UtoD1skHpJrRJQGik'], - status: { SuccessReceiptId: 'Ht6wAxzHfyCwWmfkngi9n6DaJu6UtoD1skHpJrRJQGik' }, - tokensBurnt: '242837265866800000000', - }, - proof: [ - { direction: 'Right', hash: 'E4X99JiTuYjYW6WPMiBhZ61Eo9fDYXmDdv67ZdkSbcf3' }, - { direction: 'Right', hash: '2NXhS3PRa1H8UZEtrNo14QhYNTzk5ztBhrSe6rb64heg' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJhY3Rpb25zIjpbeyJwb29sX2lkIjo0LCJ0b2tlbl9pbiI6IndyYXAubmVhciIsInRva2VuX291dCI6ImRhYzE3Zjk1OGQyZWU1MjNhMjIwNjIwNjk5NDU5N2MxM2Q4MzFlYzcuZmFjdG9yeS5icmlkZ2UubmVhciIsImFtb3VudF9pbiI6IjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCJtaW5fYW1vdW50X291dCI6IjI0NzE5ODgxNjIifV19', - deposit: '1', - gas: 10000000000000, - methodName: 'swap', - }, - }, - ], - hash: 'F4z3CFPjUGRJEF9rNSVhz4hZG2LpBvA3rR3AHv68432i', - nonce: 72650480016948, - publicKey: 'ed25519:78fzZoSWw4yr7gRev6onwRFQPu5auDAPNuAhM2Ryy4EC', - receiverId: 'v2.ref-finance.near', - signature: - 'ed25519:SYNT4UNqfEpAofZykZpZUugyPxXpSxYPwo8BqVg1fPG8BZvQKJgmHkoLsEbG2bsTfW1iGr886E6mw4nRDLJQ9e1', - signerId: 'chadmoney.near', - }, - }, - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '3Zgj4eFNymhW7LBsaKtUsCWAaoP9LBXKGFtmebYsfibU', - outcome: { - executorId: 'fd305d28fa12cb2e2769b211248059b8f4033ef4d4c0072c7daf246b166106ba', - gasBurnt: 2428312288450, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['ENQk2JGnPNtpXPUFkpBhnD3XUyv67eXB4XfmDU2sjHB7'], - status: { SuccessReceiptId: 'ENQk2JGnPNtpXPUFkpBhnD3XUyv67eXB4XfmDU2sjHB7' }, - tokensBurnt: '242831228845000000000', - }, - proof: [ - { direction: 'Left', hash: 'GAdP76ExKf5yQH9BU5usAeAWxiX2HkmDP7g54Ff47Zgz' }, - { direction: 'Right', hash: '2NXhS3PRa1H8UZEtrNo14QhYNTzk5ztBhrSe6rb64heg' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6InJld2FyZC1vcHRpbi5zd2VhdCIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAwMCIsIm1lbW8iOiJzdzpyZXc6b3B0aW46WUdSV3ZncFhLMC1mZDMwNWQyOGZhMTJjYjJlMjc2OWIyMTEyNDgwNTliOGY0MDMzZWY0ZDRjMDA3MmM3ZGFmMjQ2YjE2NjEwNmJhIn0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - hash: '3Zgj4eFNymhW7LBsaKtUsCWAaoP9LBXKGFtmebYsfibU', - nonce: 64674524000017, - publicKey: 'ed25519:J3LvQdaf6r6YVuTrVzo6em32R2ZG7jE9n4ysiLUpMa4y', - receiverId: 'token.sweat', - signature: - 'ed25519:3gdWeCTcqbT3ezViXEPaRiRafz4NcRRsP7bAwgY1CTFenKcFQB5gyvQqSHPAtQbx7JdppByH4j6SrEMxmPedFyPY', - signerId: 'fd305d28fa12cb2e2769b211248059b8f4033ef4d4c0072c7daf246b166106ba', - }, - }, - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'DbCXaFDNfQ7LjM5Jh8BS5fKLF6UJG3vJZYbGtfpDaTEB', - outcome: { - executorId: 'de9d1abf39de5fc4eac513b559cc825352d03c7b642a8af657113d61f8c195dc', - gasBurnt: 2428158009004, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['86Xs7Z6wiQNb89hV5j33UHbBZTXrbBYtqwBMBT3Hhq4h'], - status: { SuccessReceiptId: '86Xs7Z6wiQNb89hV5j33UHbBZTXrbBYtqwBMBT3Hhq4h' }, - tokensBurnt: '242815800900400000000', - }, - proof: [ - { direction: 'Right', hash: 'AJhsQtiU5riKpBKSBbHYD9svR84eZ3oYqd8eRjipqTFZ' }, - { direction: 'Left', hash: '45QTFnLgDmAbiiVBFmVHnivqQFU2ATNgLNErLnvZYZq2' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6ImRlcG9zaXRzLmdyb3cuc3dlYXQiLCJhbW91bnQiOiIxMDIxOTAwMDAwMDAwMDAwMDAwMDAiLCJtZW1vIjoic3c6ZDpnV095RFk0TEVrIn0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - hash: 'DbCXaFDNfQ7LjM5Jh8BS5fKLF6UJG3vJZYbGtfpDaTEB', - nonce: 64963031000010, - publicKey: 'ed25519:FyzTGZb9mP8gcDbyhLCLumsA38a1JF3E5WELLJHnJsab', - receiverId: 'token.sweat', - signature: - 'ed25519:25q5o12NchK9rnUmrddTFKzYYCdqmPfQWq1QgRhGJiDiZmazqS2B4mPu7PeGYvVAEqucgq2k41EmXwgN3vLExjW5', - signerId: 'de9d1abf39de5fc4eac513b559cc825352d03c7b642a8af657113d61f8c195dc', - }, - }, - ], - }, - receiptExecutionOutcomes: [ - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'CEgnqr5aYdpBErSzjvdtmdqnXdmXjXqe1AnPeamsLcvM', - outcome: { - executorId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - gasBurnt: 424555062500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [ - { direction: 'Left', hash: 'DiN9q4rgCEpmykqXzoXWP2dNdjLyWEAgYzi7UmsQhEpx' }, - { direction: 'Left', hash: '45QTFnLgDmAbiiVBFmVHnivqQFU2ATNgLNErLnvZYZq2' }, - ], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '1389731257024010315000' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - signerPublicKey: 'ed25519:HWHJq9M3m232SGpRTXuycdvjPEaaxn9TFN72bnEXnESp', - }, - }, - receiptId: 'CEgnqr5aYdpBErSzjvdtmdqnXdmXjXqe1AnPeamsLcvM', - receiverId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - }, - }, - ], - shardId: 2, - stateChanges: [ - { - cause: { txHash: 'F4z3CFPjUGRJEF9rNSVhz4hZG2LpBvA3rR3AHv68432i', type: 'transaction_processing' }, - change: { - accountId: 'chadmoney.near', - amount: '3455422147665387737062056', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 2282, - }, - type: 'account_update', - }, - { - cause: { txHash: 'DbCXaFDNfQ7LjM5Jh8BS5fKLF6UJG3vJZYbGtfpDaTEB', type: 'transaction_processing' }, - change: { - accountId: 'de9d1abf39de5fc4eac513b559cc825352d03c7b642a8af657113d61f8c195dc', - amount: '37838802127313908609194', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 182, - }, - type: 'account_update', - }, - { - cause: { receiptHash: 'CEgnqr5aYdpBErSzjvdtmdqnXdmXjXqe1AnPeamsLcvM', type: 'receipt_processing' }, - change: { - accountId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - amount: '44000142104620699999996', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 182, - }, - type: 'account_update', - }, - { - cause: { txHash: '3Zgj4eFNymhW7LBsaKtUsCWAaoP9LBXKGFtmebYsfibU', type: 'transaction_processing' }, - change: { - accountId: 'fd305d28fa12cb2e2769b211248059b8f4033ef4d4c0072c7daf246b166106ba', - amount: '33618268317256489684987', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 182, - }, - type: 'account_update', - }, - { - cause: { txHash: 'F4z3CFPjUGRJEF9rNSVhz4hZG2LpBvA3rR3AHv68432i', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 72650480016948, permission: 'FullAccess' }, - accountId: 'chadmoney.near', - publicKey: 'ed25519:78fzZoSWw4yr7gRev6onwRFQPu5auDAPNuAhM2Ryy4EC', - }, - type: 'access_key_update', - }, - { - cause: { txHash: 'DbCXaFDNfQ7LjM5Jh8BS5fKLF6UJG3vJZYbGtfpDaTEB', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 64963031000010, permission: 'FullAccess' }, - accountId: 'de9d1abf39de5fc4eac513b559cc825352d03c7b642a8af657113d61f8c195dc', - publicKey: 'ed25519:FyzTGZb9mP8gcDbyhLCLumsA38a1JF3E5WELLJHnJsab', - }, - type: 'access_key_update', - }, - { - cause: { txHash: '3Zgj4eFNymhW7LBsaKtUsCWAaoP9LBXKGFtmebYsfibU', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 64674524000017, permission: 'FullAccess' }, - accountId: 'fd305d28fa12cb2e2769b211248059b8f4033ef4d4c0072c7daf246b166106ba', - publicKey: 'ed25519:J3LvQdaf6r6YVuTrVzo6em32R2ZG7jE9n4ysiLUpMa4y', - }, - type: 'access_key_update', - }, - ], - }, - { - chunk: { - author: 'binancenode1.poolv1.near', - header: { - balanceBurnt: '599537042985400000000', - chunkHash: '3Q39LzrowGBhqRZvkjDqQNjkfUEYEK6Zis5LUzqvrtFj', - encodedLength: 1837, - encodedMerkleRoot: '2d1EBsn1UspGLYjyFkrzPoawjghZe4fBbWkZfmsPJRbM', - gasLimit: 1000000000000000, - gasUsed: 7599093905353, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'CUmJsZfPtNYEggezXf6wW7NX2i7Vn9yuPz7RWfVKxR7p', - outgoingReceiptsRoot: '8TG5j9ahcEtGUNREhCEJW3SgHyeCzochf4foYxSU7b8Q', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'EPbgnc5qJFvFGqqAyQQu2SrFcVr6mr3AVbSuXnHvZ1ie', - rentPaid: '0', - shardId: 3, - signature: 'ed25519:RgPmNaXij3pNFdMVi1Ex8WXyQiYr12uUyRk5tuoddJvCTwJXcxQZZLCdy1XqB6uB9imMz9NsXQwT1M993NBMsjS', - txRoot: '8V1iVH9TSzWsPtNVorScHc4ha9ESNqNEG13tZiRSDzk7', - validatorProposals: [], - validatorReward: '0', - }, - receipts: [ - { - predecessorId: 'relay.aurora', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: '+QGPggpehAQsHYCCUgiU5ShUyG+2SwTdHXetVCh23cBAxPSAuQEkGMuv5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGiUDx20tY/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/fZpFXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAGBc4ZUyxxIdG15jLrd25ap7+4mQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhaeq/ToAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAADCXWsrHC113TW91as0DqbkM1NT1AAAAAAAAAAAAAAAASYiolrEichjkpob95eq9yr2RVx8AAAAAAAAAAAAAAADJve7TPNAVQeHu0Q+QUZ0sBv4/64ScioLIoNNwZYHzq18jJVWwzwd9vJY1JV4H29H/wOgwyQVM2FJzoCUAB6Nz+98pSh9AfalXBMbThpftEUVyF49fYhEKwmJf', - deposit: '0', - gas: 300000000000000, - methodName: 'submit', - }, - }, - ], - gasPrice: '625040174', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'relay.aurora', - signerPublicKey: 'ed25519:2WmTnJeWZYKhh6NC3z3xTDKU5sHHAmHF96V6KAB3eHK5', - }, - }, - receiptId: '821S5L8Htxafh2DDuDKtA4qapudN3mRq2AMv2qPeBhpj', - receiverId: 'aurora', - }, - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '1389731257024010315000' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - signerPublicKey: 'ed25519:HWHJq9M3m232SGpRTXuycdvjPEaaxn9TFN72bnEXnESp', - }, - }, - receiptId: 'CEgnqr5aYdpBErSzjvdtmdqnXdmXjXqe1AnPeamsLcvM', - receiverId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - }, - ], - transactions: [ - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'AMdmdjfHvKX6vv1fNEyCCio2jmSvepxSetxQFhgj826f', - outcome: { - executorId: 'relay.aurora', - gasBurnt: 2429696331596, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['9p28ts6sz8Meg4vu3Fqff5QmfkwFc65C22WgAoKF1ELh'], - status: { SuccessReceiptId: '9p28ts6sz8Meg4vu3Fqff5QmfkwFc65C22WgAoKF1ELh' }, - tokensBurnt: '242969633159600000000', - }, - proof: [ - { direction: 'Right', hash: 'CKbaXt3vrGUUt7Ydw1gjb9by6pbtMooXo7uWJrbWAXXX' }, - { direction: 'Right', hash: '4NXWzpp8uSWuhoAXgsJKCs2eyAVHL3wXxsAWocx1Fs5K' }, - { direction: 'Right', hash: 'FmBQ954izf84EZ5P4GVvmUfc8T4bGXXqQruyDTtikwo1' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: '+QMRgw65o4QELB2Agww1AJSQVQb22oFec8oTVHtF0ZmIZxBLIoC5AqS/zVdxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApRioAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDIwNjdlMDg4OWUyYmJmM2ZjYTI3NmFjOWNiYzdiYjI5OThmNzQzMjM1ZjUwNjU4NDUwNjMyMzQxMDJhMGEzODYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGI2NmMxNTdiYTljMWM0YTAxOWEzOTQ4MjlkMzQyMGQ4YjIxZDg5OTQzZjMzYTdiYTExMDQ0MWFiNDExOGI4NTYzZWNiZTkxM2Q5YTJmZmNhNTNiNGU1NWJjNTFiZDdmNjEyZDQxZDkxNTY4M2MzNGNiZWVhYTg0Yzc0NWI2N2VmNjZlMTM2YjE2NTFkZTEwODk3OWM0YjE4NzFiMjIwMjIyYmI4ZTBkNTgwNmM0ZjFlZjliY2U1OWRlNzI1Y2Y0YwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAYTE5ZWJlNmFmZjRiM2MxZGIxZjY2Njc5Nzc1MDc1ZTZkMzY0NGFlYjBiZmYyZmQxMjQzNjg5ZTQ3ZmNjYTk5NzA4NzhlY2E5MzI4ZDQ5YmM1ZGZiYWI0ZDU4N2Y4OGQ5MTkyMTJiY2FjYzY0YzJhNGFmMDUxZmFkZWE4NjdhZDkwMDUzMzY4OWQ1ZDcwNzg5YTQyMjNmMzVkM2JhYzhlNzE0NzY2NDg5NjQ4ODAxMTk1NGRlMDRiZWM0NDM3N2U4hJyKgsegSqdU7My5fwrLI1Mc3JcSJSgvQcmZsI1Chymt8Ydj0gqgXGqO8uaGvpV0jbfOyplT73XLhyC4ON9ekQI+tWB+8go=', - deposit: '0', - gas: 300000000000000, - methodName: 'submit', - }, - }, - ], - hash: 'AMdmdjfHvKX6vv1fNEyCCio2jmSvepxSetxQFhgj826f', - nonce: 65788368017229, - publicKey: 'ed25519:FptiMvPBN7QRJwroc2zJtTEAEo4h9CJAdGKQfd2bA3Qm', - receiverId: 'aurora', - signature: - 'ed25519:LehYX21sAyodn5g7MxXPkztx9tQMHQ92gMg2KQYQV4pBKyGidLHz6y2aeLREUFt2ckxrdWNZ6VannAGBsPpiHPu', - signerId: 'relay.aurora', - }, - }, - ], - }, - receiptExecutionOutcomes: [ - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'CdUSBwV29D1P1qvxCwnbfNsTsdxfdRY6PxezsSWRFyqN', - outcome: { - executorId: 'relay.aurora', - gasBurnt: 223182562500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [ - { direction: 'Left', hash: '3zQuvAtY9UVHq2ws8vvMLmPivCpBPWwDhmTtCHNy1roV' }, - { direction: 'Right', hash: '4NXWzpp8uSWuhoAXgsJKCs2eyAVHL3wXxsAWocx1Fs5K' }, - { direction: 'Right', hash: 'FmBQ954izf84EZ5P4GVvmUfc8T4bGXXqQruyDTtikwo1' }, - ], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '187086049935277727891452' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'relay.aurora', - signerPublicKey: 'ed25519:8j2e8u9t1SoTgMPn5G65ChU5WskpcnemBjwzkAnxDtZq', - }, - }, - receiptId: 'CdUSBwV29D1P1qvxCwnbfNsTsdxfdRY6PxezsSWRFyqN', - receiverId: 'relay.aurora', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', - outcome: { - executorId: 'token.sweat', - gasBurnt: 4072736369755, - logs: [ - 'EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_transfer","data":[{"old_owner_id":"7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab","new_owner_id":"reward-optin.sweat","amount":"100000000000000000","memo":"sw:rew:optin:YGRWvgpXK0-7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab"}]}', - ], - metadata: { - gasProfile: [ - { cost: 'BASE', costCategory: 'WASM_HOST_COST', gasUsed: '7413507108' }, - { cost: 'CONTRACT_LOADING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '35445963' }, - { cost: 'CONTRACT_LOADING_BYTES', costCategory: 'WASM_HOST_COST', gasUsed: '44831486250' }, - { cost: 'LOG_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '3543313050' }, - { cost: 'LOG_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '4342402239' }, - { cost: 'READ_CACHED_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '280440000000' }, - { cost: 'READ_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '36538084800' }, - { cost: 'READ_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2816787753' }, - { cost: 'READ_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '27688817046' }, - { cost: 'READ_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '48295380' }, - { cost: 'SHA256_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '18163881000' }, - { cost: 'SHA256_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '3955245564' }, - { cost: 'STORAGE_READ_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '169070537250' }, - { cost: 'STORAGE_READ_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2259534909' }, - { cost: 'STORAGE_READ_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '572322510' }, - { cost: 'STORAGE_WRITE_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '192590208000' }, - { cost: 'STORAGE_WRITE_EVICTED_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '3275965314' }, - { cost: 'STORAGE_WRITE_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '5145249291' }, - { cost: 'STORAGE_WRITE_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '3163890978' }, - { cost: 'TOUCHING_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '611874325188' }, - { cost: 'UTF8_DECODING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '3111779061' }, - { cost: 'UTF8_DECODING_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '95929977591' }, - { cost: 'WASM_INSTRUCTION', costCategory: 'WASM_HOST_COST', gasUsed: '56074112424' }, - { cost: 'WRITE_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '33645538332' }, - { cost: 'WRITE_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1378228632' }, - { cost: 'WRITE_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '34386269832' }, - { cost: 'WRITE_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2128875840' }, - ], - version: 1, - }, - receiptIds: ['BXhqz9Hk5eVb5ibaN3uZmNW4cgW6zBerUYpM7Zh19kXe'], - status: { SuccessValue: '' }, - tokensBurnt: '407273636975500000000', - }, - proof: [ - { direction: 'Right', hash: 'Cbwr9BAamScEJV1aMoZ21CULLdjPTpY6QQmfZNAS8cUx' }, - { direction: 'Left', hash: '7x71otoV7zEDfh2v1hYcLD9GNFZkoza1d3uoJUc79GMV' }, - { direction: 'Right', hash: 'FmBQ954izf84EZ5P4GVvmUfc8T4bGXXqQruyDTtikwo1' }, - ], - }, - receipt: { - predecessorId: '7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6InJld2FyZC1vcHRpbi5zd2VhdCIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAwMCIsIm1lbW8iOiJzdzpyZXc6b3B0aW46WUdSV3ZncFhLMC03YThiYTFiZDgwNDg2Mzg4M2FjZTEwZWQ3NjQ0MWU2YWQyMjM5YWU3OTE3Yjc4Yzg5NzAwYjcwMWY3NWNlMWFiIn0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - gasPrice: '109272700', - inputDataIds: [], - outputDataReceivers: [], - signerId: '7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab', - signerPublicKey: 'ed25519:9FNEMP92rkuvRVefVkBW38RmbZ648XvQGeWbFYtdC7hk', - }, - }, - receiptId: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', - receiverId: 'token.sweat', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', - outcome: { - executorId: 'olezha4.near', - gasBurnt: 223182562500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [ - { direction: 'Left', hash: 'GdEbJpKZ4iqem9VmS5Qbm2CTrt1qFZhfSD6zUv5JaYXT' }, - { direction: 'Left', hash: '7x71otoV7zEDfh2v1hYcLD9GNFZkoza1d3uoJUc79GMV' }, - { direction: 'Right', hash: 'FmBQ954izf84EZ5P4GVvmUfc8T4bGXXqQruyDTtikwo1' }, - ], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '13222602662027447938448' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'olezha4.near', - signerPublicKey: 'ed25519:EnLNUDncRuw4AYLcGmi1Hr2YQ1DLu12VutsubZ6k8c2F', - }, - }, - receiptId: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', - receiverId: 'olezha4.near', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', - outcome: { - executorId: 'marthacecilia.near', - gasBurnt: 223182562500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [{ direction: 'Left', hash: '6FWhYXFGBgzSPDuBCFrfSkdAqSvsMHPbnCJ2Q3UsmUV6' }], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '13239855304236542651168' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'marthacecilia.near', - signerPublicKey: 'ed25519:8W28RYFfXztNA7ENP4VTaitsqEjSbABQJDqELwbwXswq', - }, - }, - receiptId: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', - receiverId: 'marthacecilia.near', - }, - }, - ], - shardId: 3, - stateChanges: [ - { - cause: { receiptHash: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', type: 'receipt_processing' }, - change: { - accountId: 'marthacecilia.near', - amount: '376417715605581247237588', - codeHash: '7DcAdMUT1MjaZ9s7zhXdyxKvQsRsSfnmBGdzeZaquqDE', - locked: '0', - storagePaidAt: 0, - storageUsage: 13722, - }, - type: 'account_update', - }, - { - cause: { receiptHash: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', type: 'receipt_processing' }, - change: { - accountId: 'olezha4.near', - amount: '147297020835776249333187456', - codeHash: 'E8jZ1giWcVrps8PcV75ATauu6gFRkcwjNtKp7NKmipZG', - locked: '0', - storagePaidAt: 0, - storageUsage: 25029, - }, - type: 'account_update', - }, - { - cause: { txHash: 'AMdmdjfHvKX6vv1fNEyCCio2jmSvepxSetxQFhgj826f', type: 'transaction_processing' }, - change: { - accountId: 'relay.aurora', - amount: '2493412853875426176695038138', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 149094, - }, - type: 'account_update', - }, - { - cause: { receiptHash: 'CdUSBwV29D1P1qvxCwnbfNsTsdxfdRY6PxezsSWRFyqN', type: 'receipt_processing' }, - change: { - accountId: 'relay.aurora', - amount: '2493599939925361454422929590', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 149094, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'receipt_processing' }, - change: { - accountId: 'token.sweat', - amount: '32545059778997347633373318383', - codeHash: 'FMy4MTxATGtfxqTg5PZfGhQpRWej9Ppbttwo7FWF13wA', - locked: '0', - storagePaidAt: 0, - storageUsage: 1648821628, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'action_receipt_gas_reward' }, - change: { - accountId: 'token.sweat', - amount: '32545059828330070072473318383', - codeHash: 'FMy4MTxATGtfxqTg5PZfGhQpRWej9Ppbttwo7FWF13wA', - locked: '0', - storagePaidAt: 0, - storageUsage: 1648821628, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', type: 'receipt_processing' }, - change: { - accessKey: { - nonce: 85297952000430, - permission: { - FunctionCall: { - allowance: '117616350729529600000000', - methodNames: [], - receiverId: 'app.nearcrowd.near', - }, - }, - }, - accountId: 'marthacecilia.near', - publicKey: 'ed25519:8W28RYFfXztNA7ENP4VTaitsqEjSbABQJDqELwbwXswq', - }, - type: 'access_key_update', - }, - { - cause: { receiptHash: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', type: 'receipt_processing' }, - change: { - accessKey: { - nonce: 84682948002117, - permission: { - FunctionCall: { - allowance: '330678248075353400000000', - methodNames: [], - receiverId: 'app.nearcrowd.near', - }, - }, - }, - accountId: 'olezha4.near', - publicKey: 'ed25519:EnLNUDncRuw4AYLcGmi1Hr2YQ1DLu12VutsubZ6k8c2F', - }, - type: 'access_key_update', - }, - { - cause: { txHash: 'AMdmdjfHvKX6vv1fNEyCCio2jmSvepxSetxQFhgj826f', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 65788368017229, permission: 'FullAccess' }, - accountId: 'relay.aurora', - publicKey: 'ed25519:FptiMvPBN7QRJwroc2zJtTEAEo4h9CJAdGKQfd2bA3Qm', - }, - type: 'access_key_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'receipt_processing' }, - change: { - accountId: 'token.sweat', - keyBase64: 'U1RBVEU=', - valueBase64: - 'AgAAAHNpAQAAAAAAAAACAAAAc2UBAAAAdAEIAAAALnUuc3dlYXQUQEmH9+nGUg8Ez0cAAAAAWgAAAAAAAADiIbWN+QEAAA==', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'receipt_processing' }, - change: { - accountId: 'token.sweat', - keyBase64: 'dAAEzAvKN2Ekj8gSsSzscbcviXEnrSF9E4Nn8XlqPYFyaw==', - valueBase64: '6Hk2larECkgAAAAAAAAAAA==', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'receipt_processing' }, - change: { - accountId: 'token.sweat', - keyBase64: 'dADCUiigKPOTAl1jqrFvCFMV6YPDQuu8kGehwLHx0CgpIw==', - valueBase64: 'AAAu48ylkU6WIwAAAAAAAA==', - }, - type: 'data_update', - }, - ], - }, - ], -}; diff --git a/frontend/src/utils/resize.js b/frontend/src/utils/resize.js deleted file mode 100644 index 84356477d..000000000 --- a/frontend/src/utils/resize.js +++ /dev/null @@ -1,236 +0,0 @@ -import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; - -import debounce from './debounce'; - -export function useDragResize({ - defaultSizeRelation = DEFAULT_FLEX, - direction, - initiallyHidden, - onHiddenElementChange, - sizeThresholdFirst = 100, - sizeThresholdSecond = 100, - storageKey, -}) { - const storage = null; - - const store = useMemo( - () => - debounce(500, (value) => { - if (storage && storageKey) { - storage.set(storageKey, value); - } - }), - [storage, storageKey], - ); - - const [hiddenElement, setHiddenElement] = useState(() => { - const storedValue = storage && storageKey ? storage.get(storageKey) : null; - if (storedValue === HIDE_FIRST || initiallyHidden === 'first') { - return 'first'; - } - if (storedValue === HIDE_SECOND || initiallyHidden === 'second') { - return 'second'; - } - return null; - }); - - const setHiddenElementWithCallback = useCallback( - (element) => { - if (element !== hiddenElement) { - setHiddenElement(element); - onHiddenElementChange?.(element); - } - }, - [hiddenElement, onHiddenElementChange], - ); - - const firstRef = useRef(null); - const dragBarRef = useRef(null); - const secondRef = useRef(null); - - const defaultFlexRef = useRef(`${defaultSizeRelation}`); - - /** - * Set initial flex values - */ - useLayoutEffect(() => { - const storedValue = - storage && storageKey ? storage.get(storageKey) || defaultFlexRef.current : defaultFlexRef.current; - const flexDirection = direction === 'horizontal' ? 'row' : 'column'; - - if (firstRef.current) { - firstRef.current.style.display = 'flex'; - firstRef.current.style.flexDirection = flexDirection; - firstRef.current.style.flex = - storedValue === HIDE_FIRST || storedValue === HIDE_SECOND ? defaultFlexRef.current : storedValue; - } - - if (secondRef.current) { - secondRef.current.style.display = 'flex'; - secondRef.current.style.flexDirection = flexDirection; - secondRef.current.style.flex = '1'; - } - - if (dragBarRef.current) { - dragBarRef.current.style.display = 'flex'; - dragBarRef.current.style.flexDirection = flexDirection; - } - }, [direction, storage, storageKey]); - - const hide = useCallback((resizableElement) => { - const element = resizableElement === 'first' ? firstRef.current : secondRef.current; - if (!element) { - return; - } - - // We hide elements off screen because of codemirror. If the page is loaded - // and the codemirror container would have zero width, the layout isn't - // instant pretty. By always giving the editor some width we avoid any - // layout shifts when the editor reappears. - element.style.left = '-1000px'; - element.style.position = 'absolute'; - element.style.opacity = '0'; - element.style.height = '500px'; - element.style.width = '500px'; - - // Make sure that the flex value of the first item is at least equal to one - // so that the entire space of the parent element is filled up - if (firstRef.current) { - const flex = parseFloat(firstRef.current.style.flex); - if (!Number.isFinite(flex) || flex < 1) { - firstRef.current.style.flex = '1'; - } - } - }, []); - - const show = useCallback( - (resizableElement) => { - const element = resizableElement === 'first' ? firstRef.current : secondRef.current; - if (!element) { - return; - } - - element.style.width = ''; - element.style.height = ''; - element.style.opacity = ''; - element.style.position = ''; - element.style.left = ''; - - if (firstRef.current && storage && storageKey) { - const storedValue = storage?.get(storageKey); - if (storedValue !== HIDE_FIRST && storedValue !== HIDE_SECOND) { - firstRef.current.style.flex = storedValue || defaultFlexRef.current; - } - } - }, - [storage, storageKey], - ); - - /** - * Hide and show items when state changes - */ - useLayoutEffect(() => { - if (hiddenElement === 'first') { - hide('first'); - } else { - show('first'); - } - if (hiddenElement === 'second') { - hide('second'); - } else { - show('second'); - } - }, [hiddenElement, hide, show]); - - useEffect(() => { - if (!dragBarRef.current || !firstRef.current || !secondRef.current) { - return; - } - const dragBarContainer = dragBarRef.current; - const firstContainer = firstRef.current; - const wrapper = firstContainer.parentElement; - - const eventProperty = direction === 'horizontal' ? 'clientX' : 'clientY'; - const rectProperty = direction === 'horizontal' ? 'left' : 'top'; - const adjacentRectProperty = direction === 'horizontal' ? 'right' : 'bottom'; - const sizeProperty = direction === 'horizontal' ? 'clientWidth' : 'clientHeight'; - - function handleMouseDown(downEvent) { - downEvent.preventDefault(); - - // Distance between the start of the drag bar and the exact point where - // the user clicked on the drag bar. - const offset = downEvent[eventProperty] - dragBarContainer.getBoundingClientRect()[rectProperty]; - - function handleMouseMove(moveEvent) { - if (moveEvent.buttons === 0) { - return handleMouseUp(); - } - - const firstSize = moveEvent[eventProperty] - wrapper.getBoundingClientRect()[rectProperty] - offset; - const secondSize = - wrapper.getBoundingClientRect()[adjacentRectProperty] - - moveEvent[eventProperty] + - offset - - dragBarContainer[sizeProperty]; - - if (firstSize < sizeThresholdFirst) { - // Hide the first display - setHiddenElementWithCallback('first'); - store(HIDE_FIRST); - } else if (secondSize < sizeThresholdSecond) { - // Hide the second display - setHiddenElementWithCallback('second'); - store(HIDE_SECOND); - } else { - // Show both and adjust the flex value of the first one (the flex - // value for the second one is always `1`) - setHiddenElementWithCallback(null); - const newFlex = `${firstSize / secondSize}`; - firstContainer.style.flex = newFlex; - store(newFlex); - } - } - - function handleMouseUp() { - document.removeEventListener('mousemove', handleMouseMove); - document.removeEventListener('mouseup', handleMouseUp); - } - - document.addEventListener('mousemove', handleMouseMove); - document.addEventListener('mouseup', handleMouseUp); - } - - dragBarContainer.addEventListener('mousedown', handleMouseDown); - - function reset() { - if (firstRef.current) { - firstRef.current.style.flex = defaultFlexRef.current; - } - store(defaultFlexRef.current); - setHiddenElementWithCallback(null); - } - - dragBarContainer.addEventListener('dblclick', reset); - - return () => { - dragBarContainer.removeEventListener('mousedown', handleMouseDown); - dragBarContainer.removeEventListener('dblclick', reset); - }; - }, [direction, setHiddenElementWithCallback, sizeThresholdFirst, sizeThresholdSecond, store]); - - return useMemo( - () => ({ - dragBarRef, - hiddenElement, - firstRef, - setHiddenElement, - secondRef, - }), - [hiddenElement, setHiddenElement], - ); -} - -const DEFAULT_FLEX = 1; -const HIDE_FIRST = 'hide-first'; -const HIDE_SECOND = 'hide-second'; From 5633b4a28acf53826ea5b8a87443a736911adcac Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Wed, 14 Aug 2024 11:14:43 -0700 Subject: [PATCH 14/17] feat: Idempotent Provisioning (#1004) Provisioning is occasionally finnicky, failing on different parts of the process. Having retryable provisioning allows us to heal indexer state through retries rather than manually actioning this. To this, the provisioning step needs to have access to accurate status of provisioning in order to make the correct decisions on which non-idempotent actions to take. This PR introduces a ProvisioningState class which represents the status of provisioning, and can be used to make decisions on what parts of provisioning need to be completed. --- .../__snapshots__/hasura-client.test.ts.snap | 0 .../hasura-client/hasura-client.test.ts | 0 .../hasura-client/hasura-client.ts | 2 +- .../{ => provisioner}/hasura-client/index.ts | 3 +- runner/src/provisioner/index.ts | 1 + runner/src/provisioner/provisioner.test.ts | 142 +++++++--- runner/src/provisioner/provisioner.ts | 116 +++++--- .../provisioning-state.test.ts.snap | 250 ++++++++++++++++++ .../provisioner/provisioning-state/index.ts | 1 + .../provisioning-state.test.ts | 219 +++++++++++++++ .../provisioning-state/provisioning-state.ts | 81 ++++++ .../data-layer/data-layer-service.test.ts | 17 -- .../services/data-layer/data-layer-service.ts | 50 +--- .../redis-client/index.ts | 0 .../redis-client/redis-client.test.ts | 0 .../redis-client/redis-client.ts | 2 +- runner/src/stream-handler/worker.ts | 2 +- runner/tests/integration.test.ts | 2 +- 18 files changed, 753 insertions(+), 135 deletions(-) rename runner/src/{ => provisioner}/hasura-client/__snapshots__/hasura-client.test.ts.snap (100%) rename runner/src/{ => provisioner}/hasura-client/hasura-client.test.ts (100%) rename runner/src/{ => provisioner}/hasura-client/hasura-client.ts (99%) rename runner/src/{ => provisioner}/hasura-client/index.ts (63%) create mode 100644 runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap create mode 100644 runner/src/provisioner/provisioning-state/index.ts create mode 100644 runner/src/provisioner/provisioning-state/provisioning-state.test.ts create mode 100644 runner/src/provisioner/provisioning-state/provisioning-state.ts rename runner/src/{ => stream-handler}/redis-client/index.ts (100%) rename runner/src/{ => stream-handler}/redis-client/redis-client.test.ts (100%) rename runner/src/{ => stream-handler}/redis-client/redis-client.ts (97%) diff --git a/runner/src/hasura-client/__snapshots__/hasura-client.test.ts.snap b/runner/src/provisioner/hasura-client/__snapshots__/hasura-client.test.ts.snap similarity index 100% rename from runner/src/hasura-client/__snapshots__/hasura-client.test.ts.snap rename to runner/src/provisioner/hasura-client/__snapshots__/hasura-client.test.ts.snap diff --git a/runner/src/hasura-client/hasura-client.test.ts b/runner/src/provisioner/hasura-client/hasura-client.test.ts similarity index 100% rename from runner/src/hasura-client/hasura-client.test.ts rename to runner/src/provisioner/hasura-client/hasura-client.test.ts diff --git a/runner/src/hasura-client/hasura-client.ts b/runner/src/provisioner/hasura-client/hasura-client.ts similarity index 99% rename from runner/src/hasura-client/hasura-client.ts rename to runner/src/provisioner/hasura-client/hasura-client.ts index 8b50242f2..f2f4e89c5 100644 --- a/runner/src/hasura-client/hasura-client.ts +++ b/runner/src/provisioner/hasura-client/hasura-client.ts @@ -10,7 +10,7 @@ interface SqlOptions { source?: string } -export type HasuraPermission = 'select' | 'insert' | 'update' | 'delete'; +export const HASURA_PERMISSION_TYPES = ['select', 'insert', 'update', 'delete']; interface TableDefinition { name: string diff --git a/runner/src/hasura-client/index.ts b/runner/src/provisioner/hasura-client/index.ts similarity index 63% rename from runner/src/hasura-client/index.ts rename to runner/src/provisioner/hasura-client/index.ts index fa21831b8..77a2b4aea 100644 --- a/runner/src/hasura-client/index.ts +++ b/runner/src/provisioner/hasura-client/index.ts @@ -1,2 +1,3 @@ export { default } from './hasura-client'; -export type { HasuraMetadata, HasuraSource, HasuraConfiguration, HasuraDatabaseConnectionParameters, HasuraTableMetadata, HasuraRolePermission, HasuraPermission } from './hasura-client'; +export type { HasuraMetadata, HasuraSource, HasuraConfiguration, HasuraDatabaseConnectionParameters, HasuraTableMetadata, HasuraRolePermission } from './hasura-client'; +export { HASURA_PERMISSION_TYPES } from './hasura-client'; diff --git a/runner/src/provisioner/index.ts b/runner/src/provisioner/index.ts index 5a4dbeb8d..98efce62b 100644 --- a/runner/src/provisioner/index.ts +++ b/runner/src/provisioner/index.ts @@ -1 +1,2 @@ export { default } from './provisioner'; +export { METADATA_TABLE_NAME, LOGS_TABLE_NAME } from './provisioner'; diff --git a/runner/src/provisioner/provisioner.test.ts b/runner/src/provisioner/provisioner.test.ts index 0b58c4864..425ed219a 100644 --- a/runner/src/provisioner/provisioner.test.ts +++ b/runner/src/provisioner/provisioner.test.ts @@ -1,8 +1,9 @@ import pgFormat from 'pg-format'; -import Provisioner from './provisioner'; +import Provisioner, { LOGS_TABLE_NAME, METADATA_TABLE_NAME } from './provisioner'; import IndexerConfig from '../indexer-config/indexer-config'; import { LogLevel } from '../indexer-meta/log-entry'; +import { type HasuraTableMetadata, type HasuraMetadata, type HasuraSource } from './hasura-client'; describe('Provisioner', () => { let adminPgClient: any; @@ -13,15 +14,24 @@ describe('Provisioner', () => { let indexerConfig: IndexerConfig; const tableNames = ['blocks']; + const systemTables = [METADATA_TABLE_NAME, LOGS_TABLE_NAME]; + const tableNamesWithSystemTables = ['blocks', ...systemTables]; const accountId = 'morgs.near'; const functionName = 'test-function'; const databaseSchema = 'CREATE TABLE blocks (height numeric)'; indexerConfig = new IndexerConfig('', accountId, functionName, 0, '', databaseSchema, LogLevel.INFO); + const emptyHasuraMetadata = generateDefaultHasuraMetadata(); + const hasuraMetadataWithEmptySource = generateDefaultHasuraMetadata(); + hasuraMetadataWithEmptySource.sources.push(generateSourceWithTables([], [], indexerConfig.userName(), indexerConfig.databaseName())); + const hasuraMetadataWithSystemProvisions = generateDefaultHasuraMetadata(); + hasuraMetadataWithSystemProvisions.sources.push(generateSourceWithTables([indexerConfig.schemaName()], systemTables, indexerConfig.userName(), indexerConfig.databaseName())); + const hasuraMetadataWithProvisions = generateDefaultHasuraMetadata(); + hasuraMetadataWithProvisions.sources.push(generateSourceWithTables([indexerConfig.schemaName()], tableNamesWithSystemTables, indexerConfig.userName(), indexerConfig.databaseName())); const testingRetryConfig = { maxRetries: 5, baseDelay: 10 }; - const setProvisioningStatusQuery = `INSERT INTO ${indexerConfig.schemaName()}.sys_metadata (attribute, value) VALUES ('STATUS', 'PROVISIONING') ON CONFLICT (attribute) DO UPDATE SET value = EXCLUDED.value RETURNING *`; + const setProvisioningStatusQuery = `INSERT INTO ${indexerConfig.schemaName()}.${METADATA_TABLE_NAME} (attribute, value) VALUES ('STATUS', 'PROVISIONING') ON CONFLICT (attribute) DO UPDATE SET value = EXCLUDED.value RETURNING *`; const logsDDL = expect.any(String); const metadataDDL = expect.any(String); const error = new Error('some error'); @@ -39,7 +49,8 @@ describe('Provisioner', () => { beforeEach(() => { hasuraClient = { - getTableNames: jest.fn().mockReturnValueOnce(tableNames), + exportMetadata: jest.fn().mockResolvedValueOnce(emptyHasuraMetadata).mockResolvedValue(hasuraMetadataWithSystemProvisions), + getTableNames: jest.fn().mockResolvedValueOnce([]).mockResolvedValue(tableNamesWithSystemTables), trackTables: jest.fn().mockReturnValueOnce(null), trackForeignKeyRelationships: jest.fn().mockReturnValueOnce(null), addPermissionsToTables: jest.fn().mockReturnValueOnce(null), @@ -179,28 +190,6 @@ describe('Provisioner', () => { }); }); - describe('isUserApiProvisioned', () => { - it('returns false if datasource doesnt exists', async () => { - hasuraClient.doesSourceExist = jest.fn().mockReturnValueOnce(false); - - await expect(provisioner.isProvisioned(indexerConfig)).resolves.toBe(false); - }); - - it('returns false if datasource and schema dont exists', async () => { - hasuraClient.doesSourceExist = jest.fn().mockReturnValueOnce(false); - hasuraClient.doesSchemaExist = jest.fn().mockReturnValueOnce(false); - - await expect(provisioner.isProvisioned(indexerConfig)).resolves.toBe(false); - }); - - it('returns true if datasource and schema exists', async () => { - hasuraClient.doesSourceExist = jest.fn().mockReturnValueOnce(true); - hasuraClient.doesSchemaExist = jest.fn().mockReturnValueOnce(true); - - await expect(provisioner.isProvisioned(indexerConfig)).resolves.toBe(true); - }); - }); - describe('provisionUserApi', () => { it('provisions an API for the user', async () => { await provisioner.provisionUserApi(indexerConfig); @@ -227,7 +216,20 @@ describe('Provisioner', () => { expect(hasuraClient.executeSqlOnSchema).toHaveBeenNthCalledWith(2, indexerConfig.userName(), indexerConfig.schemaName(), logsDDL); expect(hasuraClient.executeSqlOnSchema).toHaveBeenNthCalledWith(3, indexerConfig.userName(), indexerConfig.schemaName(), databaseSchema); expect(hasuraClient.getTableNames).toBeCalledWith(indexerConfig.schemaName(), indexerConfig.databaseName()); - expect(hasuraClient.trackTables).toBeCalledWith(indexerConfig.schemaName(), tableNames, indexerConfig.databaseName()); + expect(hasuraClient.trackTables).toHaveBeenNthCalledWith(1, indexerConfig.schemaName(), [METADATA_TABLE_NAME, LOGS_TABLE_NAME], indexerConfig.databaseName()); + expect(hasuraClient.trackTables).toHaveBeenNthCalledWith(2, indexerConfig.schemaName(), tableNames, indexerConfig.databaseName()); + expect(hasuraClient.addPermissionsToTables).toBeCalledWith( + indexerConfig.schemaName(), + indexerConfig.databaseName(), + [METADATA_TABLE_NAME, LOGS_TABLE_NAME], + indexerConfig.userName(), + [ + 'select', + 'insert', + 'update', + 'delete' + ] + ); expect(hasuraClient.addPermissionsToTables).toBeCalledWith( indexerConfig.schemaName(), indexerConfig.databaseName(), @@ -243,7 +245,7 @@ describe('Provisioner', () => { }); it('skips provisioning the datasource if it already exists', async () => { - hasuraClient.doesSourceExist = jest.fn().mockReturnValueOnce(true); + hasuraClient.exportMetadata = jest.fn().mockResolvedValueOnce(hasuraMetadataWithEmptySource).mockResolvedValue(hasuraMetadataWithSystemProvisions); await provisioner.provisionUserApi(indexerConfig); @@ -255,7 +257,20 @@ describe('Provisioner', () => { expect(hasuraClient.executeSqlOnSchema).toHaveBeenNthCalledWith(2, indexerConfig.userName(), indexerConfig.schemaName(), logsDDL); expect(hasuraClient.executeSqlOnSchema).toHaveBeenNthCalledWith(3, indexerConfig.databaseName(), indexerConfig.schemaName(), databaseSchema); expect(hasuraClient.getTableNames).toBeCalledWith(indexerConfig.schemaName(), indexerConfig.databaseName()); - expect(hasuraClient.trackTables).toBeCalledWith(indexerConfig.schemaName(), tableNames, indexerConfig.databaseName()); + expect(hasuraClient.trackTables).toHaveBeenNthCalledWith(1, indexerConfig.schemaName(), [METADATA_TABLE_NAME, LOGS_TABLE_NAME], indexerConfig.databaseName()); + expect(hasuraClient.trackTables).toHaveBeenNthCalledWith(2, indexerConfig.schemaName(), tableNames, indexerConfig.databaseName()); + expect(hasuraClient.addPermissionsToTables).toBeCalledWith( + indexerConfig.schemaName(), + indexerConfig.databaseName(), + [METADATA_TABLE_NAME, LOGS_TABLE_NAME], + indexerConfig.userName(), + [ + 'select', + 'insert', + 'update', + 'delete' + ] + ); expect(hasuraClient.addPermissionsToTables).toBeCalledWith( indexerConfig.schemaName(), indexerConfig.databaseName(), @@ -270,6 +285,22 @@ describe('Provisioner', () => { ); }); + it('skips all provisioning if all provisioning tasks already done', async () => { + hasuraClient.exportMetadata = jest.fn().mockResolvedValue(hasuraMetadataWithProvisions); + hasuraClient.getTableNames = jest.fn().mockResolvedValue(tableNamesWithSystemTables); + + await provisioner.provisionUserApi(indexerConfig); + + expect(adminPgClient.query).not.toBeCalled(); + expect(hasuraClient.addDatasource).not.toBeCalled(); + + expect(hasuraClient.createSchema).not.toBeCalled(); + expect(hasuraClient.executeSqlOnSchema).not.toBeCalled(); + expect(hasuraClient.trackTables).not.toBeCalled(); + expect(hasuraClient.trackForeignKeyRelationships).toHaveBeenCalledTimes(1); + expect(hasuraClient.addPermissionsToTables).not.toBeCalled(); + }); + it('formats user input before executing the query', async () => { await provisioner.createUserDb('morgs_near', 'pass; DROP TABLE users;--', 'databaseName UNION SELECT * FROM users --'); @@ -312,12 +343,6 @@ describe('Provisioner', () => { await expect(provisioner.runLogsSql(accountId, functionName)).rejects.toThrow('Failed to run logs script: some error'); }); - it('throws an error when it fails to fetch table names', async () => { - hasuraClient.getTableNames = jest.fn().mockRejectedValue(error); - - await expect(provisioner.provisionUserApi(indexerConfig)).rejects.toThrow('Failed to provision endpoint: Failed to fetch table names: some error'); - }); - it('throws an error when it fails to track tables', async () => { hasuraClient.trackTables = jest.fn().mockRejectedValue(error); @@ -407,3 +432,52 @@ describe('Provisioner', () => { }); }); }); + +function generateDefaultHasuraMetadata (): HasuraMetadata { + const sources: HasuraSource[] = []; + // Insert default source which has different format than the rest + sources.push({ + name: 'default', + kind: 'postgres', + tables: [], + configuration: { + connection_info: { + database_url: { from_env: 'HASURA_GRAPHQL_DATABASE_URL' }, + } + } + }); + + return { + version: 3, + sources + }; +} + +function generateSourceWithTables (schemaNames: string[], tableNames: string[], role: string, db: string): HasuraSource { + const tables: HasuraTableMetadata[] = []; + schemaNames.forEach((schemaName) => { + tableNames.forEach((tableName) => { + tables.push(generateTableConfig(schemaName, tableName, role)); + }); + }); + + return { + name: db, + kind: 'postgres', + tables, + configuration: {} as any, + }; +} + +function generateTableConfig (schemaName: string, tableName: string, role: string): HasuraTableMetadata { + return { + table: { + name: tableName, + schema: schemaName, + }, + insert_permissions: [{ role, permission: {} }], + select_permissions: [{ role, permission: {} }], + update_permissions: [{ role, permission: {} }], + delete_permissions: [{ role, permission: {} }], + }; +} diff --git a/runner/src/provisioner/provisioner.ts b/runner/src/provisioner/provisioner.ts index 237bdb1e6..398ab05f6 100644 --- a/runner/src/provisioner/provisioner.ts +++ b/runner/src/provisioner/provisioner.ts @@ -5,13 +5,14 @@ import { wrapError, wrapSpan } from '../utility'; import cryptoModule from 'crypto'; import HasuraClient, { type HasuraDatabaseConnectionParameters, -} from '../hasura-client'; +} from './hasura-client'; import { logsTableDDL } from './schemas/logs-table'; import { metadataTableDDL } from './schemas/metadata-table'; import PgClientClass, { type PostgresConnectionParams } from '../pg-client'; import { type ProvisioningConfig } from '../indexer-config/indexer-config'; import IndexerMetaClass, { METADATA_TABLE_UPSERT, MetadataFields, IndexerStatus, LogEntry } from '../indexer-meta'; import logger from '../logger'; +import ProvisioningState from './provisioning-state/provisioning-state'; const DEFAULT_PASSWORD_LENGTH = 16; @@ -58,10 +59,13 @@ const defaultRetryConfig: RetryConfig = { baseDelay: 1000 }; +export const METADATA_TABLE_NAME = 'sys_metadata'; +export const LOGS_TABLE_NAME = 'sys_logs'; + export default class Provisioner { tracer: Tracer = trace.getTracer('queryapi-runner-provisioner'); - private readonly SYSTEM_TABLES = ['sys_logs', 'sys_metadata']; + private readonly SYSTEM_TABLES = [METADATA_TABLE_NAME, LOGS_TABLE_NAME]; private readonly logger: typeof logger; constructor ( @@ -162,24 +166,6 @@ export default class Provisioner { ); } - async isProvisioned (indexerConfig: ProvisioningConfig): Promise { - const checkProvisioningSpan = this.tracer.startSpan('Check if indexer is provisioned'); - - const databaseName = indexerConfig.databaseName(); - const schemaName = indexerConfig.schemaName(); - - const sourceExists = await this.hasuraClient.doesSourceExist(databaseName); - if (!sourceExists) { - return false; - } - - const schemaExists = await this.hasuraClient.doesSchemaExist(databaseName, schemaName); - - checkProvisioningSpan.end(); - - return schemaExists; - } - async createSchema (databaseName: string, schemaName: string): Promise { return await wrapError(async () => await this.hasuraClient.createSchema(databaseName, schemaName), 'Failed to create schema'); } @@ -209,10 +195,6 @@ export default class Provisioner { return await wrapError(async () => await this.hasuraClient.executeSqlOnSchema(databaseName, schemaName, sqlScript), 'Failed to run user script'); } - async getTableNames (schemaName: string, databaseName: string): Promise { - return await wrapError(async () => await this.hasuraClient.getTableNames(schemaName, databaseName), 'Failed to fetch table names'); - } - async trackTables (schemaName: string, tableNames: string[], databaseName: string): Promise { return await wrapError(async () => await this.hasuraClient.trackTables(schemaName, tableNames, databaseName), 'Failed to track tables'); } @@ -334,15 +316,22 @@ export default class Provisioner { await wrapSpan(async () => { await wrapError(async () => { + let provisioningState: ProvisioningState; try { - await this.provisionSystemResources(indexerConfig); + provisioningState = await ProvisioningState.loadProvisioningState(this.hasuraClient, indexerConfig); + } catch (error) { + logger.error('Failed to get current state of indexer resources', error); + throw error; + } + try { + await this.provisionSystemResources(indexerConfig, provisioningState); } catch (error) { logger.error('Failed to provision system resources', error); throw error; } try { - await this.provisionUserResources(indexerConfig); + await this.provisionUserResources(indexerConfig, provisioningState); } catch (err) { const error = err as Error; @@ -364,47 +353,90 @@ export default class Provisioner { await indexerMeta.writeLogs([LogEntry.systemError(error.message)]); } - async provisionSystemResources (indexerConfig: ProvisioningConfig): Promise { + async provisionSystemResources (indexerConfig: ProvisioningConfig, provisioningState: ProvisioningState): Promise { const userName = indexerConfig.userName(); const databaseName = indexerConfig.databaseName(); const schemaName = indexerConfig.schemaName(); - if (!await this.hasuraClient.doesSourceExist(databaseName)) { + if (!provisioningState.doesSourceExist()) { const password = this.generatePassword(); await this.createUserDb(userName, password, databaseName); await this.addDatasource(userName, password, databaseName); + } else { + logger.debug('Source already exists'); + } + + if (!provisioningState.doesSchemaExist()) { + await this.createSchema(databaseName, schemaName); + } else { + logger.debug('Schema already exists'); } - await this.createSchema(databaseName, schemaName); + const createdTables = provisioningState.getCreatedTables(); - await this.createMetadataTable(databaseName, schemaName); + if (!createdTables.includes(METADATA_TABLE_NAME)) { + await this.createMetadataTable(databaseName, schemaName); + } else { + logger.debug('Metadata table already exists'); + } await this.setProvisioningStatus(userName, schemaName); - await this.setupPartitionedLogsTable(userName, databaseName, schemaName); - await this.trackTables(schemaName, this.SYSTEM_TABLES, databaseName); + if (!createdTables.includes(LOGS_TABLE_NAME)) { + await this.setupPartitionedLogsTable(userName, databaseName, schemaName); + } else { + logger.debug('Logs table already exists'); + } - await this.exponentialRetry(async () => { - await this.addPermissionsToTables(indexerConfig, this.SYSTEM_TABLES, ['select', 'insert', 'update', 'delete']); - }); + const tablesToTrack = this.SYSTEM_TABLES.filter(systemTable => !provisioningState.getTrackedTables().includes(systemTable)); + if (tablesToTrack.length > 0) { + await this.trackTables(schemaName, tablesToTrack, databaseName); + } else { + logger.debug('All system tables are already tracked'); + } + + const tablesToAddPermissions = this.SYSTEM_TABLES.filter(systemTable => !provisioningState.getTablesWithPermissions().includes(systemTable)); + if (tablesToAddPermissions.length > 0) { + await this.exponentialRetry(async () => { + await this.addPermissionsToTables(indexerConfig, tablesToAddPermissions, ['select', 'insert', 'update', 'delete']); + }); + } else { + logger.debug('All system tables already have permissions'); + } } - async provisionUserResources (indexerConfig: ProvisioningConfig): Promise { + async provisionUserResources (indexerConfig: ProvisioningConfig, provisioningState: ProvisioningState): Promise { const databaseName = indexerConfig.databaseName(); const schemaName = indexerConfig.schemaName(); - await this.runIndexerSql(databaseName, schemaName, indexerConfig.schema); + const onlySystemTablesCreated = provisioningState.getCreatedTables().every((table) => this.SYSTEM_TABLES.includes(table)); + if (onlySystemTablesCreated) { + await this.runIndexerSql(databaseName, schemaName, indexerConfig.schema); + } else { + logger.debug('Skipping user script execution as non system tables have already been created'); + } - const userTableNames = (await this.getTableNames(schemaName, databaseName)).filter((tableName) => !this.SYSTEM_TABLES.includes(tableName)); + await provisioningState.reload(this.hasuraClient); + const userTableNames = provisioningState.getCreatedTables().filter((tableName) => !provisioningState.getTrackedTables().includes(tableName)); - await this.trackTables(schemaName, userTableNames, databaseName); + if (userTableNames.length > 0) { + await this.trackTables(schemaName, userTableNames, databaseName); + } else { + logger.debug('No user tables to track'); + } + // Safely retryable await this.exponentialRetry(async () => { await this.trackForeignKeyRelationships(schemaName, databaseName); }); - await this.exponentialRetry(async () => { - await this.addPermissionsToTables(indexerConfig, userTableNames, ['select', 'insert', 'update', 'delete']); - }); + const tablesWithoutPermissions = userTableNames.filter((tableName) => !provisioningState.getTablesWithPermissions().includes(tableName)); + if (tablesWithoutPermissions.length > 0) { + await this.exponentialRetry(async () => { + await this.addPermissionsToTables(indexerConfig, userTableNames, ['select', 'insert', 'update', 'delete']); + }); + } else { + logger.debug('All user tables already have permissions'); + } } async exponentialRetry (fn: () => Promise): Promise { diff --git a/runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap b/runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap new file mode 100644 index 000000000..e4dccf844 --- /dev/null +++ b/runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap @@ -0,0 +1,250 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ProvisioiningState correctly fetch metadata for existing source and schema 1`] = ` +[ + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableA", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableB", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, +] +`; + +exports[`ProvisioiningState handles table with missing permissions 1`] = ` +[ + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableA", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableB", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableC", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permission": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableD", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, +] +`; + +exports[`ProvisioiningState reload loads metadata and created tables 1`] = ` +[ + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableA", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableB", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, +] +`; diff --git a/runner/src/provisioner/provisioning-state/index.ts b/runner/src/provisioner/provisioning-state/index.ts new file mode 100644 index 000000000..468349a65 --- /dev/null +++ b/runner/src/provisioner/provisioning-state/index.ts @@ -0,0 +1 @@ +export { default } from './provisioning-state'; diff --git a/runner/src/provisioner/provisioning-state/provisioning-state.test.ts b/runner/src/provisioner/provisioning-state/provisioning-state.test.ts new file mode 100644 index 000000000..4b9c2bd21 --- /dev/null +++ b/runner/src/provisioner/provisioning-state/provisioning-state.test.ts @@ -0,0 +1,219 @@ +import { ProvisioningConfig } from '../../indexer-config'; +import { LogLevel } from '../../indexer-meta/log-entry'; +import type HasuraClient from '../hasura-client'; +import { type HasuraTableMetadata, type HasuraConfiguration, type HasuraDatabaseConnectionParameters, type HasuraSource, type HasuraMetadata } from '../hasura-client'; +import ProvisioningState from './provisioning-state'; + +describe('ProvisioiningState', () => { + const provisioningConfig = new ProvisioningConfig( + 'account-id', + 'function-name', + 'schema', + LogLevel.INFO, + ); + + it('can create state whether source exists or not', async () => { + const metadataWithoutUser = generateHasuraMetadata(['some_schema'], ['tableA', 'tableB'], 'someAccount', 'someDb'); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithoutUser); + const mockGetTableNames = jest.fn().mockRejectedValueOnce(new Error('{"error":"source with name "someAccount" does not exist","path":"$.args","code":"not-exists"}')); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.doesSourceExist()).toBe(false); + expect(provisioningState.doesSchemaExist()).toBe(false); + expect(provisioningState.getCreatedTables()).toEqual([]); + expect(provisioningState.getSourceMetadata()).toEqual(undefined); + expect(provisioningState.getMetadataForTables()).toEqual([]); + expect(provisioningState.getTrackedTables()).toEqual([]); + expect(provisioningState.getTablesWithPermissions()).toEqual([]); + }); + + it('state works with existing source', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], 'anotherRole', 'anotherDb')); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.doesSourceExist()).toBe(true); + expect(provisioningState.doesSchemaExist()).toBe(true); + expect(provisioningState.getCreatedTables()).toEqual(['tableA']); + }); + + it('correctly fetch metadata for existing source and schema', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], 'anotherRole', 'anotherDb')); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.getSourceMetadata()?.name).toBe(provisioningConfig.hasuraRoleName()); + expect(provisioningState.getMetadataForTables().length).toBe(2); + expect(provisioningState.getMetadataForTables()).toMatchSnapshot(); + expect(provisioningState.getTrackedTables()).toEqual(['tableA', 'tableB']); + expect(provisioningState.getTablesWithPermissions()).toEqual(['tableA', 'tableB']); + }); + + it('reload loads metadata and created tables', async () => { + const metadataWithoutUser = generateHasuraMetadata(['some_schema'], ['tableA', 'tableB'], 'someAccount', 'someDb'); + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], 'anotherRole', 'anotherDb')); + const mockExportMetadata = jest.fn().mockResolvedValueOnce(metadataWithoutUser).mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockRejectedValueOnce(new Error('{"error":"source with name "someAccount" does not exist","path":"$.args","code":"not-exists"}')).mockResolvedValueOnce(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.doesSourceExist()).toBe(false); + expect(provisioningState.doesSchemaExist()).toBe(false); + expect(provisioningState.getCreatedTables()).toEqual([]); + expect(provisioningState.getSourceMetadata()).toEqual(undefined); + + await provisioningState.reload(mockHasuraClient); + expect(provisioningState.getSourceMetadata()?.name).toBe(provisioningConfig.hasuraRoleName()); + expect(provisioningState.getMetadataForTables().length).toBe(2); + expect(provisioningState.getMetadataForTables()).toMatchSnapshot(); + expect(provisioningState.getTrackedTables()).toEqual(['tableA', 'tableB']); + expect(provisioningState.getTablesWithPermissions()).toEqual(['tableA', 'tableB']); + }); + + it('handles table with missing permissions', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + const role = provisioningConfig.hasuraRoleName(); + const tableMissingPermissions = { + table: { + name: 'tableC', + schema: provisioningConfig.schemaName(), + }, + insert_permissions: [{ role, permission: {} }], + update_permissions: [{ role, permission: {} }], + delete_permissions: [{ role, permission: {} }], + }; + const tableWithIncorrectlyNamedPermission = { + table: { + name: 'tableD', + schema: provisioningConfig.schemaName(), + }, + select_permissions: [{ role, permission: {} }], + insert_permission: [{ role, permission: {} }], + update_permissions: [{ role, permission: {} }], + delete_permissions: [{ role, permission: {} }], + }; + metadataWithUser.sources[1].tables.push(tableMissingPermissions); // First source is a default source + metadataWithUser.sources[1].tables.push(tableWithIncorrectlyNamedPermission); + + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.getSourceMetadata()?.name).toBe(provisioningConfig.hasuraRoleName()); + expect(provisioningState.getMetadataForTables().length).toBe(4); + expect(provisioningState.getMetadataForTables()).toMatchSnapshot(); + expect(provisioningState.getTrackedTables()).toEqual(['tableA', 'tableB', 'tableC', 'tableD']); + expect(provisioningState.getTablesWithPermissions()).toEqual(['tableA', 'tableB']); + }); + + it('throws error when multiple sources with same name exist', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName())); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(() => provisioningState.getSourceMetadata()).toThrow('Expected no more than one source'); + expect(() => provisioningState.getMetadataForTables()).toThrow('Expected no more than one source'); + expect(() => provisioningState.getTrackedTables()).toThrow('Expected no more than one source'); + }); +}); + +function generateHasuraMetadata (schemaNames: string[], tableNames: string[], role: string, db: string): HasuraMetadata { + const sources: HasuraSource[] = []; + // Insert default source which has different format than the rest + sources.push({ + name: 'default', + kind: 'postgres', + tables: [], + configuration: { + connection_info: { + database_url: { from_env: 'HASURA_GRAPHQL_DATABASE_URL' }, + } + } + }); + + sources.push(generateSourceWithTables(schemaNames, tableNames, role, db)); + + return { + version: 3, + sources + }; +} + +function generateSourceWithTables (schemaNames: string[], tableNames: string[], role: string, db: string): HasuraSource { + const tables: HasuraTableMetadata[] = []; + schemaNames.forEach((schemaName) => { + tableNames.forEach((tableName) => { + tables.push(generateTableConfig(schemaName, tableName, role)); + }); + }); + + return { + name: db, + kind: 'postgres', + tables, + configuration: generateHasuraConfiguration(role, 'password'), + }; +} + +function generateTableConfig (schemaName: string, tableName: string, role: string): HasuraTableMetadata { + return { + table: { + name: tableName, + schema: schemaName, + }, + insert_permissions: [{ role, permission: {} }], + select_permissions: [{ role, permission: {} }], + update_permissions: [{ role, permission: {} }], + delete_permissions: [{ role, permission: {} }], + }; +} + +function generateHasuraConfiguration (user: string, password: string): HasuraConfiguration { + return { + connection_info: { + database_url: { connection_parameters: generateConnectionParameter(user, password) }, + isolation_level: 'read-committed', + use_prepared_statements: false + } + }; +} + +function generateConnectionParameter (user: string, password: string): HasuraDatabaseConnectionParameters { + return { + database: user, + host: 'postgres', + password, + port: 5432, + username: user + }; +} diff --git a/runner/src/provisioner/provisioning-state/provisioning-state.ts b/runner/src/provisioner/provisioning-state/provisioning-state.ts new file mode 100644 index 000000000..412fd4b5e --- /dev/null +++ b/runner/src/provisioner/provisioning-state/provisioning-state.ts @@ -0,0 +1,81 @@ +import { type ProvisioningConfig } from '../../indexer-config'; +import { type HasuraTableMetadata, type HasuraMetadata, type HasuraSource, HASURA_PERMISSION_TYPES } from '../hasura-client'; +import type HasuraClient from '../hasura-client'; + +export default class ProvisioningState { + constructor ( + private readonly config: ProvisioningConfig, + private hasuraMetadata: HasuraMetadata, + private tablesInSource: string[], + ) {} + + static async loadProvisioningState (hasuraClient: HasuraClient, provisioningConfig: ProvisioningConfig): Promise { + const hasuraMetadata = await hasuraClient.exportMetadata(); + const tablesInSource = await hasuraClient.getTableNames(provisioningConfig.schemaName(), provisioningConfig.databaseName()).catch((err) => { + const error = err as Error; + if (error.message.includes('source with name') && error.message.includes('not-exists')) { + return []; + } + throw error; + }); + return new ProvisioningState(provisioningConfig, hasuraMetadata, tablesInSource); + } + + async reload (hasuraClient: HasuraClient): Promise { + this.hasuraMetadata = await hasuraClient.exportMetadata(); + this.tablesInSource = await hasuraClient.getTableNames(this.config.schemaName(), this.config.databaseName()).catch((err) => { + const error = err as Error; + if (error.message.includes('source with name') && error.message.includes('not-exists')) { + return []; + } + throw error; + }); + } + + doesSourceExist (): boolean { + return this.hasuraMetadata.sources.some(source => source.name === this.config.databaseName()); + } + + doesSchemaExist (): boolean { + return this.hasuraMetadata.sources.some( + source => source.name === this.config.databaseName() && + source.tables.some( + table => table.table.schema === this.config.schemaName() + ) + ); + } + + getCreatedTables (): string[] { + return this.tablesInSource; + } + + getSourceMetadata (): HasuraSource | undefined { + const matchedSource = this.hasuraMetadata.sources.filter(source => source.name === this.config.databaseName()); + if (matchedSource.length > 1) { + throw new Error(`Expected no more than one source with name ${this.config.databaseName()}. Found ${matchedSource.length}`); + }; + return matchedSource.length === 0 ? undefined : matchedSource[0]; + } + + getMetadataForTables (): HasuraTableMetadata[] { + return this.getSourceMetadata()?.tables.filter(tableMetadata => tableMetadata.table.schema === this.config.schemaName()) ?? []; + } + + getTrackedTables (): string[] { + return this.getMetadataForTables().map(tableMetadata => tableMetadata.table.name); + } + + private tableContainsAllPermissions (tableMetadata: HasuraTableMetadata): boolean { + const allPermissions: string[] = HASURA_PERMISSION_TYPES.map(permission => `${permission}_permissions`); + const metadataKeys = Object.keys(tableMetadata); + return allPermissions.every(permission => metadataKeys.includes(permission)); + } + + // Does not check for partial permissions + getTablesWithPermissions (): string[] { + const tableMetadataList = this.getMetadataForTables(); + return tableMetadataList + .filter(metadata => this.tableContainsAllPermissions(metadata)) + .map(metadata => metadata.table.name); + } +} diff --git a/runner/src/server/services/data-layer/data-layer-service.test.ts b/runner/src/server/services/data-layer/data-layer-service.test.ts index 88541de69..8989c8a06 100644 --- a/runner/src/server/services/data-layer/data-layer-service.test.ts +++ b/runner/src/server/services/data-layer/data-layer-service.test.ts @@ -67,23 +67,6 @@ describe('DataLayerService', () => { }); describe('StartProvisioningTask', () => { - it('returns FAILED_PRECONDITION if already provisioned', (done) => { - const provisioner = { - isProvisioned: jest.fn().mockResolvedValue(true) - } as unknown as Provisioner; - const tasks = {}; - const call = { - request: { accountId: 'testAccount', functionName: 'testFunction', schema: 'testSchema' } - } as unknown as ServerUnaryCall; - const callback = (error: any): void => { - expect(error.code).toBe(status.FAILED_PRECONDITION); - expect(error.details).toBe('Data Layer is already provisioned'); - done(); - }; - - createDataLayerService(provisioner, tasks).StartProvisioningTask(call, callback); - }); - it('should start a new provisioning task', (done) => { const tasks: Record = {}; const provisioner = { diff --git a/runner/src/server/services/data-layer/data-layer-service.ts b/runner/src/server/services/data-layer/data-layer-service.ts index 61a1c94e6..89332b136 100644 --- a/runner/src/server/services/data-layer/data-layer-service.ts +++ b/runner/src/server/services/data-layer/data-layer-service.ts @@ -87,43 +87,19 @@ export function createDataLayerService ( const logger = createLogger(provisioningConfig); - provisioner - .isProvisioned(provisioningConfig) - .then((isProvisioned) => { - if (isProvisioned) { - const failedPrecondition = new StatusBuilder() - .withCode(status.FAILED_PRECONDITION) - .withDetails('Data Layer is already provisioned') - .build(); - - callback(failedPrecondition); - - return; - } - - const taskId = crypto.randomUUID(); - - logger.info(`Starting provisioning task: ${taskId}`); - - tasks[taskId] = new AsyncTask( - provisioner - .provisionUserApi(provisioningConfig) - .then(() => { - logger.info('Successfully provisioned Data Layer'); - }) - ); - - callback(null, { taskId }); - }) - .catch((err) => { - logger.warn('Failed to check if Data Layer is provisioned', err); - - const internal = new StatusBuilder() - .withCode(status.INTERNAL) - .withDetails('Failed to check Data Layer provisioned status') - .build(); - callback(internal); - }); + const taskId = crypto.randomUUID(); + + logger.info(`Starting provisioning task: ${taskId}`); + + tasks[taskId] = new AsyncTask( + provisioner + .provisionUserApi(provisioningConfig) + .then(() => { + logger.info('Successfully provisioned Data Layer'); + }) + ); + + callback(null, { taskId }); }, StartDeprovisioningTask (call: ServerUnaryCall, callback: sendUnaryData): void { diff --git a/runner/src/redis-client/index.ts b/runner/src/stream-handler/redis-client/index.ts similarity index 100% rename from runner/src/redis-client/index.ts rename to runner/src/stream-handler/redis-client/index.ts diff --git a/runner/src/redis-client/redis-client.test.ts b/runner/src/stream-handler/redis-client/redis-client.test.ts similarity index 100% rename from runner/src/redis-client/redis-client.test.ts rename to runner/src/stream-handler/redis-client/redis-client.test.ts diff --git a/runner/src/redis-client/redis-client.ts b/runner/src/stream-handler/redis-client/redis-client.ts similarity index 97% rename from runner/src/redis-client/redis-client.ts rename to runner/src/stream-handler/redis-client/redis-client.ts index 645987c6b..854278cab 100644 --- a/runner/src/redis-client/redis-client.ts +++ b/runner/src/stream-handler/redis-client/redis-client.ts @@ -1,6 +1,6 @@ import { createClient, type RedisClientType } from 'redis'; -import logger from '../logger'; +import logger from '../../logger'; interface StreamMessage { id: string diff --git a/runner/src/stream-handler/worker.ts b/runner/src/stream-handler/worker.ts index 38a6483b5..a9014b140 100644 --- a/runner/src/stream-handler/worker.ts +++ b/runner/src/stream-handler/worker.ts @@ -4,7 +4,7 @@ import promClient from 'prom-client'; import { Block } from '@near-lake/primitives'; import { Indexer } from '../indexer'; -import RedisClient from '../redis-client'; +import RedisClient from './redis-client'; import { METRICS } from '../metrics'; import LakeClient from '../lake-client'; import { WorkerMessageType, type WorkerMessage, ExecutionState } from './stream-handler'; diff --git a/runner/tests/integration.test.ts b/runner/tests/integration.test.ts index cca359990..8cfa1f64d 100644 --- a/runner/tests/integration.test.ts +++ b/runner/tests/integration.test.ts @@ -3,7 +3,7 @@ import { Network, type StartedNetwork } from 'testcontainers'; import { gql, GraphQLClient } from 'graphql-request'; import { Indexer } from '../src/indexer'; -import HasuraClient from '../src/hasura-client'; +import HasuraClient from '../src/provisioner/hasura-client'; import Provisioner from '../src/provisioner'; import PgClient from '../src/pg-client'; From 4b46f54fb820b0545e0c09898d042346190db9bb Mon Sep 17 00:00:00 2001 From: Morgan McCauley Date: Thu, 15 Aug 2024 10:44:18 +1200 Subject: [PATCH 15/17] refactor: Move synchronisation logic to `LifecycleManger` (#1005) This PR moves the synchronisation logic within `ExecutorsHandler`/`BlockStreamsHandler` in to `LifecycleManager`. The motive behind this is to provide greater awareness/control over the individual sync tasks (managing unhealthy, reconfiguring, etc.) to `LifecycleManger`. I plan to build on top of this in my next PR, and have `LifecycleManager` count how many times an unhealthy stream/executor was restarted, and move the Indexer to `Suspended` if it goes above a configured threshold. This refactor makes "counting" actually possible. Wanted to land the refactor PR first to make review easier. --- coordinator/src/handlers/block_streams.rs | 342 ++++++++--------- coordinator/src/handlers/executors.rs | 185 +++++----- coordinator/src/lifecycle.rs | 428 ++++++++++++++++++++-- 3 files changed, 632 insertions(+), 323 deletions(-) diff --git a/coordinator/src/handlers/block_streams.rs b/coordinator/src/handlers/block_streams.rs index b1c004b09..b549fdea4 100644 --- a/coordinator/src/handlers/block_streams.rs +++ b/coordinator/src/handlers/block_streams.rs @@ -18,7 +18,19 @@ use tonic::transport::channel::Channel; use crate::indexer_config::IndexerConfig; use crate::redis::{KeyProvider, RedisClient}; -const RESTART_TIMEOUT_SECONDS: u64 = 600; +#[derive(Debug, PartialEq)] +pub enum BlockStreamStatus { + /// Block Stream is running as expected + Active, + /// Existing Block Stream is in an unhealthy state + Unhealthy, + /// Existing Block Stream is not running + Inactive, + /// Block Stream is not synchronized with the latest config + Outdated, + /// Block Stream has not been encountered before + NotStarted, +} #[cfg(not(test))] use BlockStreamsClientWrapperImpl as BlockStreamsClientWrapper; @@ -191,7 +203,10 @@ impl BlockStreamsHandlerImpl { Ok(()) } - async fn reconfigure(&self, config: &IndexerConfig) -> anyhow::Result<()> { + pub async fn reconfigure(&self, config: &IndexerConfig) -> anyhow::Result<()> { + self.stop_if_needed(config.account_id.clone(), config.function_name.clone()) + .await?; + if matches!( config.start_block, StartBlock::Latest | StartBlock::Height(..) @@ -216,7 +231,7 @@ impl BlockStreamsHandlerImpl { Ok(()) } - async fn start_new_block_stream(&self, config: &IndexerConfig) -> anyhow::Result<()> { + pub async fn start_new_block_stream(&self, config: &IndexerConfig) -> anyhow::Result<()> { let height = match config.start_block { StartBlock::Height(height) => height, StartBlock::Latest => config.get_registry_version(), @@ -254,7 +269,7 @@ impl BlockStreamsHandlerImpl { Ok(height) } - async fn resume(&self, config: &IndexerConfig) -> anyhow::Result<()> { + pub async fn resume(&self, config: &IndexerConfig) -> anyhow::Result<()> { let height = self.get_continuation_block_height(config).await?; tracing::info!(height, "Resuming block stream"); @@ -264,11 +279,7 @@ impl BlockStreamsHandlerImpl { Ok(()) } - async fn ensure_healthy( - &self, - config: &IndexerConfig, - block_stream: &StreamInfo, - ) -> anyhow::Result<()> { + fn is_healthy(&self, block_stream: &StreamInfo) -> bool { if let Some(health) = block_stream.health.as_ref() { let updated_at = SystemTime::UNIX_EPOCH + Duration::from_secs(health.updated_at_timestamp_secs); @@ -280,84 +291,67 @@ impl BlockStreamsHandlerImpl { ); if !stale && !stalled { - return Ok(()); - } else { - tracing::info!( - stale, - stalled, - "Restarting stalled block stream after {RESTART_TIMEOUT_SECONDS} seconds" - ); + return true; } - } else { - tracing::info!( - "Restarting stalled block stream after {RESTART_TIMEOUT_SECONDS} seconds" - ); } - self.stop(block_stream.stream_id.clone()).await?; - tokio::time::sleep(tokio::time::Duration::from_secs(RESTART_TIMEOUT_SECONDS)).await; - let height = self.get_continuation_block_height(config).await?; - self.start(height, config).await?; + false + } + + pub async fn stop_if_needed( + &self, + account_id: AccountId, + function_name: String, + ) -> anyhow::Result<()> { + if let Some(block_stream) = self.get(account_id, function_name).await? { + tracing::info!("Stopping block stream"); + + self.stop(block_stream.stream_id).await?; + } Ok(()) } - pub async fn synchronise( + pub async fn get_status( &self, config: &IndexerConfig, previous_sync_version: Option, - ) -> anyhow::Result<()> { - let block_stream = self + ) -> anyhow::Result { + if let Some(block_stream) = self .get(config.account_id.clone(), config.function_name.clone()) - .await?; - - if let Some(block_stream) = block_stream { - if block_stream.version == config.get_registry_version() { - self.ensure_healthy(config, &block_stream).await?; - return Ok(()); + .await? + { + if block_stream.version != config.get_registry_version() { + return Ok(BlockStreamStatus::Outdated); } - tracing::info!( - previous_version = block_stream.version, - "Stopping outdated block stream" - ); - - self.stop(block_stream.stream_id.clone()).await?; - - self.reconfigure(config).await?; + if !self.is_healthy(&block_stream) { + return Ok(BlockStreamStatus::Unhealthy); + } - return Ok(()); + return Ok(BlockStreamStatus::Active); } if previous_sync_version.is_none() { - self.start_new_block_stream(config).await?; - - return Ok(()); + return Ok(BlockStreamStatus::NotStarted); } if previous_sync_version.unwrap() != config.get_registry_version() { - self.reconfigure(config).await?; - - return Ok(()); + return Ok(BlockStreamStatus::Outdated); } - self.resume(config).await?; - - Ok(()) + Ok(BlockStreamStatus::Inactive) } - pub async fn stop_if_needed( - &self, - account_id: AccountId, - function_name: String, - ) -> anyhow::Result<()> { - if let Some(block_stream) = self.get(account_id, function_name).await? { - tracing::info!("Stopping block stream"); - - self.stop(block_stream.stream_id).await?; + pub async fn restart(&self, config: &IndexerConfig) -> anyhow::Result<()> { + if let Some(block_stream) = self + .get(config.account_id.clone(), config.function_name.clone()) + .await? + { + self.stop(block_stream.stream_id.clone()).await?; } - Ok(()) + self.resume(config).await } } @@ -381,18 +375,84 @@ mod tests { } #[tokio::test] - async fn resumes_stopped_streams() { + async fn returns_stream_status() { + let config = IndexerConfig::default(); + let test_cases = [ + ( + Some(StreamInfo { + version: config.get_registry_version(), + health: Some(block_streamer::Health { + updated_at_timestamp_secs: SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs(), + processing_state: ProcessingState::Running.into(), + }), + ..Default::default() + }), + Some(config.get_registry_version()), + BlockStreamStatus::Active, + ), + ( + None, + Some(config.get_registry_version()), + BlockStreamStatus::Inactive, + ), + ( + Some(StreamInfo { + version: config.get_registry_version() - 1, + ..Default::default() + }), + Some(config.get_registry_version()), + BlockStreamStatus::Outdated, + ), + ( + Some(StreamInfo { + version: config.get_registry_version(), + health: None, + ..Default::default() + }), + Some(config.get_registry_version()), + BlockStreamStatus::Unhealthy, + ), + (None, None, BlockStreamStatus::NotStarted), + ]; + + for (stream, previous_sync_version, expected) in test_cases { + let mut mock_client = BlockStreamsClientWrapper::default(); + mock_client + .expect_get_stream::() + .returning(move |_| { + if let Some(stream) = stream.clone() { + Ok(Response::new(stream)) + } else { + Err(tonic::Status::not_found("not found")) + } + }); + + let mock_redis = RedisClient::default(); + + let handler = BlockStreamsHandlerImpl { + client: mock_client, + redis_client: mock_redis, + }; + + assert_eq!( + expected, + handler + .get_status(&config, previous_sync_version) + .await + .unwrap() + ); + } + } + + #[tokio::test] + async fn resumes_streams() { let config = IndexerConfig::default(); let last_published_block = 10; let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| Err(tonic::Status::not_found("not found"))); mock_client .expect_start_stream::() .with(eq(StartStreamRequest { @@ -406,26 +466,25 @@ mod tests { start_block_height: last_published_block + 1, version: config.get_registry_version(), })) - .returning(|_| Ok(Response::new(StartStreamResponse::default()))); + .returning(|_| Ok(Response::new(StartStreamResponse::default()))) + .once(); let mut mock_redis = RedisClient::default(); mock_redis .expect_get_last_published_block::() - .returning(move |_| Ok(Some(last_published_block))); + .returning(move |_| Ok(Some(last_published_block))) + .once(); let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; - handler - .synchronise(&config, Some(config.get_registry_version())) - .await - .unwrap(); + handler.resume(&config).await.unwrap(); } #[tokio::test] - async fn reconfigures_outdated_streams() { + async fn reconfigures_streams() { let config = IndexerConfig::default(); let existing_stream = StreamInfo { @@ -480,10 +539,7 @@ mod tests { redis_client: mock_redis, }; - handler - .synchronise(&config, Some(config.get_registry_version())) - .await - .unwrap(); + handler.reconfigure(&config).await.unwrap(); } #[tokio::test] @@ -491,13 +547,6 @@ mod tests { let config = IndexerConfig::default(); let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| Err(tonic::Status::not_found("not found"))); mock_client .expect_start_stream::() .with(eq(StartStreamRequest { @@ -524,62 +573,14 @@ mod tests { redis_client: mock_redis, }; - handler.synchronise(&config, None).await.unwrap(); - } - - #[tokio::test] - async fn reconfigures_outdated_and_stopped_streams() { - let config = IndexerConfig { - start_block: StartBlock::Latest, - ..Default::default() - }; - - let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| Err(tonic::Status::not_found("not found"))); - mock_client - .expect_start_stream::() - .with(eq(StartStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - redis_stream: config.get_redis_stream_key(), - rule: Some(Rule::ActionAnyRule(ActionAnyRule { - affected_account_id: "queryapi.dataplatform.near".to_string(), - status: Status::Any.into(), - })), - start_block_height: config.get_registry_version(), - version: config.get_registry_version(), - })) - .returning(|_| Ok(Response::new(StartStreamResponse::default()))); - - let mut mock_redis = RedisClient::default(); - mock_redis - .expect_clear_block_stream::() - .returning(|_| Ok(())) - .once(); - - let handler = BlockStreamsHandlerImpl { - client: mock_client, - redis_client: mock_redis, - }; - - handler - .synchronise(&config, Some(config.get_registry_version() - 1)) - .await - .unwrap(); + handler.start_new_block_stream(&config).await.unwrap(); } #[tokio::test] - async fn restarts_unhealthy_streams() { + async fn unhealthy_stream() { tokio::time::pause(); let config = IndexerConfig::default(); - let last_published_block = 10; let existing_stream = StreamInfo { account_id: config.account_id.to_string(), @@ -595,53 +596,19 @@ mod tests { }), }; - let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_stop_stream::() - .with(eq(StopStreamRequest { - stream_id: existing_stream.stream_id.clone(), - })) - .returning(|_| Ok(Response::new(StopStreamResponse::default()))); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(move |_| Ok(Response::new(existing_stream.clone()))); - mock_client - .expect_start_stream::() - .with(eq(StartStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - redis_stream: config.get_redis_stream_key(), - rule: Some(Rule::ActionAnyRule(ActionAnyRule { - affected_account_id: "queryapi.dataplatform.near".to_string(), - status: Status::Any.into(), - })), - start_block_height: last_published_block + 1, - version: config.get_registry_version(), - })) - .returning(|_| Ok(Response::new(StartStreamResponse::default()))); - - let mut mock_redis = RedisClient::default(); - mock_redis - .expect_get_last_published_block::() - .returning(move |_| Ok(Some(last_published_block))); + let mock_client = BlockStreamsClientWrapper::default(); + let mock_redis = RedisClient::default(); let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; - handler - .synchronise(&config, Some(config.get_registry_version() - 1)) - .await - .unwrap(); + assert!(!handler.is_healthy(&existing_stream)); } #[tokio::test] - async fn ignores_healthy_streams() { + async fn healthy_streams() { tokio::time::pause(); let config = IndexerConfig::default(); @@ -667,21 +634,7 @@ mod tests { }), }; - let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(move |_| Ok(Response::new(existing_stream.clone()))); - mock_client - .expect_stop_stream::() - .never(); - mock_client - .expect_start_stream::() - .never(); - + let mock_client = BlockStreamsClientWrapper::default(); let mock_redis = RedisClient::default(); let handler = BlockStreamsHandlerImpl { @@ -689,10 +642,7 @@ mod tests { redis_client: mock_redis, }; - handler - .synchronise(&config, Some(config.get_registry_version())) - .await - .unwrap(); + assert!(handler.is_healthy(&existing_stream)); } } @@ -709,6 +659,10 @@ mod tests { }; let mut mock_client = BlockStreamsClientWrapper::default(); + mock_client + .expect_get_stream::() + .returning(|_| Err(tonic::Status::not_found("not found"))) + .times(3); mock_client .expect_start_stream::() .with(always()) diff --git a/coordinator/src/handlers/executors.rs b/coordinator/src/handlers/executors.rs index 8b761e99f..55133f76d 100644 --- a/coordinator/src/handlers/executors.rs +++ b/coordinator/src/handlers/executors.rs @@ -14,7 +14,17 @@ use tonic::transport::channel::Channel; use crate::indexer_config::IndexerConfig; use crate::redis::KeyProvider; -const RESTART_TIMEOUT_SECONDS: u64 = 600; +#[derive(Debug, PartialEq)] +pub enum ExecutorStatus { + /// Executor is running as expected + Active, + /// Executor is in an unhealthy state + Unhealthy, + /// Executor is not running + Inactive, + /// Executor is not synchronized with the latest config + Outdated, +} #[cfg(not(test))] use ExecutorsClientWrapperImpl as ExecutorsClientWrapper; @@ -148,56 +158,40 @@ impl ExecutorsHandlerImpl { Ok(()) } - async fn ensure_healthy( - &self, - config: &IndexerConfig, - executor: ExecutorInfo, - ) -> anyhow::Result<()> { + fn is_healthy(&self, executor: ExecutorInfo) -> bool { if let Some(health) = executor.health { - if !matches!( + return !matches!( health.execution_state.try_into(), Ok(ExecutionState::Stalled) - ) { - return Ok(()); - } + ); } - tracing::info!("Restarting stalled executor after {RESTART_TIMEOUT_SECONDS} seconds"); - - self.stop(executor.executor_id).await?; - tokio::time::sleep(tokio::time::Duration::from_secs(RESTART_TIMEOUT_SECONDS)).await; - self.start(config).await?; - - Ok(()) + false } - pub async fn synchronise(&self, config: &IndexerConfig) -> anyhow::Result<()> { + pub async fn get_status(&self, config: &IndexerConfig) -> anyhow::Result { let executor = self .get(config.account_id.clone(), config.function_name.clone()) .await?; if let Some(executor) = executor { - if executor.version == config.get_registry_version() { - self.ensure_healthy(config, executor).await?; - return Ok(()); + if executor.version != config.get_registry_version() { + return Ok(ExecutorStatus::Outdated); } - tracing::info!( - account_id = config.account_id.as_str(), - function_name = config.function_name, - version = executor.version, - "Stopping outdated executor" - ); + if !self.is_healthy(executor) { + return Ok(ExecutorStatus::Unhealthy); + } - self.stop(executor.executor_id).await?; + return Ok(ExecutorStatus::Active); } - tracing::info!( - account_id = config.account_id.as_str(), - function_name = config.function_name, - version = config.get_registry_version(), - "Starting executor" - ); + Ok(ExecutorStatus::Inactive) + } + + pub async fn restart(&self, config: &IndexerConfig) -> anyhow::Result<()> { + self.stop_if_needed(config.account_id.clone(), config.function_name.clone()) + .await?; self.start(config).await?; @@ -238,18 +232,63 @@ mod tests { } #[tokio::test] - async fn resumes_stopped_executors() { + async fn returns_executor_status() { + let config = IndexerConfig::default(); + let test_cases = [ + ( + Some(ExecutorInfo { + version: config.get_registry_version(), + health: None, + ..Default::default() + }), + ExecutorStatus::Unhealthy, + ), + (None, ExecutorStatus::Inactive), + ( + Some(ExecutorInfo { + version: config.get_registry_version() - 1, + ..Default::default() + }), + ExecutorStatus::Outdated, + ), + ( + Some(ExecutorInfo { + version: config.get_registry_version(), + health: Some(runner::Health { + execution_state: runner::ExecutionState::Running.into(), + }), + ..Default::default() + }), + ExecutorStatus::Active, + ), + ]; + + for (executor, expected_status) in test_cases { + let mut mock_client = ExecutorsClientWrapper::default(); + mock_client + .expect_get_executor::() + .with(always()) + .returning(move |_| { + if let Some(executor) = executor.clone() { + Ok(Response::new(executor)) + } else { + Err(tonic::Status::not_found("not found")) + } + }); + + let handler = ExecutorsHandlerImpl { + client: mock_client, + }; + + assert_eq!(handler.get_status(&config).await.unwrap(), expected_status); + } + } + + #[tokio::test] + async fn starts_executors() { let config = IndexerConfig::default(); let mut mock_client = ExecutorsClientWrapper::default(); - mock_client - .expect_get_executor::() - .with(eq(GetExecutorRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| Err(tonic::Status::not_found("not found"))) - .once(); mock_client .expect_start_executor::() .with(eq(StartExecutorRequest { @@ -271,11 +310,11 @@ mod tests { client: mock_client, }; - handler.synchronise(&config).await.unwrap() + handler.start(&config).await.unwrap() } #[tokio::test] - async fn reconfigures_outdated_executors() { + async fn restarts_executors() { let config = IndexerConfig::default(); let executor = ExecutorInfo { @@ -324,11 +363,11 @@ mod tests { client: mock_client, }; - handler.synchronise(&config).await.unwrap() + handler.restart(&config).await.unwrap() } #[tokio::test] - async fn restarts_unhealthy_executors() { + async fn unhealthy_executor() { tokio::time::pause(); let config = IndexerConfig::default(); @@ -343,49 +382,17 @@ mod tests { }), }; - let mut mock_client = ExecutorsClientWrapper::default(); - mock_client - .expect_stop_executor::() - .with(eq(StopExecutorRequest { - executor_id: executor.executor_id.clone(), - })) - .returning(|_| { - Ok(Response::new(StopExecutorResponse { - executor_id: "executor_id".to_string(), - })) - }) - .once(); - mock_client - .expect_start_executor::() - .with(eq(StartExecutorRequest { - code: config.code.clone(), - schema: config.schema.clone(), - redis_stream: config.get_redis_stream_key(), - version: config.get_registry_version(), - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| { - Ok(tonic::Response::new(StartExecutorResponse { - executor_id: "executor_id".to_string(), - })) - }) - .once(); - mock_client - .expect_get_executor::() - .with(always()) - .returning(move |_| Ok(Response::new(executor.clone()))) - .once(); + let mock_client = ExecutorsClientWrapper::default(); let handler = ExecutorsHandlerImpl { client: mock_client, }; - handler.synchronise(&config).await.unwrap() + assert!(!handler.is_healthy(executor)); } #[tokio::test] - async fn ignores_healthy_executors() { + async fn healthy_executors() { tokio::time::pause(); let config = IndexerConfig::default(); @@ -408,23 +415,13 @@ mod tests { }), }; - let mut mock_client = ExecutorsClientWrapper::default(); - mock_client - .expect_stop_executor::() - .never(); - mock_client - .expect_start_executor::() - .never(); - mock_client - .expect_get_executor::() - .with(always()) - .returning(move |_| Ok(Response::new(executor.clone()))); + let mock_client = ExecutorsClientWrapper::default(); let handler = ExecutorsHandlerImpl { client: mock_client, }; - handler.synchronise(&config).await.unwrap() + assert!(handler.is_healthy(executor)); } } } diff --git a/coordinator/src/lifecycle.rs b/coordinator/src/lifecycle.rs index b6715112f..3d29967ee 100644 --- a/coordinator/src/lifecycle.rs +++ b/coordinator/src/lifecycle.rs @@ -1,14 +1,15 @@ use tracing::{info, warn}; -use crate::handlers::block_streams::BlockStreamsHandler; +use crate::handlers::block_streams::{BlockStreamStatus, BlockStreamsHandler}; use crate::handlers::data_layer::DataLayerHandler; -use crate::handlers::executors::ExecutorsHandler; +use crate::handlers::executors::{ExecutorStatus, ExecutorsHandler}; use crate::indexer_config::IndexerConfig; use crate::indexer_state::{IndexerState, IndexerStateManager}; use crate::redis::{KeyProvider, RedisClient}; use crate::registry::Registry; const LOOP_THROTTLE_MS: u64 = 1000; +const RESTART_TIMEOUT_SECONDS: u64 = 600; /// Represents the different lifecycle states of an Indexer #[derive(Default, Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] @@ -124,18 +125,55 @@ impl<'a> LifecycleManager<'a> { return LifecycleState::Suspending; } - if let Err(error) = self + let stream_status = match self .block_streams_handler - .synchronise(config, state.block_stream_synced_at) + .get_status(config, state.block_stream_synced_at) .await { + Ok(status) => status, + Err(error) => { + warn!(?error, "Failed to get block stream status"); + return LifecycleState::Running; + } + }; + + if let Err(error) = match stream_status { + BlockStreamStatus::Active => Ok(()), + BlockStreamStatus::Inactive => self.block_streams_handler.resume(config).await, + BlockStreamStatus::Outdated => self.block_streams_handler.reconfigure(config).await, + BlockStreamStatus::Unhealthy => { + tokio::time::sleep(tokio::time::Duration::from_secs(RESTART_TIMEOUT_SECONDS)).await; + self.block_streams_handler.restart(config).await + } + BlockStreamStatus::NotStarted => { + self.block_streams_handler + .start_new_block_stream(config) + .await + } + } { warn!(?error, "Failed to synchronise block stream, retrying..."); return LifecycleState::Running; } state.block_stream_synced_at = Some(config.get_registry_version()); - if let Err(error) = self.executors_handler.synchronise(config).await { + let executor_status = match self.executors_handler.get_status(config).await { + Ok(status) => status, + Err(error) => { + warn!(?error, "Failed to synchronise executor"); + return LifecycleState::Running; + } + }; + + if let Err(error) = match executor_status { + ExecutorStatus::Active => Ok(()), + ExecutorStatus::Inactive => self.executors_handler.start(config).await, + ExecutorStatus::Outdated => self.executors_handler.restart(config).await, + ExecutorStatus::Unhealthy => { + tokio::time::sleep(tokio::time::Duration::from_secs(RESTART_TIMEOUT_SECONDS)).await; + self.executors_handler.restart(config).await + } + } { warn!(?error, "Failed to synchronise executor, retrying..."); return LifecycleState::Running; } @@ -621,53 +659,162 @@ mod tests { } #[tokio::test] - async fn synchronises_streams_and_executors() { + async fn ignores_active_stream() { let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; let mut block_streams_handler = BlockStreamsHandler::default(); block_streams_handler - .expect_synchronise() - .returning(|_, _| Ok(())) + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn restarts_unhealthy_stream() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Unhealthy)); + block_streams_handler + .expect_restart() + .returning(|_| Ok(())) .once(); let mut executors_handler = ExecutorsHandler::default(); executors_handler - .expect_synchronise() + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn resumes_inactive_streams() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Inactive)); + block_streams_handler + .expect_resume() .returning(|_| Ok(())) .once(); + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); - let mut registry = Registry::default(); - registry - .expect_fetch_indexer() - .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); - let mut state_manager = IndexerStateManager::default(); - state_manager.expect_get_state().returning(|_| { - Ok(IndexerState { - lifecycle_state: LifecycleState::Running, - account_id: "near".parse().unwrap(), - function_name: "function_name".to_string(), - enabled: true, - block_stream_synced_at: None, - }) - }); - state_manager - .expect_set_state() - .with( - always(), - function(|state: &IndexerState| { - state.lifecycle_state == LifecycleState::Running - && state.block_stream_synced_at == Some(2) - }), - ) - .returning(|_, _| Ok(())); + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn reconfigures_outdated_streams() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Outdated)); + block_streams_handler + .expect_reconfigure() + .returning(|_| Ok(())) + .once(); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); let redis_client = RedisClient::default(); let lifecycle_manager = LifecycleManager::new( - config, + config.clone(), &block_streams_handler, &executors_handler, &data_layer_handler, @@ -676,7 +823,218 @@ mod tests { &redis_client, ); - lifecycle_manager.handle_transitions(true).await; + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn starts_new_streams() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::NotStarted)); + block_streams_handler + .expect_start_new_block_stream() + .returning(|_| Ok(())) + .once(); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn ignores_active_executors() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn starts_inactive_executors() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Inactive)); + executors_handler + .expect_start() + .returning(|_| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn restarts_unhealthy_executor() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Unhealthy)); + executors_handler + .expect_restart() + .returning(|_| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn restarts_outdated_executor() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Outdated)); + executors_handler + .expect_restart() + .returning(|_| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; } } From 274b01128384bc742a3282940e6e799ffbab1fc4 Mon Sep 17 00:00:00 2001 From: Morgan McCauley Date: Wed, 4 Sep 2024 08:52:36 +1200 Subject: [PATCH 16/17] chore: Remove unnecessary custom Hasura config (#1020) The existing Hasura config is used for setting up the shared logs/state tables. This is no longer needed and complicates the setup of QueryAPI, therefore I'm removing it. --- README.md | 21 ++---------- hasura/Dockerfile | 9 ----- hasura/config.yaml | 7 ---- hasura/metadata/actions.graphql | 0 hasura/metadata/actions.yaml | 6 ---- hasura/metadata/allow_list.yaml | 1 - hasura/metadata/cron_triggers.yaml | 1 - hasura/metadata/databases/databases.yaml | 14 -------- .../tables/public_indexer_log_entries.yaml | 25 -------------- .../default/tables/public_indexer_state.yaml | 34 ------------------- .../databases/default/tables/tables.yaml | 2 -- hasura/metadata/query_collections.yaml | 1 - hasura/metadata/remote_schemas.yaml | 1 - hasura/metadata/rest_endpoints.yaml | 1 - hasura/metadata/version.yaml | 1 - .../default/1691364619300_init/down.sql | 2 -- .../default/1691364619300_init/up.sql | 25 -------------- runner/tests/integration.test.ts | 2 +- runner/tests/testcontainers/hasura.ts | 10 ++---- 19 files changed, 6 insertions(+), 157 deletions(-) delete mode 100644 hasura/Dockerfile delete mode 100644 hasura/config.yaml delete mode 100644 hasura/metadata/actions.graphql delete mode 100644 hasura/metadata/actions.yaml delete mode 100644 hasura/metadata/allow_list.yaml delete mode 100644 hasura/metadata/cron_triggers.yaml delete mode 100644 hasura/metadata/databases/databases.yaml delete mode 100644 hasura/metadata/databases/default/tables/public_indexer_log_entries.yaml delete mode 100644 hasura/metadata/databases/default/tables/public_indexer_state.yaml delete mode 100644 hasura/metadata/databases/default/tables/tables.yaml delete mode 100644 hasura/metadata/query_collections.yaml delete mode 100644 hasura/metadata/remote_schemas.yaml delete mode 100644 hasura/metadata/rest_endpoints.yaml delete mode 100644 hasura/metadata/version.yaml delete mode 100644 hasura/migrations/default/1691364619300_init/down.sql delete mode 100644 hasura/migrations/default/1691364619300_init/up.sql diff --git a/README.md b/README.md index 682af8129..2db9f194e 100644 --- a/README.md +++ b/README.md @@ -39,27 +39,12 @@ Runner: - `AWS_ACCESS_KEY_ID` - `AWS_SECRET_ACCESS_KEY` -Coordinator: -- `LAKE_AWS_ACCESS_KEY` -- `LAKE_AWS_SECRET_ACCESS_KEY` -- `QUEUE_AWS_ACCESS_KEY` -- `QUEUE_AWS_SECRET_ACCESS_KEY` +Block Streamer: +- `AWS_ACCESS_KEY_ID` +- `AWS_SECRET_ACCESS_KEY` These should be populated with your credentials. In most cases, the same key pair can be used for all 3 sets of credentials. Just ensure the keys have permissions to access S3 for handling [Requestor Pays](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html) in Near Lake. -### Hasura Configuration -Hasura contains shared tables for e.g. logging and setting arbitrary state. These tables must be configured prior to running the entire QueryApi application. Configuration is stored in the `hasura/` directory and deployed through the Hasura CLI. - -To configure Hasura, first start it with: -```sh -docker compose up hasura-graphql --detach -``` - -And apply the configuration with: -```sh -cd ./hasura && hasura deploy -``` - ### Running QueryApi With everything configured correctly, we can now start all components of QueryApi with: ```sh diff --git a/hasura/Dockerfile b/hasura/Dockerfile deleted file mode 100644 index a3cb05d42..000000000 --- a/hasura/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM hasura/graphql-engine:latest.cli-migrations-v3 - -ARG DATABASE_URL -ARG PORT - -COPY migrations /hasura-migrations -COPY metadata /hasura-metadata - -CMD graphql-engine serve diff --git a/hasura/config.yaml b/hasura/config.yaml deleted file mode 100644 index d13faa054..000000000 --- a/hasura/config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -version: 3 -endpoint: http://localhost:8080 -admin_secret: myadminsecretkey -metadata_directory: metadata -actions: - kind: synchronous - handler_webhook_baseurl: http://localhost:3000 diff --git a/hasura/metadata/actions.graphql b/hasura/metadata/actions.graphql deleted file mode 100644 index e69de29bb..000000000 diff --git a/hasura/metadata/actions.yaml b/hasura/metadata/actions.yaml deleted file mode 100644 index 1edb4c2ff..000000000 --- a/hasura/metadata/actions.yaml +++ /dev/null @@ -1,6 +0,0 @@ -actions: [] -custom_types: - enums: [] - input_objects: [] - objects: [] - scalars: [] diff --git a/hasura/metadata/allow_list.yaml b/hasura/metadata/allow_list.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/allow_list.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/cron_triggers.yaml b/hasura/metadata/cron_triggers.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/cron_triggers.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/databases/databases.yaml b/hasura/metadata/databases/databases.yaml deleted file mode 100644 index 65a11b202..000000000 --- a/hasura/metadata/databases/databases.yaml +++ /dev/null @@ -1,14 +0,0 @@ -- name: default - kind: postgres - configuration: - connection_info: - database_url: - from_env: HASURA_GRAPHQL_DATABASE_URL - isolation_level: read-committed - pool_settings: - connection_lifetime: 600 - idle_timeout: 180 - max_connections: 50 - retries: 1 - use_prepared_statements: true - tables: "!include default/tables/tables.yaml" diff --git a/hasura/metadata/databases/default/tables/public_indexer_log_entries.yaml b/hasura/metadata/databases/default/tables/public_indexer_log_entries.yaml deleted file mode 100644 index ff2c158f4..000000000 --- a/hasura/metadata/databases/default/tables/public_indexer_log_entries.yaml +++ /dev/null @@ -1,25 +0,0 @@ -table: - name: indexer_log_entries - schema: public -insert_permissions: -- permission: - backend_only: true - check: {} - columns: - - block_height - - function_name - - message - - timestamp - - id - role: append -select_permissions: -- permission: - columns: - - block_height - - function_name - - message - - timestamp - - id - allow_aggregations: true - filter: {} - role: append diff --git a/hasura/metadata/databases/default/tables/public_indexer_state.yaml b/hasura/metadata/databases/default/tables/public_indexer_state.yaml deleted file mode 100644 index 2bcc6c9b9..000000000 --- a/hasura/metadata/databases/default/tables/public_indexer_state.yaml +++ /dev/null @@ -1,34 +0,0 @@ -table: - name: indexer_state - schema: public -insert_permissions: -- permission: - backend_only: true - check: {} - columns: - - function_name - - current_block_height - - current_historical_block_height - - status - role: append -select_permissions: -- permission: - columns: - - function_name - - current_block_height - - current_historical_block_height - - status - allow_aggregations: true - filter: {} - role: append -update_permissions: -- permission: - backend_only: true - check: {} - columns: - - function_name - - current_block_height - - current_historical_block_height - - status - filter: {} - role: append diff --git a/hasura/metadata/databases/default/tables/tables.yaml b/hasura/metadata/databases/default/tables/tables.yaml deleted file mode 100644 index fb74b4277..000000000 --- a/hasura/metadata/databases/default/tables/tables.yaml +++ /dev/null @@ -1,2 +0,0 @@ -- "!include public_indexer_log_entries.yaml" -- "!include public_indexer_state.yaml" diff --git a/hasura/metadata/query_collections.yaml b/hasura/metadata/query_collections.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/query_collections.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/remote_schemas.yaml b/hasura/metadata/remote_schemas.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/remote_schemas.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/rest_endpoints.yaml b/hasura/metadata/rest_endpoints.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/rest_endpoints.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/version.yaml b/hasura/metadata/version.yaml deleted file mode 100644 index 0a70affa4..000000000 --- a/hasura/metadata/version.yaml +++ /dev/null @@ -1 +0,0 @@ -version: 3 diff --git a/hasura/migrations/default/1691364619300_init/down.sql b/hasura/migrations/default/1691364619300_init/down.sql deleted file mode 100644 index 9ba2f7739..000000000 --- a/hasura/migrations/default/1691364619300_init/down.sql +++ /dev/null @@ -1,2 +0,0 @@ -DROP TABLE public.indexer_log_entries; -DROP TABLE public.indexer_state; diff --git a/hasura/migrations/default/1691364619300_init/up.sql b/hasura/migrations/default/1691364619300_init/up.sql deleted file mode 100644 index 4c1dad71f..000000000 --- a/hasura/migrations/default/1691364619300_init/up.sql +++ /dev/null @@ -1,25 +0,0 @@ -SET check_function_bodies = false; - -CREATE TABLE public.indexer_log_entries ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - function_name text NOT NULL, - block_height numeric NOT NULL, - "timestamp" timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - message text -); - -CREATE TABLE public.indexer_state ( - function_name character varying NOT NULL, - current_block_height numeric(21,0) NOT NULL, - status text, - current_historical_block_height numeric(21,0) -); - -ALTER TABLE ONLY public.indexer_log_entries - ADD CONSTRAINT indexer_log_entries_pkey PRIMARY KEY (id); - -ALTER TABLE ONLY public.indexer_state - ADD CONSTRAINT indexer_state_pkey PRIMARY KEY (function_name); - -CREATE INDEX idx_function_name ON indexer_log_entries(function_name); -CREATE INDEX idx_timestamp ON indexer_log_entries("timestamp"); diff --git a/runner/tests/integration.test.ts b/runner/tests/integration.test.ts index 8cfa1f64d..717fc79db 100644 --- a/runner/tests/integration.test.ts +++ b/runner/tests/integration.test.ts @@ -66,7 +66,7 @@ describe('Indexer integration', () => { postgresContainer = await (await PostgreSqlContainer.build()) .withNetwork(network) .start(); - hasuraContainer = await (await HasuraGraphQLContainer.build()) + hasuraContainer = await new HasuraGraphQLContainer() .withNetwork(network) .withDatabaseUrl(postgresContainer.getConnectionUri(network.getName())) .start(); diff --git a/runner/tests/testcontainers/hasura.ts b/runner/tests/testcontainers/hasura.ts index 4fe28cd0c..98085149a 100644 --- a/runner/tests/testcontainers/hasura.ts +++ b/runner/tests/testcontainers/hasura.ts @@ -9,19 +9,13 @@ export class HasuraGraphQLContainer { private readonly PORT = 8080; - private constructor (private readonly container: GenericContainer) { + constructor (private readonly container = new GenericContainer('hasura/graphql-engine:latest')) { container.withExposedPorts(this.PORT) - .withWaitStrategy(Wait.forLogMessage(/.*Starting API server.*/, 2)) + .withWaitStrategy(Wait.forLogMessage(/.*Starting API server.*/i)) .withLogConsumer(logConsumer) .withStartupTimeout(120_000); } - public static async build (): Promise { - const container = await GenericContainer.fromDockerfile('../hasura/').build(); - - return new HasuraGraphQLContainer(container); - } - public withNetwork (network: StartedNetwork): this { this.container.withNetwork(network); return this; From 72f1ff4bb5eead0b7e9ae54ccda0bc2e1799a816 Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Tue, 3 Sep 2024 14:27:51 -0700 Subject: [PATCH 17/17] chore: Add decomission note to frontend (#1019) As QueryAPi is being decommissioned, this PR adds a note to the frontend and a link to the documentation, where we can provide additional details. image --- frontend/README.md | 4 ++-- frontend/widgets/src/QueryApi.Dashboard.jsx | 13 ++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/frontend/README.md b/frontend/README.md index ea5a8cb1d..492456ea9 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -21,11 +21,11 @@ npm run serve:widgets:prod // for running prod enviornment **Then, Head to `dev.near.org/flags` and enter `http://127.0.0.1:3030`** -> In order to tell our BOS gateway (near.org), where to load the local widgets from, we head to `near.org/flags` and enter the local path we got from running the previous command. If you have not changed any configurations then the default should be `http://127.0.0.1:3030` +> In order to tell our BOS gateway (near.org), where to load the local widgets from, we head to `dev.near.org/flags` and enter the local path we got from running the previous command. If you have not changed any configurations then the default should be `http://127.0.0.1:3030` **Finally**, run the following to serve the local NextJS frontend ```bash -npm dev +npm run dev ``` **Now, head to the path where the widgets are served on the BOS.** diff --git a/frontend/widgets/src/QueryApi.Dashboard.jsx b/frontend/widgets/src/QueryApi.Dashboard.jsx index 73b593bac..809cd242e 100644 --- a/frontend/widgets/src/QueryApi.Dashboard.jsx +++ b/frontend/widgets/src/QueryApi.Dashboard.jsx @@ -2,6 +2,14 @@ const Wrapper = styled.div` margin-top: calc(var(--body-top-padding) * -1); `; +const Banner = styled.div` + background-color: #f8d7da; /* Light red background color */ + color: #721c24; /* Dark red text color */ + padding: 5px; /* Padding around the text */ + text-align: center; /* Center the text */ + border-radius: 4px; /* Rounded corners */ +`; + const Main = styled.div` display: block; `; @@ -63,6 +71,10 @@ const selectIndexerPage = (viewName) => { return ( + +

QueryApi is being decommissioned by Dec 9, 2024. New Indexer creation has been disabled. Please refer to documentation for more details.

+
+ {IS_DEV && ( -
{activeTab === 'launchpad' && IS_DEV && (