diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 44ca722..d723218 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,7 +101,7 @@ jobs: path: dist/ - name: Restore executable permissions - run: chmod +x dist/gpx_quickwit_* + run: chmod +x dist/datasources/quickwit/gpx_quickwit_* - name: Setup Node.js environment uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # ratchet:actions/setup-node@v6 diff --git a/Magefile.go b/Magefile.go index 4710a8a..3a08291 100644 --- a/Magefile.go +++ b/Magefile.go @@ -8,5 +8,16 @@ import ( build "github.com/grafana/grafana-plugin-sdk-go/build" ) +func init() { + // The Go backend belongs to the nested datasource plugin, not the + // top-level app: read its plugin.json for the executable name and emit + // the binaries (and go_plugin_build_manifest) next to it. + _ = build.SetBeforeBuildCallback(func(cfg build.Config) (build.Config, error) { + cfg.PluginJSONPath = "src/datasources/quickwit" + cfg.OutputBinaryPath = "dist/datasources/quickwit" + return cfg, nil + }) +} + // Default configures the default target. var Default = build.BuildAll diff --git a/docker-compose.yaml b/docker-compose.yaml index 1c64608..ca90eca 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -14,12 +14,14 @@ services: build: context: ./.config args: - grafana_version: ${GRAFANA_VERSION:-12.4.0} + grafana_version: ${GRAFANA_VERSION:-13.0.2} grafana_image: ${GRAFANA_IMAGE:-grafana-oss} + environment: + - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=quickwit-quickwit-app,quickwit-quickwit-datasource ports: - 3000:3000/tcp volumes: - - ./:/var/lib/grafana/plugins/grafana-quickwit-datasource + - ./dist:/var/lib/grafana/plugins/quickwit-quickwit-app - ./provisioning:/etc/grafana/provisioning - gquickwit:/var/lib/grafana extra_hosts: diff --git a/package-lock.json b/package-lock.json index 8cec259..ad99ef8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,6 @@ "@codemirror/commands": "^6.8.1", "@codemirror/view": "^6.38.1", "@emotion/css": "^11.11", - "@grafana/data": "^12.1.0", - "@grafana/runtime": "^12.1.0", - "@grafana/ui": "^12.1.0", "@reduxjs/toolkit": "^2.0.0", "@uiw/react-codemirror": "^4.21.21", "lucene": "^2.1.1", @@ -28,10 +25,15 @@ }, "devDependencies": { "@babel/core": "^7.21.4", - "@grafana/e2e-selectors": "10.1.9", + "@grafana/data": "^13.0.2", + "@grafana/e2e-selectors": "^13.0.2", "@grafana/eslint-config": "^6.0.0", "@grafana/plugin-e2e": "^3.4.2", + "@grafana/runtime": "^13.0.2", + "@grafana/scenes": "^7.4.2", + "@grafana/schema": "^13.0.2", "@grafana/tsconfig": "^1.2.0-rc1", + "@grafana/ui": "^13.0.2", "@playwright/test": "^1.58.2", "@storybook/addon-essentials": "^8.6.14", "@storybook/addon-interactions": "^8.6.14", @@ -63,6 +65,7 @@ "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "prettier": "^2.8.7", + "react-router-dom": "^6.30.4", "replace-in-file-webpack-plugin": "^1.0.6", "sass": "1.63.2", "sass-loader": "13.3.1", @@ -87,6 +90,53 @@ "dev": true, "license": "MIT" }, + "node_modules/@adobe/react-spectrum": { + "version": "3.47.2", + "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.47.2.tgz", + "integrity": "sha512-QxsE7bPBGpzwYofACF0RAL/Zs3p0u9HNvCDf9LEN87rEGFpkagIB+T+TSZ0xbl6BJ6z7S02m3zAFk3s9FoHJpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.2", + "@react-types/shared": "^3.36.0", + "@spectrum-icons/ui": "^3.7.1", + "@spectrum-icons/workflow": "^4.3.1", + "@swc/helpers": "^0.5.0", + "client-only": "^0.0.1", + "clsx": "^2.0.0", + "react-aria": "3.50.0", + "react-aria-components": "1.19.0", + "react-stately": "3.48.0", + "react-transition-group": "^4.4.5", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@adobe/react-spectrum-ui": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-ui/-/react-spectrum-ui-1.2.1.tgz", + "integrity": "sha512-wcrbEE2O/9WnEn6avBnaVRRx88S5PLFsPLr4wffzlbMfXeQsy+RMQwaJd3cbzrn18/j04Isit7f7Emfn0dhrJA==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@adobe/react-spectrum-workflow": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-workflow/-/react-spectrum-workflow-2.3.5.tgz", + "integrity": "sha512-b53VIPwPWKb/T5gzE3qs+QlGP5gVrw/LnWV3xMksDU+CRl3rzOKUwxIGiZO8ICyYh1WiyqY4myGlPU/nAynBUg==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@axe-core/playwright": { "version": "4.11.1", "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.11.1.tgz", @@ -536,9 +586,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -600,6 +650,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.0.1.tgz", "integrity": "sha512-URg8UM6lfC9ZYqFipItRSxYJdgpU5d2Z4KnjsJ+rj6tgAmGme7E+PQNCiud8g0HDaZKMovu2qjfa0f5Ge0Vlsg==", + "dev": true, "license": "MIT" }, "node_modules/@codemirror/autocomplete": { @@ -1320,9 +1371,10 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -1341,21 +1393,23 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1365,6 +1419,7 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { @@ -1378,6 +1433,7 @@ "version": "0.17.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { @@ -1391,6 +1447,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -1414,6 +1471,7 @@ "version": "8.42.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "dev": true, "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1423,6 +1481,7 @@ "version": "2.1.7", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, "license": "Apache-2.0", "peer": true, "engines": { @@ -1433,6 +1492,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { @@ -1444,46 +1504,48 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.10" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/react": { - "version": "0.27.16", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", - "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "dev": true, "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.1.6", - "@floating-ui/utils": "^0.2.10", + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", "tabbable": "^6.0.0" }, "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "dev": true, "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -1491,15 +1553,16 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@formatjs/ecma402-abstract": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz", "integrity": "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==", + "dev": true, "license": "MIT", "dependencies": { "@formatjs/fast-memoize": "2.2.7", @@ -1512,12 +1575,14 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/@formatjs/fast-memoize": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz", "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==", + "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.8.0" @@ -1527,12 +1592,14 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/@formatjs/icu-messageformat-parser": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz", "integrity": "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==", + "dev": true, "license": "MIT", "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", @@ -1544,12 +1611,14 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/@formatjs/icu-skeleton-parser": { "version": "1.8.16", "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz", "integrity": "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==", + "dev": true, "license": "MIT", "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", @@ -1560,12 +1629,14 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/@formatjs/intl-durationformat": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/@formatjs/intl-durationformat/-/intl-durationformat-0.7.6.tgz", "integrity": "sha512-jatAN3E84X6aP2UOGK1jTrwD1a7BiG3qWUSEDAhtyNd1BgYeS5wQPtXlnuGF1QRx0DjnwwNOIssyd7oQoRlQeg==", + "dev": true, "license": "MIT", "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", @@ -1577,12 +1648,14 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/@formatjs/intl-localematcher": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz", "integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==", + "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.8.0" @@ -1592,33 +1665,36 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/@grafana/data": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@grafana/data/-/data-12.3.0.tgz", - "integrity": "sha512-oe0ov1iKzvQlct+jtig5s7V3o6XdjloJ+T4ooSKeXcJ1Pm+byg7j0d77HkiuYvFv2e/Na8N4XRvC8EDWQMxA+g==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@grafana/data/-/data-13.0.2.tgz", + "integrity": "sha512-JCqxmNQKD3qkwHQtk1HQFxonfbLsRPf63MpxUtnzHhmUTJ/hfoKYWgpkLrSkbUpFrCPooV2zTpa8oak99rVAiA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@braintree/sanitize-url": "7.0.1", - "@grafana/i18n": "12.3.0", - "@grafana/schema": "12.3.0", + "@grafana/i18n": "13.0.2", + "@grafana/schema": "13.0.2", "@leeoniya/ufuzzy": "1.0.19", "@types/d3-interpolate": "^3.0.0", "@types/string-hash": "1.1.3", "@types/systemjs": "6.15.3", "d3-interpolate": "3.0.1", + "d3-scale-chromatic": "3.1.0", "date-fns": "4.1.0", - "dompurify": "3.3.0", + "dompurify": "3.3.2", "eventemitter3": "5.0.1", "fast_array_intersect": "1.1.0", "history": "4.10.1", - "lodash": "4.17.21", + "lodash": "^4.17.23", "marked": "16.3.0", - "marked-mangle": "1.1.11", + "marked-mangle": "1.1.12", "moment": "2.30.1", "moment-timezone": "0.5.47", - "ol": "10.6.1", + "ol": "10.7.0", "papaparse": "5.5.3", "react-use": "17.6.0", "rxjs": "7.8.2", @@ -1626,108 +1702,72 @@ "tinycolor2": "1.6.0", "tslib": "2.8.1", "uplot": "1.6.32", - "xss": "^1.0.14" + "xss": "^1.0.14", + "zod": "^4.3.0" }, "peerDependencies": { "react": "^18.0.0", "react-dom": "^18.0.0" } }, - "node_modules/@grafana/data/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@grafana/e2e-selectors": { - "version": "10.1.9", - "resolved": "https://registry.npmjs.org/@grafana/e2e-selectors/-/e2e-selectors-10.1.9.tgz", - "integrity": "sha512-5ZcIksTMpnX+8M4lvLOWFM28H5/epRNOH43egsmecQ8V+Cf9JYJPXzxwT+9kJ3b3YWoTFf66D759wyMX2I+kCQ==", + "node_modules/@grafana/data/node_modules/@eslint/eslintrc": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "peer": true, "dependencies": { - "@grafana/tsconfig": "^1.2.0-rc1", - "tslib": "2.6.0", - "typescript": "4.8.4" - } - }, - "node_modules/@grafana/e2e-selectors/node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@grafana/e2e-selectors/node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.0", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=4.2.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@grafana/eslint-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@grafana/eslint-config/-/eslint-config-6.0.1.tgz", - "integrity": "sha512-Tv6BUyJu2kHjrghkQJGhVCwJfNeyNbf/UqqUDW5j04+R0Y4YgWshZ4FrJibkfJc26/3UvfYSnYd+On1psbQIlA==", + "node_modules/@grafana/data/node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", + "peer": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "5.59.9", - "@typescript-eslint/parser": "5.59.9", - "eslint": "8.42.0", - "eslint-config-prettier": "8.8.0", - "eslint-plugin-jsdoc": "46.2.6", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-hooks": "4.6.0", - "typescript": "4.8.4" - } - }, - "node_modules/@grafana/eslint-config/node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@grafana/faro-core": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@grafana/faro-core/-/faro-core-1.19.0.tgz", - "integrity": "sha512-Juo5G/aviSh3XqSGGr6D61noAC8sb+oCawBsv545ILEeOQdINyzRaoQdRpnXEY3DLS9LYtL0PYhvHZiP3rlscQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/otlp-transformer": "^0.202.0" + "node": "*" } }, - "node_modules/@grafana/faro-web-sdk": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@grafana/faro-web-sdk/-/faro-web-sdk-1.19.0.tgz", - "integrity": "sha512-3u74mV2uBWqoF6WBx71p0vtkaS1Z0QbGoZ8tuX5yiYnIybqnhKdGkApFUi7q5se0tMPIeJdMVoRFdLU8f9hfAw==", - "license": "Apache-2.0", - "dependencies": { - "@grafana/faro-core": "^1.19.0", - "ua-parser-js": "^1.0.32", - "web-vitals": "^4.0.1" + "node_modules/@grafana/data/node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@grafana/i18n": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@grafana/i18n/-/i18n-12.3.0.tgz", - "integrity": "sha512-d4LSx0+T5UqaHZhu9chlLogAzSDXXHc9DOyVFslYYiTlebEdE+LuHSuxQWV1xdDj7DDtwfb+1/lCf87ID6nyhg==", + "node_modules/@grafana/data/node_modules/@grafana/i18n": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@grafana/i18n/-/i18n-13.0.2.tgz", + "integrity": "sha512-hNH3kkwR8ST1BNMD8XJJQQ0tP/o5x+ALW22NIa+GKGX0a/C+rZz3de+BOTQwyzukRX4CQiXkC3Yq9nKiQjj8WQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@formatjs/intl-durationformat": "^0.7.0", @@ -1743,51 +1783,15 @@ "react": ">=18" } }, - "node_modules/@grafana/i18n/node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@grafana/i18n/node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@grafana/i18n/node_modules/@typescript-eslint/scope-manager": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.0.tgz", - "integrity": "sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==", + "node_modules/@grafana/data/node_modules/@typescript-eslint/scope-manager": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.64.0.tgz", + "integrity": "sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.48.0", - "@typescript-eslint/visitor-keys": "8.48.0" + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1797,10 +1801,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@grafana/i18n/node_modules/@typescript-eslint/types": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.0.tgz", - "integrity": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==", + "node_modules/@grafana/data/node_modules/@typescript-eslint/types": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.64.0.tgz", + "integrity": "sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==", + "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1810,21 +1815,22 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@grafana/i18n/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.0.tgz", - "integrity": "sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==", + "node_modules/@grafana/data/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.64.0.tgz", + "integrity": "sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.48.0", - "@typescript-eslint/tsconfig-utils": "8.48.0", - "@typescript-eslint/types": "8.48.0", - "@typescript-eslint/visitor-keys": "8.48.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "@typescript-eslint/project-service": "8.64.0", + "@typescript-eslint/tsconfig-utils": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1834,34 +1840,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@grafana/i18n/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@grafana/i18n/node_modules/@typescript-eslint/utils": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.0.tgz", - "integrity": "sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==", + "node_modules/@grafana/data/node_modules/@typescript-eslint/utils": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.64.0.tgz", + "integrity": "sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==", + "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.48.0", - "@typescript-eslint/types": "8.48.0", - "@typescript-eslint/typescript-estree": "8.48.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1871,18 +1863,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@grafana/i18n/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.0.tgz", - "integrity": "sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==", + "node_modules/@grafana/data/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.64.0.tgz", + "integrity": "sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.48.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.64.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1892,35 +1885,37 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@grafana/i18n/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/@grafana/data/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@grafana/i18n/node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "node_modules/@grafana/data/node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -1939,7 +1934,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -1961,10 +1956,11 @@ } } }, - "node_modules/@grafana/i18n/node_modules/eslint-scope": { + "node_modules/@grafana/data/node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -1978,11 +1974,26 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@grafana/i18n/node_modules/eslint-visitor-keys": { + "node_modules/@grafana/data/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/data/node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1990,10 +2001,25 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@grafana/i18n/node_modules/espree": { + "node_modules/@grafana/data/node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@grafana/data/node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -2008,10 +2034,25 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@grafana/i18n/node_modules/file-entry-cache": { + "node_modules/@grafana/data/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/data/node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -2021,10 +2062,11 @@ "node": ">=16.0.0" } }, - "node_modules/@grafana/i18n/node_modules/flat-cache": { + "node_modules/@grafana/data/node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -2035,10 +2077,11 @@ "node": ">=16" } }, - "node_modules/@grafana/i18n/node_modules/globals": { + "node_modules/@grafana/data/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, "license": "MIT", "peer": true, "engines": { @@ -2048,55 +2091,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@grafana/i18n/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@grafana/plugin-e2e": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@grafana/plugin-e2e/-/plugin-e2e-3.4.2.tgz", - "integrity": "sha512-qSsLSjv9tWO+msxASK0gQksvHMcQEHiOeeGi8MjkMXndza9i/SjUNJmnbSu/P9RL0zQeC/BtS9ye14zW5PSlUw==", + "node_modules/@grafana/data/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "Apache-2.0", + "license": "BlueOak-1.0.0", "dependencies": { - "@grafana/e2e-selectors": "13.0.0-22358195095", - "semver": "^7.5.4", - "uuid": "^13.0.0", - "yaml": "^2.3.4" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=20 <=24" + "node": "18 || 20 || >=22" }, - "peerDependencies": { - "@axe-core/playwright": "^4.11.1", - "@playwright/test": "^1.52.0", - "axe-core": "^4.11.1" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@grafana/plugin-e2e/node_modules/@grafana/e2e-selectors": { - "version": "13.0.0-22358195095", - "resolved": "https://registry.npmjs.org/@grafana/e2e-selectors/-/e2e-selectors-13.0.0-22358195095.tgz", - "integrity": "sha512-uh+FbZHYDx3s9zLh9bVb0fyrdg+K0VNNXc1RXXZj0BylUVts9mdf9BlnYC4bA1N0scc/jlZDJ/keXKVvgRxv3Q==", + "node_modules/@grafana/data/node_modules/minimatch/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "semver": "^7.7.0", - "tslib": "2.8.1", - "typescript": "5.9.2" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@grafana/plugin-e2e/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "node_modules/@grafana/data/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -2106,69 +2133,30 @@ "node": ">=10" } }, - "node_modules/@grafana/plugin-e2e/node_modules/tslib": { + "node_modules/@grafana/data/node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, - "node_modules/@grafana/plugin-e2e/node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "node_modules/@grafana/e2e-selectors": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@grafana/e2e-selectors/-/e2e-selectors-13.0.2.tgz", + "integrity": "sha512-XQvEVuz9PxW4oG/yJns7EjFS2cVU2UcbwTX1XqYJs4X7KCtpMvs9VpjqOa6wNuUnbhgKqgEOEGXiW2FnPNNBwg==", "dev": true, "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@grafana/runtime": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@grafana/runtime/-/runtime-12.3.0.tgz", - "integrity": "sha512-UPXJjfyM7sBpA5JQpF2hBKeUwPJ2l2bw2kRY03Iq5bS7xWLPu0EGec/zvXCGaKdbZMX0pZUpac+v2M3AQWA0Qg==", - "license": "Apache-2.0", - "dependencies": { - "@grafana/data": "12.3.0", - "@grafana/e2e-selectors": "12.3.0", - "@grafana/faro-web-sdk": "^1.13.2", - "@grafana/schema": "12.3.0", - "@grafana/ui": "12.3.0", - "@openfeature/core": "^1.9.0", - "@openfeature/ofrep-web-provider": "^0.3.3", - "@openfeature/web-sdk": "^1.6.1", - "@types/systemjs": "6.15.3", - "history": "4.10.1", - "lodash": "4.17.21", - "react-loading-skeleton": "3.5.0", - "react-use": "17.6.0", - "rxjs": "7.8.2", - "tslib": "2.8.1" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@grafana/runtime/node_modules/@grafana/e2e-selectors": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@grafana/e2e-selectors/-/e2e-selectors-12.3.0.tgz", - "integrity": "sha512-b4Q4QVxV6SLfv4q2MGUwX2swNbDzTgHZB/PHe4/AmLBEU/BUrbeyQdRSUr5bj9NDNHqwSPC5ef1fmj7ZRBE+lw==", - "license": "Apache-2.0", "dependencies": { "semver": "^7.7.0", "tslib": "2.8.1", "typescript": "5.9.2" } }, - "node_modules/@grafana/runtime/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "node_modules/@grafana/e2e-selectors/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2177,16 +2165,18 @@ "node": ">=10" } }, - "node_modules/@grafana/runtime/node_modules/tslib": { + "node_modules/@grafana/e2e-selectors/node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, - "node_modules/@grafana/runtime/node_modules/typescript": { + "node_modules/@grafana/e2e-selectors/node_modules/typescript": { "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -2196,161 +2186,1302 @@ "node": ">=14.17" } }, - "node_modules/@grafana/schema": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@grafana/schema/-/schema-12.3.0.tgz", - "integrity": "sha512-LK3IVdluYmcrbz7+ioUK3CrmuYbjBoOuenxAzKuz13Q5xhFd6WLSzWRvnDYP3TyPMnxDtm+8QhL55kaj1aPApg==", + "node_modules/@grafana/eslint-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@grafana/eslint-config/-/eslint-config-6.0.1.tgz", + "integrity": "sha512-Tv6BUyJu2kHjrghkQJGhVCwJfNeyNbf/UqqUDW5j04+R0Y4YgWshZ4FrJibkfJc26/3UvfYSnYd+On1psbQIlA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "tslib": "2.8.1" + "@typescript-eslint/eslint-plugin": "5.59.9", + "@typescript-eslint/parser": "5.59.9", + "eslint": "8.42.0", + "eslint-config-prettier": "8.8.0", + "eslint-plugin-jsdoc": "46.2.6", + "eslint-plugin-react": "7.32.2", + "eslint-plugin-react-hooks": "4.6.0", + "typescript": "4.8.4" } }, - "node_modules/@grafana/schema/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "node_modules/@grafana/eslint-config/node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } }, - "node_modules/@grafana/tsconfig": { - "version": "1.2.0-rc1", - "resolved": "https://registry.npmjs.org/@grafana/tsconfig/-/tsconfig-1.2.0-rc1.tgz", - "integrity": "sha512-+SgQeBQ1pT6D/E3/dEdADqTrlgdIGuexUZ8EU+8KxQFKUeFeU7/3z/ayI2q/wpJ/Kr6WxBBNlrST6aOKia19Ag==", + "node_modules/@grafana/faro-core": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@grafana/faro-core/-/faro-core-2.8.2.tgz", + "integrity": "sha512-63C6+N/P9/ySUMaGut8yVb1DkPuHS5I/lfRm97+aDXFj3+8pxRT/QzyXNe0r6KMU5O95wC9FLVGxG9ZvkwEhJQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/otlp-transformer": "^0.219.0" + } }, - "node_modules/@grafana/ui": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@grafana/ui/-/ui-12.3.0.tgz", - "integrity": "sha512-T6673OHV8nEBQptAKFr0XuPdP0KvCawGhcfvfbGM5ThXzoagEMQjA7eDvqWKq0fPg0fy0AbAE8Ypp/tC51hkWQ==", + "node_modules/@grafana/faro-web-sdk": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@grafana/faro-web-sdk/-/faro-web-sdk-2.8.2.tgz", + "integrity": "sha512-WnUDnyQSQRq22Nb5kqm+g9SellSEUfiEuWQ7Pgwnvj5tnIO72E9JHNnJdurk4MveX8ulWrdyKxyk1L10FUJyzg==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@emotion/css": "11.13.5", - "@emotion/react": "11.14.0", - "@emotion/serialize": "1.3.3", - "@floating-ui/react": "0.27.16", - "@grafana/data": "12.3.0", - "@grafana/e2e-selectors": "12.3.0", - "@grafana/faro-web-sdk": "^1.13.2", - "@grafana/i18n": "12.3.0", - "@grafana/schema": "12.3.0", - "@hello-pangea/dnd": "18.0.1", - "@monaco-editor/react": "4.7.0", - "@popperjs/core": "2.11.8", - "@react-aria/dialog": "3.5.31", - "@react-aria/focus": "3.21.2", - "@react-aria/overlays": "3.30.0", - "@react-aria/utils": "3.31.0", - "@tanstack/react-virtual": "^3.5.1", - "@types/jquery": "3.5.33", - "@types/lodash": "4.17.20", - "@types/react-table": "7.7.20", - "calculate-size": "1.1.1", - "classnames": "2.5.1", - "clsx": "^2.1.1", - "d3": "7.9.0", - "date-fns": "4.1.0", - "downshift": "^9.0.6", - "hoist-non-react-statics": "3.3.2", + "@grafana/faro-core": "^2.8.2", + "ua-parser-js": "1.0.41", + "web-vitals": "^5.1.0" + } + }, + "node_modules/@grafana/i18n": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@grafana/i18n/-/i18n-13.1.0.tgz", + "integrity": "sha512-hgmfauVZvU2TbhsczicXMaT2PU0GDzfPL5v+bQWNDojRHPB2uyq/f2CWrCgpKaEGyJxA7o2HFmTRPcTwvXfjgw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@formatjs/intl-durationformat": "^0.7.0", + "@typescript-eslint/utils": "^8.33.1", + "fast-deep-equal": "^3.1.3", "i18next": "^25.0.0", "i18next-browser-languagedetector": "^8.0.0", - "immutable": "5.1.4", - "is-hotkey": "0.2.0", - "jquery": "3.7.1", - "lodash": "4.17.21", + "i18next-pseudo": "^2.2.1", "micro-memoize": "^4.1.2", - "moment": "2.30.1", - "monaco-editor": "0.34.1", - "ol": "10.6.1", - "prismjs": "1.30.0", - "rc-cascader": "3.34.0", - "rc-drawer": "7.3.0", - "rc-picker": "4.11.3", - "rc-slider": "11.1.9", - "rc-tooltip": "6.4.0", - "react-calendar": "^6.0.0", - "react-colorful": "5.6.1", - "react-custom-scrollbars-2": "4.5.0", - "react-data-grid": "github:grafana/react-data-grid#a922856b5ede21d55db3fdffb6d38dc76bdc7c58", - "react-dropzone": "14.3.8", - "react-highlight-words": "0.21.0", - "react-hook-form": "^7.49.2", - "react-i18next": "^15.0.0", - "react-inlinesvg": "4.2.0", - "react-loading-skeleton": "3.5.0", - "react-router-dom": "5.3.4", - "react-router-dom-v5-compat": "^6.26.1", - "react-select": "5.10.2", - "react-table": "7.8.0", - "react-transition-group": "4.4.5", - "react-use": "17.6.0", - "react-window": "1.8.11", - "rxjs": "7.8.2", - "slate": "0.47.9", - "slate-plain-serializer": "0.7.13", - "slate-react": "0.22.10", - "tinycolor2": "1.6.0", - "tslib": "2.8.1", - "uplot": "1.6.32", - "uuid": "11.1.0", - "uwrap": "0.1.2" + "react-i18next": "^15.0.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": ">=18" } }, - "node_modules/@grafana/ui/node_modules/@grafana/e2e-selectors": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@grafana/e2e-selectors/-/e2e-selectors-12.3.0.tgz", - "integrity": "sha512-b4Q4QVxV6SLfv4q2MGUwX2swNbDzTgHZB/PHe4/AmLBEU/BUrbeyQdRSUr5bj9NDNHqwSPC5ef1fmj7ZRBE+lw==", - "license": "Apache-2.0", + "node_modules/@grafana/i18n/node_modules/@eslint/eslintrc": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "semver": "^7.7.0", - "tslib": "2.8.1", - "typescript": "5.9.2" + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.0", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@grafana/ui/node_modules/@types/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", - "license": "MIT" + "node_modules/@grafana/i18n/node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } }, - "node_modules/@grafana/ui/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@grafana/i18n/node_modules/@typescript-eslint/scope-manager": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.64.0.tgz", + "integrity": "sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@grafana/ui/node_modules/tslib": { + "node_modules/@grafana/i18n/node_modules/@typescript-eslint/types": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.64.0.tgz", + "integrity": "sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@grafana/i18n/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.64.0.tgz", + "integrity": "sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/project-service": "8.64.0", + "@typescript-eslint/tsconfig-utils": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@grafana/i18n/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@grafana/i18n/node_modules/@typescript-eslint/utils": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.64.0.tgz", + "integrity": "sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@grafana/i18n/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.64.0.tgz", + "integrity": "sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.64.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@grafana/i18n/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@grafana/i18n/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@grafana/i18n/node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/@grafana/i18n/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/i18n/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/i18n/node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/i18n/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/i18n/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/i18n/node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@grafana/i18n/node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@grafana/i18n/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@grafana/i18n/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@grafana/plugin-e2e": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@grafana/plugin-e2e/-/plugin-e2e-3.4.2.tgz", + "integrity": "sha512-qSsLSjv9tWO+msxASK0gQksvHMcQEHiOeeGi8MjkMXndza9i/SjUNJmnbSu/P9RL0zQeC/BtS9ye14zW5PSlUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grafana/e2e-selectors": "13.0.0-22358195095", + "semver": "^7.5.4", + "uuid": "^13.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">=20 <=24" + }, + "peerDependencies": { + "@axe-core/playwright": "^4.11.1", + "@playwright/test": "^1.52.0", + "axe-core": "^4.11.1" + } + }, + "node_modules/@grafana/plugin-e2e/node_modules/@grafana/e2e-selectors": { + "version": "13.0.0-22358195095", + "resolved": "https://registry.npmjs.org/@grafana/e2e-selectors/-/e2e-selectors-13.0.0-22358195095.tgz", + "integrity": "sha512-uh+FbZHYDx3s9zLh9bVb0fyrdg+K0VNNXc1RXXZj0BylUVts9mdf9BlnYC4bA1N0scc/jlZDJ/keXKVvgRxv3Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "semver": "^7.7.0", + "tslib": "2.8.1", + "typescript": "5.9.2" + } + }, + "node_modules/@grafana/plugin-e2e/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@grafana/plugin-e2e/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@grafana/plugin-e2e/node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@grafana/react-data-grid": { + "version": "7.0.0-beta.57", + "resolved": "https://registry.npmjs.org/@grafana/react-data-grid/-/react-data-grid-7.0.0-beta.57.tgz", + "integrity": "sha512-v3DuW+TF16Jq5/dNJc0ifReBuknZb4+deB7M+liLMUU8sr2RavguNHpxCk4L/AdqLeXJFGhhqEDUYpeeQm2DzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^18.0 || ^19.0", + "react-dom": "^18.0 || ^19.0" + } + }, + "node_modules/@grafana/runtime": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@grafana/runtime/-/runtime-13.0.2.tgz", + "integrity": "sha512-XIKO7/tgRW2PfV/PQwKEnmHFOKVUDobpydh2WIDEtknSAbZYEF+qlHQcbi8RHmPDOXpfK3cj/HTghjYqVRuevw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grafana/data": "13.0.2", + "@grafana/e2e-selectors": "13.0.2", + "@grafana/faro-web-sdk": "^2.2.4", + "@grafana/schema": "13.0.2", + "@grafana/ui": "13.0.2", + "@openfeature/core": "^1.9.2", + "@openfeature/ofrep-web-provider": "^0.3.6", + "@openfeature/react-sdk": "^1.2.1", + "@openfeature/web-sdk": "^1.7.3", + "@types/systemjs": "6.15.3", + "history": "4.10.1", + "lodash": "^4.17.23", + "react-loading-skeleton": "3.5.0", + "react-use": "17.6.0", + "rxjs": "7.8.2", + "tslib": "2.8.1" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@grafana/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@grafana/scenes": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@grafana/scenes/-/scenes-7.4.2.tgz", + "integrity": "sha512-2zekO8Q4FEjkUNDrrfFC468ZG8o8bSVlyC5Pprq597U32E/1gI4Hrc9bRemud/WG/meAcMKTbfKg4TYuIJRkqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@emotion/css": "11.10.5", + "@emotion/react": "11.10.5", + "@floating-ui/react": "^0.26.16", + "@leeoniya/ufuzzy": "^1.0.16", + "@tanstack/react-virtual": "^3.9.0", + "history": "^4.9.0", + "lodash": "^4.17.21", + "react-grid-layout": "^1.3.4", + "react-select": "^5.10.2", + "react-use": "^17.5.0", + "react-virtualized-auto-sizer": "^1.0.24", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "@grafana/data": ">=11.6", + "@grafana/e2e-selectors": ">=11.6", + "@grafana/i18n": "*", + "@grafana/runtime": ">=11.6", + "@grafana/schema": ">=11.6", + "@grafana/ui": ">=11.6", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-router-dom": "^6.28.0", + "rxjs": "^7.8.1" + } + }, + "node_modules/@grafana/scenes/node_modules/@emotion/css": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.10.5.tgz", + "integrity": "sha512-maJy0wG82hWsiwfJpc3WrYsyVwUbdu+sdIseKUB+/OLjB8zgc3tqkT6eO0Yt0AhIkJwGGnmMY/xmQwEAgQ4JHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/babel-plugin": "^11.10.5", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@grafana/scenes/node_modules/@emotion/react": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz", + "integrity": "sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.5", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@grafana/scenes/node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@grafana/scenes/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@grafana/schema": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@grafana/schema/-/schema-13.0.2.tgz", + "integrity": "sha512-EQUi+UDicmhGWncgw5mXWF9z1dgko3YrCu1WJHq4qTtkaLrVI/Zh8pz2gRlAXUrmFeICAc/FVPF1YI81EKLMZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.8.1" + } + }, + "node_modules/@grafana/schema/node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, - "node_modules/@grafana/ui/node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "node_modules/@grafana/tsconfig": { + "version": "1.2.0-rc1", + "resolved": "https://registry.npmjs.org/@grafana/tsconfig/-/tsconfig-1.2.0-rc1.tgz", + "integrity": "sha512-+SgQeBQ1pT6D/E3/dEdADqTrlgdIGuexUZ8EU+8KxQFKUeFeU7/3z/ayI2q/wpJ/Kr6WxBBNlrST6aOKia19Ag==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@grafana/ui": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@grafana/ui/-/ui-13.0.2.tgz", + "integrity": "sha512-6tBOKsR35j4AmSRY4tPLtR66bBsodQBQK4wuzbRbcLl7RR6VX/IuUg3EOGw/xoOh7rSuOpMLKyjZ8dU4QO7J0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@emotion/css": "11.13.5", + "@emotion/react": "11.14.0", + "@emotion/serialize": "1.3.3", + "@floating-ui/react": "0.27.19", + "@grafana/data": "13.0.2", + "@grafana/e2e-selectors": "13.0.2", + "@grafana/faro-web-sdk": "^2.2.4", + "@grafana/i18n": "13.0.2", + "@grafana/react-data-grid": "7.0.0-beta.57", + "@grafana/schema": "13.0.2", + "@hello-pangea/dnd": "18.0.1", + "@monaco-editor/react": "4.7.0", + "@popperjs/core": "2.11.8", + "@rc-component/cascader": "1.9.0", + "@rc-component/drawer": "1.3.0", + "@rc-component/picker": "1.7.1", + "@rc-component/slider": "1.0.1", + "@rc-component/tooltip": "1.4.0", + "@react-aria/dialog": "3.5.31", + "@react-aria/focus": "3.21.2", + "@react-aria/overlays": "3.30.0", + "@react-aria/utils": "3.31.0", + "@tanstack/react-virtual": "^3.5.1", + "@types/jquery": "3.5.33", + "@types/lodash": "4.17.20", + "@types/react-table": "7.7.20", + "calculate-size": "1.1.1", + "classnames": "2.5.1", + "clsx": "^2.1.1", + "d3": "7.9.0", + "date-fns": "4.1.0", + "downshift": "^9.0.6", + "hoist-non-react-statics": "3.3.2", + "i18next": "^25.0.0", + "i18next-browser-languagedetector": "^8.0.0", + "immutable": "^5.1.5", + "is-hotkey": "0.2.0", + "jquery": "3.7.1", + "lodash": "^4.17.23", + "micro-memoize": "^4.1.2", + "moment": "2.30.1", + "monaco-editor": "0.34.1", + "ol": "10.7.0", + "prismjs": "1.30.0", + "react-calendar": "^6.0.0", + "react-colorful": "5.6.1", + "react-custom-scrollbars-2": "4.5.0", + "react-dropzone": "14.3.8", + "react-highlight-words": "0.21.0", + "react-hook-form": "^7.49.2", + "react-i18next": "^15.0.0", + "react-inlinesvg": "4.2.0", + "react-loading-skeleton": "3.5.0", + "react-router-dom": "5.3.4", + "react-router-dom-v5-compat": "^6.26.1", + "react-select": "5.10.2", + "react-table": "7.8.0", + "react-transition-group": "4.4.5", + "react-use": "17.6.0", + "react-window": "1.8.11", + "rxjs": "7.8.2", + "slate": "0.47.9", + "slate-plain-serializer": "0.7.13", + "slate-react": "0.22.10", + "tinycolor2": "1.6.0", + "tslib": "2.8.1", + "uplot": "1.6.32", + "uuid": "11.1.0", + "uwrap": "0.1.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@grafana/ui/node_modules/@eslint/eslintrc": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.0", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/ui/node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@grafana/ui/node_modules/@floating-ui/react": { + "version": "0.27.19", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.19.tgz", + "integrity": "sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.8", + "@floating-ui/utils": "^0.2.11", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@grafana/ui/node_modules/@grafana/i18n": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@grafana/i18n/-/i18n-13.0.2.tgz", + "integrity": "sha512-hNH3kkwR8ST1BNMD8XJJQQ0tP/o5x+ALW22NIa+GKGX0a/C+rZz3de+BOTQwyzukRX4CQiXkC3Yq9nKiQjj8WQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@formatjs/intl-durationformat": "^0.7.0", + "@typescript-eslint/utils": "^8.33.1", + "fast-deep-equal": "^3.1.3", + "i18next": "^25.0.0", + "i18next-browser-languagedetector": "^8.0.0", + "i18next-pseudo": "^2.2.1", + "micro-memoize": "^4.1.2", + "react-i18next": "^15.0.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@grafana/ui/node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@grafana/ui/node_modules/@typescript-eslint/scope-manager": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.64.0.tgz", + "integrity": "sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@grafana/ui/node_modules/@typescript-eslint/types": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.64.0.tgz", + "integrity": "sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@grafana/ui/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.64.0.tgz", + "integrity": "sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.64.0", + "@typescript-eslint/tsconfig-utils": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@grafana/ui/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@grafana/ui/node_modules/@typescript-eslint/utils": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.64.0.tgz", + "integrity": "sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@grafana/ui/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.64.0.tgz", + "integrity": "sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.64.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@grafana/ui/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@grafana/ui/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@grafana/ui/node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/@grafana/ui/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/ui/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/ui/node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/ui/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/ui/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@grafana/ui/node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@grafana/ui/node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@grafana/ui/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@grafana/ui/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@grafana/ui/node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/@grafana/ui/node_modules/react-router-dom-v5-compat": { + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router-dom-v5-compat/-/react-router-dom-v5-compat-6.30.4.tgz", + "integrity": "sha512-lJP6Zl6DYQtmrnaOV7MW5s/Npe7mYOokwekaPAqjCgIMQmZFfdA8mfoe5kWJoT/xedSdgZLrfFVHx18RUIIcEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.3", + "history": "^5.3.0", + "react-router": "6.30.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8", + "react-router-dom": "4 || 5" + } + }, + "node_modules/@grafana/ui/node_modules/react-router-dom-v5-compat/node_modules/history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, + "node_modules/@grafana/ui/node_modules/react-router-dom/node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/@grafana/ui/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "semver": "bin/semver.js" }, "engines": { - "node": ">=14.17" + "node": ">=10" } }, + "node_modules/@grafana/ui/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/@grafana/ui/node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -2364,6 +3495,7 @@ "version": "18.0.1", "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-18.0.1.tgz", "integrity": "sha512-xojVWG8s/TGrKT1fC8K2tIWeejJYTAeJuj36zM//yEm/ZrnZUSFGS15BpO+jGZT1ybWvyXmeDJwPYb4dhWlbZQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.26.7", @@ -2378,34 +3510,52 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, "license": "Apache-2.0", "peer": true, + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "deprecated": "Use @eslint/config-array instead", + "dev": true, "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", @@ -2420,6 +3570,7 @@ "version": "1.0.1", "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" @@ -2434,12 +3585,14 @@ "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" }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, "license": "Apache-2.0", "peer": true, "engines": { @@ -2451,18 +3604,20 @@ } }, "node_modules/@internationalized/date": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.0.tgz", - "integrity": "sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz", + "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" } }, "node_modules/@internationalized/message": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.8.tgz", - "integrity": "sha512-Rwk3j/TlYZhn3HQ6PyXUV0XP9Uv42jqZGNegt0BXlxjE6G3+LwHjbQZAGHhCnCPdaA6Tvd3ma/7QzLlLkJxAWA==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.10.tgz", + "integrity": "sha512-nc0Or6EdWHqZRcsXb6P9hBIpLsfSl/ILh0rk5h/OVBpzmhdExXtPy2cQtWsq8XKRBpRHwDNnAHt4OpolcB7dog==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0", @@ -2470,18 +3625,20 @@ } }, "node_modules/@internationalized/number": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.5.tgz", - "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==", + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.7.tgz", + "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" } }, "node_modules/@internationalized/string": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.7.tgz", - "integrity": "sha512-D4OHBjrinH+PFZPvfCXvG28n2LSykWcJ7GIioQL+ok0LON15SdfoUssoHzzOUmVZLbRoREsQXVzA6r8JKsbP6A==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.9.tgz", + "integrity": "sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -3406,6 +4563,7 @@ "version": "1.0.19", "resolved": "https://registry.npmjs.org/@leeoniya/ufuzzy/-/ufuzzy-1.0.19.tgz", "integrity": "sha512-0pikDeYt0IHEUPza5RTCDXc/17S1pTrYnReEMp8Aa6k1ovzw5QdZLwicW8TjljwEZRb6oYag0xmALohrcq/yOQ==", + "dev": true, "license": "MIT" }, "node_modules/@lezer/common": { @@ -3460,6 +4618,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz", "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", + "dev": true, "license": "MIT", "dependencies": { "state-local": "^1.0.6" @@ -3469,6 +4628,7 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "dev": true, "license": "MIT", "dependencies": { "@monaco-editor/loader": "^1.5.0" @@ -3483,6 +4643,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -3496,6 +4657,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -3505,6 +4667,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -3515,54 +4678,71 @@ } }, "node_modules/@openfeature/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@openfeature/core/-/core-1.9.1.tgz", - "integrity": "sha512-YySPtH4s/rKKnHRU0xyFGrqMU8XA+OIPNWDrlEFxE6DCVWCIrxE5YpiB94YD2jMFn6SSdA0cwQ8vLkCkl8lm8A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@openfeature/core/-/core-1.11.0.tgz", + "integrity": "sha512-P0u3/ht/oZCQT89fOed+laLk0kZR529a825cS02uPDglxXbE97irWYpDAeRGGVETIzKfuy+H2g8c3Ccv/tXJNQ==", + "dev": true, "license": "Apache-2.0" }, "node_modules/@openfeature/ofrep-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@openfeature/ofrep-core/-/ofrep-core-2.0.0.tgz", - "integrity": "sha512-7adN+3lvx7aAM/4BG8CHBGoRoePPtTa6EVygnNFMECcJvXiXFRcUTUq5lezvYdVG0LGSaw7zkd+hkc8Uwu3HNg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@openfeature/ofrep-core/-/ofrep-core-2.2.0.tgz", + "integrity": "sha512-YbeT8mYS4Ggo/JFcYY1IzN0O0UvsCx7RPk1m40TFc4ip0gJdFVpYc5a8WDwZC2v/YqxreJ7NWBDxHxP5SOevsA==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { "@openfeature/core": "^1.6.0" } }, "node_modules/@openfeature/ofrep-web-provider": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@openfeature/ofrep-web-provider/-/ofrep-web-provider-0.3.5.tgz", - "integrity": "sha512-BhFaEANBhd9GO8sIq/NBcdpQUP7R1QtFE8HjPdXWv6m3DabZ2LiGlCdpAUfVZEkq4cCuxaR0SehyVdheOKP/0w==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@openfeature/ofrep-web-provider/-/ofrep-web-provider-0.3.6.tgz", + "integrity": "sha512-fV4BHab6gg0IMPeJJZ3lxtyfStSpea7N81sHJeBjgf7wYrU/SIYmdWV9Vy5HwlONjcsV58EKtOndV3WdkCqnAQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@openfeature/ofrep-core": "^2.0.0" + "@openfeature/ofrep-core": "^2.1.0" }, "peerDependencies": { "@openfeature/web-sdk": "^1.4.0" } }, + "node_modules/@openfeature/react-sdk": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@openfeature/react-sdk/-/react-sdk-1.4.1.tgz", + "integrity": "sha512-xKpXBXVT0w9CIrhl6IzGkIuxmsqy7At+eYUW1XtaZbk+odKW424ZnmmjqiQMrbu31pfAhQrzww36QokTQaIf7g==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "@openfeature/web-sdk": "^1.9.0", + "react": ">=16.8.0" + } + }, "node_modules/@openfeature/web-sdk": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@openfeature/web-sdk/-/web-sdk-1.7.1.tgz", - "integrity": "sha512-cdN9J+ML8bthNCsdfCfPTQRrEVwoywaUzSuJRLbUeYidO3PmNnxtp0ccXJ2wikqq6vWqJvKhyyAyw2zKk7N/Ww==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@openfeature/web-sdk/-/web-sdk-1.9.0.tgz", + "integrity": "sha512-FCrNfqvE/thHVfCNU0KKx1SD7rk+1wE2UaR5B5OPZl917QJv6AsKRwaI3N+SVgwXWI07GgtXP6hNlTVb49PGhg==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { - "@openfeature/core": "^1.9.0" + "@openfeature/core": "^1.11.0" } }, "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8.0.0" } }, "node_modules/@opentelemetry/api-logs": { - "version": "0.202.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.202.0.tgz", - "integrity": "sha512-fTBjMqKCfotFWfLzaKyhjLvyEyq5vDKTTFfBmx21btv3gvy8Lq6N5Dh2OzqeuN4DjtpSvNT1uNVfg08eD2Rfxw==", + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "^1.3.0" @@ -3572,266 +4752,470 @@ } }, "node_modules/@opentelemetry/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", + "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", + "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@petamoriken/float16": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.3.tgz", + "integrity": "sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "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" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rc-component/cascader": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.9.0.tgz", + "integrity": "sha512-2jbthe1QZrMBgtCvNKkJFjZYC3uKl4N/aYm5SsMvO3T+F+qRT1CGsSM9bXnh1rLj7jDk/GK0natShWF/jinhWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rc-component/select": "~1.3.0", + "@rc-component/tree": "~1.1.0", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/drawer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@rc-component/drawer/-/drawer-1.3.0.tgz", + "integrity": "sha512-rE+sdXEmv2W25VBQ9daGbnb4J4hBIEKmdbj0b3xpY+K7TUmLXDIlSnoXraIbFZdGyek9WxxGKK887uRnFgI+pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/portal": "^2.0.0", + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/motion": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.3.3.tgz", + "integrity": "sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/overflow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/overflow/-/overflow-1.0.1.tgz", + "integrity": "sha512-syfmgAABaHCnCDzPwHZ/2tuvIcpOO3jefYZMmfkN+pmo8HKTzsfhS57vxo4ksPdN0By+uWVJhJWNFozNBxi2eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@rc-component/resize-observer": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/picker": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.7.1.tgz", + "integrity": "sha512-u75rwgbYbH3M2+k22dWOCXv1YUtdb5bgrD7YXCV19H6qS6mUHxQOcqRVTU2JmUPKkq+TOaHC4kDgU83mN2G01w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/trigger": "^3.6.15", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1", + "rc-overflow": "^1.3.2" + }, + "engines": { + "node": ">=12.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/@rc-component/portal": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-2.2.1.tgz", + "integrity": "sha512-ck+r1kW/JSv0wxPji3KN2ss9K6Z0qqwusw/mf/0JobXhZ8hC2ejZwCJObW/SvDi0uhA0VzmCnx0CaCci95tcmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=12.x" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.202.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.202.0.tgz", - "integrity": "sha512-5XO77QFzs9WkexvJQL9ksxL8oVFb/dfi9NWQSq7Sv0Efr9x3N+nb1iklP1TeVgxqJ7m1xWiC/Uv3wupiQGevMw==", - "license": "Apache-2.0", + "node_modules/@rc-component/resize-observer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/resize-observer/-/resize-observer-1.1.2.tgz", + "integrity": "sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==", + "dev": true, + "license": "MIT", "dependencies": { - "@opentelemetry/api-logs": "0.202.0", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/sdk-logs": "0.202.0", - "@opentelemetry/sdk-metrics": "2.0.1", - "@opentelemetry/sdk-trace-base": "2.0.1", - "protobufjs": "^7.3.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" + "@rc-component/util": "^1.2.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@opentelemetry/resources": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", - "license": "Apache-2.0", + "node_modules/@rc-component/select": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.3.6.tgz", + "integrity": "sha512-CzbJ9TwmWcF5asvTMZ9BMiTE9CkkrigeOGRPpzCNmeZP7KBwwmYrmOIiKh9tMG7d6DyGAEAQ75LBxzPx+pGTHA==", + "dev": true, + "license": "MIT", "dependencies": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@rc-component/overflow": "^1.0.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.3.0", + "@rc-component/virtual-list": "^1.0.1", + "clsx": "^2.1.1" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=8.x" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "react": "*", + "react-dom": "*" } }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.202.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.202.0.tgz", - "integrity": "sha512-pv8QiQLQzk4X909YKm0lnW4hpuQg4zHwJ4XBd5bZiXcd9urvrJNoNVKnxGHPiDVX/GiLFvr5DMYsDBQbZCypRQ==", - "license": "Apache-2.0", + "node_modules/@rc-component/slider": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/slider/-/slider-1.0.1.tgz", + "integrity": "sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==", + "dev": true, + "license": "MIT", "dependencies": { - "@opentelemetry/api-logs": "0.202.0", - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1" + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=8.x" }, "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", - "license": "Apache-2.0", + "node_modules/@rc-component/tooltip": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/tooltip/-/tooltip-1.4.0.tgz", + "integrity": "sha512-8Rx5DCctIlLI4raR0I0xHjVTf1aF48+gKCNeAAo5bmF5VoR5YED+A/XEqzXv9KKqrJDRcd3Wndpxh2hyzrTtSg==", + "dev": true, + "license": "MIT", "dependencies": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" + "@rc-component/trigger": "^3.7.1", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" }, "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.1.tgz", - "integrity": "sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==", - "license": "Apache-2.0", + "node_modules/@rc-component/tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.1.0.tgz", + "integrity": "sha512-HZs3aOlvFgQdgrmURRc/f4IujiNBf4DdEeXUlkS0lPoLlx9RoqsZcF0caXIAMVb+NaWqKtGQDnrH8hqLCN5zlA==", + "dev": true, + "license": "MIT", "dependencies": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@rc-component/motion": "^1.0.0", + "@rc-component/util": "^1.2.1", + "@rc-component/virtual-list": "^1.0.1", + "clsx": "^2.1.1" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=10.x" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", - "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" + "react": "*", + "react-dom": "*" } }, - "node_modules/@petamoriken/float16": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.3.tgz", - "integrity": "sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==", - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@rc-component/trigger": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.10.0.tgz", + "integrity": "sha512-uC3QSG7Ax3qLOE5Q2jLqJCJc4iBtJEHzNTPhqGvlRvRcU8x8CT5moIavRVe24YSQKCp2/D1GSq7y76SCSheuVA==", "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", - "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", - "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright": "1.58.2" - }, - "bin": { - "playwright": "cli.js" + "@rc-component/motion": "^1.3.3", + "@rc-component/portal": "^2.2.1", + "@rc-component/resize-observer": "^1.1.2", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" }, "engines": { - "node": ">=18" + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "node_modules/@rc-component/util": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.12.0.tgz", + "integrity": "sha512-AEjPL8JVdohIITaiXokyjL9WQ6tKWWjAYK9QU16tGNE9JaQABBQy+hA4H2Lup5MgXy9yY3iLrbZJheuU13hTdQ==", + "dev": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "is-mobile": "^5.0.0", + "react-is": "^19.2.7" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" + "node_modules/@rc-component/util/node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, + "license": "MIT" }, - "node_modules/@rc-component/portal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", - "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "node_modules/@rc-component/virtual-list": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.3.2.tgz", + "integrity": "sha512-/smuvWBFdP/Is9QuNDKynD0+T3XTXWFyNXXNKJ4sno8CE3bTOK8sfgYmQJtYwLUNX+lv0Ytd+PMshgpmdReq5g==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" + "@babel/runtime": "^8.0.0", + "@rc-component/resize-observer": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" }, "engines": { "node": ">=8.x" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/trigger": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.3.0.tgz", - "integrity": "sha512-iwaxZyzOuK0D7lS+0AQEtW52zUWxoGqTGkke3dRyb8pYiShmRpCjB/8TzPI4R6YySCH7Vm9BZj/31VPiiQTLBg==", - "license": "MIT", + "node_modules/@rc-component/virtual-list/node_modules/@babel/runtime": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-8.0.0.tgz", + "integrity": "sha512-sL6cvO2IfkSu/iU+zs2S/w01B7A8V7suXSIKEN4hPFFdZoiPGxrj5pAG0lCaqLWiEIrjKzdznIWuaLcxPR53qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@react-aria/button": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.15.1.tgz", + "integrity": "sha512-SBMn8ZLvjuWCpSqi6o1hOjsqQqkdYFfzIdl/0LgNPUpTclkJuMx7gNXfM3mjgxzSCoS5CD/XdicvqJanMw6jCw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.23.2", - "@rc-component/portal": "^1.1.0", - "classnames": "^2.3.2", - "rc-motion": "^2.0.0", - "rc-resize-observer": "^1.3.1", - "rc-util": "^5.44.0" - }, - "engines": { - "node": ">=8.x" + "@swc/helpers": "^0.5.0", + "react-aria": "^3.48.0" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@react-aria/dialog": { "version": "3.5.31", "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.31.tgz", "integrity": "sha512-inxQMyrzX0UBW9Mhraq0nZ4HjHdygQvllzloT1E/RlDd61lr3RbmJR6pLsrbKOTtSvDIBJpCso1xEdHCFNmA0Q==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@react-aria/interactions": "^3.25.6", @@ -3850,32 +5234,138 @@ "version": "3.21.2", "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.2.tgz", "integrity": "sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@react-aria/interactions": "^3.25.6", + "@react-aria/utils": "^3.31.0", + "@react-types/shared": "^3.32.1", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/i18n": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.13.1.tgz", + "integrity": "sha512-z56ZYcbfpNmMyiGLhyEjytpmEfoTlBaksk84q4kds3HvNkf7QWKj+DJVfVDrJX+c1LyuBsszLSX7yxJRiHsYKQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.1", + "@internationalized/message": "^3.1.9", + "@internationalized/string": "^3.2.8", + "@swc/helpers": "^0.5.0", + "react-aria": "^3.48.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/interactions": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.28.1.tgz", + "integrity": "sha512-Bqb+HrD5I5MHS2SKBhISYqo2SW8Y2dfzgF/Y1lIJq7xqLxheo9vzxPGEHhz+XzkgGfoqEJx8A6a3C7uiqS3HWA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@react-types/shared": "^3.34.0", + "@swc/helpers": "^0.5.0", + "react-aria": "^3.48.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/overlays": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.30.0.tgz", + "integrity": "sha512-UpjqSjYZx5FAhceWCRVsW6fX1sEwya1fQ/TKkL53FAlLFR8QKuoKqFlmiL43YUFTcGK3UdEOy3cWTleLQwdSmQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { + "@react-aria/focus": "^3.21.2", + "@react-aria/i18n": "^3.12.13", "@react-aria/interactions": "^3.25.6", + "@react-aria/ssr": "^3.9.10", "@react-aria/utils": "^3.31.0", + "@react-aria/visually-hidden": "^3.8.28", + "@react-stately/overlays": "^3.6.20", + "@react-types/button": "^3.14.1", + "@react-types/overlays": "^3.9.2", + "@react-types/shared": "^3.32.1", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.10.1.tgz", + "integrity": "sha512-jn038/ZYmu6DpfXJ6r2U9zFFppjbc9wnApPJSCxao2RZVEqep4YyoniHSy8qv6V21/xyS4IV7W9a+X2jOjSuag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0", + "react-aria": "^3.48.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/utils": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.31.0.tgz", + "integrity": "sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.10", + "@react-stately/flags": "^3.1.2", + "@react-stately/utils": "^3.10.8", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/visually-hidden": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.9.1.tgz", + "integrity": "sha512-PWuth+NTmUiBJAIyrfk7dJ5BxOBupDt0iFGlBiYr5FElSYvwN9LAk1kgkzm6hT2qzq4FmYdQgBSPkGeaxOui6w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0", + "react-aria": "^3.48.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/i18n": { - "version": "3.12.13", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.13.tgz", - "integrity": "sha512-YTM2BPg0v1RvmP8keHenJBmlx8FXUKsdYIEX7x6QWRd1hKlcDwphfjzvt0InX9wiLiPHsT5EoBTpuUk8SXc0Mg==", + "node_modules/@react-spectrum/button": { + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.18.1.tgz", + "integrity": "sha512-FW+1d6zfKesMLaBrsRsnnYnsLfvf2qFKuatkCo62o1oGUBtEYI/kae+lwGwlfiX5q9P5OgR2y1IqKtxabf/JKQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@internationalized/date": "^3.10.0", - "@internationalized/message": "^3.1.8", - "@internationalized/number": "^3.6.5", - "@internationalized/string": "^3.2.7", - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.31.0", - "@react-types/shared": "^3.32.1", + "@adobe/react-spectrum": "^3.47.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -3883,16 +5373,14 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/interactions": { - "version": "3.25.6", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.6.tgz", - "integrity": "sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==", + "node_modules/@react-spectrum/dialog": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.10.1.tgz", + "integrity": "sha512-RMoZkKswUMFiEnAHZljEV1ybpMUjrS5RxkwWb3IFMo+ZtnLIeIT87k4DxoUJKOVrw3bnSsLRSTw1Fvf7jZ/eFw==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.31.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.32.1", + "@adobe/react-spectrum": "^3.47.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -3900,22 +5388,14 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/overlays": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.30.0.tgz", - "integrity": "sha512-UpjqSjYZx5FAhceWCRVsW6fX1sEwya1fQ/TKkL53FAlLFR8QKuoKqFlmiL43YUFTcGK3UdEOy3cWTleLQwdSmQ==", + "node_modules/@react-spectrum/overlays": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-5.10.1.tgz", + "integrity": "sha512-VSpplRbzYA/Hmg+fR7fonj/Q3jq7mJHD6A5f189teX5/uRiTk7P4DogBYfU1a70BAq3xBEA4hV3QpA8i9pK8jQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.31.0", - "@react-aria/visually-hidden": "^3.8.28", - "@react-stately/overlays": "^3.6.20", - "@react-types/button": "^3.14.1", - "@react-types/overlays": "^3.9.2", - "@react-types/shared": "^3.32.1", + "@adobe/react-spectrum": "^3.47.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -3923,131 +5403,152 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/ssr": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz", - "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==", + "node_modules/@react-spectrum/provider": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.11.1.tgz", + "integrity": "sha512-TsoNdVdmlQ7L+75ILq5Yb3+wp/I1AtIeat0o+Y+ZBxP+TtWpwT1ZtCB5l3cplFVzHzOpZlzO0VaDrDP9ElGYDw==", + "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { + "@adobe/react-spectrum": "^3.47.0", "@swc/helpers": "^0.5.0" }, - "engines": { - "node": ">= 12" - }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/utils": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.31.0.tgz", - "integrity": "sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==", + "node_modules/@react-stately/flags": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.2.1.tgz", + "integrity": "sha512-WPw9z4SPYqQMuExCnBNrQyyxCWSi9CDYnVqca19bqxaHZRT/uL5nL+IGCPHHa70Y5rx39E5hYKl8Hf0QJ6XKyA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.10.8", - "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" + "react-stately": "^3.46.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/visually-hidden": { - "version": "3.8.28", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.28.tgz", - "integrity": "sha512-KRRjbVVob2CeBidF24dzufMxBveEUtUu7IM+hpdZKB+gxVROoh4XRLPv9SFmaH89Z7D9To3QoykVZoWD0lan6Q==", + "node_modules/@react-stately/overlays": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.7.1.tgz", + "integrity": "sha512-vGw9f8i5kPvaQqvvQ8iIhPhJZorwtg2rXycqnUNXkNLadewh1S0ocbnRvrb4HW/GGC37rFmGcG1fYCHA/WIn6w==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/utils": "^3.31.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" + "@swc/helpers": "^0.5.0", + "react-stately": "^3.46.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-stately/flags": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz", - "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==", + "node_modules/@react-stately/utils": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.12.1.tgz", + "integrity": "sha512-NqKfzrknpfwiewx7R2vk1P+CneClInPDsIhw15+jOcUYSEfej0nta4cJywuKQJ2gsPwqX/ojDNixedCve9FWGw==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@swc/helpers": "^0.5.0" + "@swc/helpers": "^0.5.0", + "react-stately": "^3.46.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-stately/overlays": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.20.tgz", - "integrity": "sha512-YAIe+uI8GUXX8F/0Pzr53YeC5c/bjqbzDFlV8NKfdlCPa6+Jp4B/IlYVjIooBj9+94QvbQdjylegvYWK/iPwlg==", + "node_modules/@react-types/button": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.16.0.tgz", + "integrity": "sha512-Z5///n2Y1jtF0gokBq2Y1K1cpOwsWZ24HPeAm3eEmZrbBXMrxC2oEA5ZThsSHuIGsqiyNJiQ2scsDftmr+PkZw==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@react-stately/utils": "^3.10.8", - "@react-types/overlays": "^3.9.2", - "@swc/helpers": "^0.5.0" + "@react-aria/button": "^3.15.0", + "@react-spectrum/button": "^3.18.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "@react-spectrum/provider": "^3.0.0", + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-stately/utils": { - "version": "3.10.8", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.8.tgz", - "integrity": "sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==", + "node_modules/@react-types/dialog": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.6.0.tgz", + "integrity": "sha512-vvxohmsTRZWE/saaJt6mMy3ONA4xbQTSk1okfMUK6OMSp/VpLBRLCz/2/myiMK3UIBCagUnrwzOwbk9whnFx0g==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@swc/helpers": "^0.5.0" + "@react-aria/dialog": "^3.6.0", + "@react-spectrum/dialog": "^3.10.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "@react-spectrum/provider": "^3.0.0", + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-types/button": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.14.1.tgz", - "integrity": "sha512-D8C4IEwKB7zEtiWYVJ3WE/5HDcWlze9mLWQ5hfsBfpePyWCgO3bT/+wjb/7pJvcAocrkXo90QrMm85LcpBtrpg==", + "node_modules/@react-types/dialog/node_modules/@react-aria/dialog": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.6.1.tgz", + "integrity": "sha512-Eo3Kj23TjENuERUYrGkH+VN1PJvK8/zep76pfwBg29erUVDpGdfagYRq82aGcxJ/ohG8iRxZDwp2tTrU1RG1MQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@react-types/shared": "^3.32.1" + "@swc/helpers": "^0.5.0", + "react-aria": "^3.48.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-types/dialog": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.22.tgz", - "integrity": "sha512-smSvzOcqKE196rWk0oqJDnz+ox5JM5+OT0PmmJXiUD4q7P5g32O6W5Bg7hMIFUI9clBtngo8kLaX2iMg+GqAzg==", + "node_modules/@react-types/overlays": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.10.0.tgz", + "integrity": "sha512-cgrcOTxy6ac0kiphQOkc8mj5artZMB/XVrFgukRZ2FcbYNEERpg2VQ5ztd0+H1ER7O0kx7AmwHxdut+x1EAjrw==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@react-types/overlays": "^3.9.2", - "@react-types/shared": "^3.32.1" + "@react-aria/overlays": "^3.32.0", + "@react-spectrum/overlays": "^5.10.0", + "@react-stately/overlays": "^3.7.0", + "@react-types/shared": "^3.34.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "@react-spectrum/provider": "^3.0.0", + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-types/overlays": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.9.2.tgz", - "integrity": "sha512-Q0cRPcBGzNGmC8dBuHyoPR7N3057KTS5g+vZfQ53k8WwmilXBtemFJPLsogJbspuewQ/QJ3o2HYsp2pne7/iNw==", + "node_modules/@react-types/overlays/node_modules/@react-aria/overlays": { + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.32.1.tgz", + "integrity": "sha512-jjVLcEK5qaGsz3SmW+eLV3QFiJzdDFzgNofPwvzBS1KTPox0a2x5u1ITUPmHwyUNiyexy531h5eVjN3tULEzHQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@react-types/shared": "^3.32.1" + "@swc/helpers": "^0.5.0", + "react-aria": "^3.48.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@react-types/shared": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.32.1.tgz", - "integrity": "sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.36.0.tgz", + "integrity": "sha512-DkP/H0C2YjjS7gZWKNqOmU8a16qHPjQNdzMwmTq9SzplM6Iw0kVMTZ0OIoe6FOgGqa+FwMsE2QbPjh/n3g/jXQ==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" @@ -4080,9 +5581,10 @@ } }, "node_modules/@remix-run/router": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", - "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", + "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=14.0.0" @@ -4115,6 +5617,39 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@spectrum-icons/ui": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.7.1.tgz", + "integrity": "sha512-veQymocUYo5OciXQajSailOdbWe+k6+2ehfF8D4d0V923D4xOUadtT253xXZ5vEQjPat6Kyp2WDKeQNjd7kL1w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@adobe/react-spectrum-ui": "1.2.1", + "@babel/runtime": "^7.24.4", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "@adobe/react-spectrum": "^3.47.0", + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@spectrum-icons/workflow": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.3.1.tgz", + "integrity": "sha512-kDF+/EbFVyLGytotqqdYt4uSij4j/PQmDQO5km/C6DyzKjyuic3FnSBFinR+mA6oFv1OjMcLvrrDBqK3wbqRlA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@adobe/react-spectrum-workflow": "2.3.5", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "@adobe/react-spectrum": "^3.47.0", + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, "node_modules/@standard-schema/spec": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", @@ -5124,6 +6659,7 @@ "version": "0.5.17", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -5133,6 +6669,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/@swc/jest": { @@ -5164,12 +6701,13 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz", - "integrity": "sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==", + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.14.6.tgz", + "integrity": "sha512-4+Uq8m0/gzO4kMCHUEpTtGX1RnONK0C+g88b2ltwPMWUBiaVarBuWKoPJaz7gj1cKCVRAdyu+U8GcKhwCc2beA==", + "dev": true, "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.13.12" + "@tanstack/virtual-core": "3.17.4" }, "funding": { "type": "github", @@ -5181,9 +6719,10 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", - "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.4.tgz", + "integrity": "sha512-nGm5KteqxasUdThLc2izl6dHUqLv0LQj7Nuyo5gYalTPf/U8a9ermvsl7reT+6ioBW1l8WfpP/mcU338nLXpqw==", + "dev": true, "license": "MIT", "funding": { "type": "github", @@ -5392,12 +6931,14 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-color": "*" @@ -5436,6 +6977,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, "license": "MIT" }, "node_modules/@types/graceful-fs": { @@ -5545,6 +7087,7 @@ "version": "3.5.33", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.33.tgz", "integrity": "sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==", + "dev": true, "license": "MIT", "dependencies": { "@types/sizzle": "*" @@ -5554,6 +7097,7 @@ "version": "2.2.7", "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==", + "dev": true, "license": "MIT" }, "node_modules/@types/jsdom": { @@ -5572,6 +7116,7 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, "license": "MIT" }, "node_modules/@types/lodash": { @@ -5599,6 +7144,7 @@ "version": "20.19.25", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -5620,6 +7166,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/rbush/-/rbush-4.0.0.tgz", "integrity": "sha512-+N+2H39P8X+Hy1I5mC6awlTX54k3FhiUmvt7HWzGJZvF+syUAAxP/stwppS8JE84YHqFgRMv6fCy31202CMFxQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/react": { @@ -5646,6 +7193,7 @@ "version": "7.7.20", "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.7.20.tgz", "integrity": "sha512-ahMp4pmjVlnExxNwxyaDrFgmKxSbPwU23sGQw2gJK4EhCvnvmib2s/O/+y1dfV57dXOwpr2plfyBol+vEHbi2w==", + "dev": true, "license": "MIT", "dependencies": { "@types/react": "*" @@ -5678,6 +7226,7 @@ "version": "2.3.10", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", + "dev": true, "license": "MIT" }, "node_modules/@types/stack-utils": { @@ -5691,12 +7240,14 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/string-hash/-/string-hash-1.1.3.tgz", "integrity": "sha512-p6skq756fJWiA59g2Uss+cMl6tpoDGuCBuxG0SI1t0NwJmYOU66LAMS6QiCgu7cUh3/hYCaMl5phcCW1JP5wOA==", + "dev": true, "license": "MIT" }, "node_modules/@types/systemjs": { "version": "6.15.3", "resolved": "https://registry.npmjs.org/@types/systemjs/-/systemjs-6.15.3.tgz", "integrity": "sha512-STyj2LUevlyVqEQ1wjOORLQTJbNnM2V1DNzmemxVHlOovdKBKqccALDbR9aCcTRThhcXzew88SMbN4SMm6JOcw==", + "dev": true, "license": "MIT" }, "node_modules/@types/testing-library__jest-dom": { @@ -5720,6 +7271,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, "license": "MIT", "optional": true }, @@ -5727,6 +7279,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "devOptional": true, "license": "MIT" }, "node_modules/@types/uuid": { @@ -5830,14 +7383,15 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.0.tgz", - "integrity": "sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.64.0.tgz", + "integrity": "sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.48.0", - "@typescript-eslint/types": "^8.48.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.64.0", + "@typescript-eslint/types": "^8.64.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5847,13 +7401,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.0.tgz", - "integrity": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.64.0.tgz", + "integrity": "sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==", + "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5882,9 +7437,10 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.0.tgz", - "integrity": "sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.64.0.tgz", + "integrity": "sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==", + "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5894,7 +7450,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { @@ -6389,6 +7945,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-2.0.2.tgz", "integrity": "sha512-Do66mSlSNifFFuo3l9gNKfRMSFi26CRuQMsDJuuKO/ekrDWuTTtE4ZQxoFCUOG+NgxnpSeBq/k5TY8ZseEzLpA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/wojtekmaj/date-utils?sponsor=1" @@ -6398,6 +7955,7 @@ "version": "1.9.5", "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==", + "dev": true, "license": "MIT" }, "node_modules/@xtuc/ieee754": { @@ -6426,6 +7984,7 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -6462,6 +8021,7 @@ "version": "5.3.2", "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" @@ -6484,6 +8044,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-px-to-style/-/add-px-to-style-1.0.0.tgz", "integrity": "sha512-YMyxSlXpPjD8uWekCQGuN40lV4bnZagUwqa2m/uFv1z/tNImSk9fnXVMUI5qwME/zzI3MMQRvjZ+69zyfSSyew==", + "dev": true, "license": "MIT" }, "node_modules/agent-base": { @@ -6500,9 +8061,10 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6622,6 +8184,7 @@ "version": "4.3.0", "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" @@ -6668,8 +8231,22 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, "license": "Python-2.0" }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", @@ -6857,6 +8434,7 @@ "version": "2.2.5", "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -7024,6 +8602,7 @@ "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" }, "node_modules/baseline-browser-mapping": { @@ -7085,6 +8664,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -7184,6 +8764,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/calculate-size/-/calculate-size-1.1.1.tgz", "integrity": "sha512-jJZ7pvbQVM/Ss3VO789qpsypN3xmnepg242cejOAslsmlZLYw2dnj7knnNowabQ0Kzabzx56KFTy2Pot/y6FmA==", + "dev": true, "license": "MIT" }, "node_modules/call-bind": { @@ -7318,6 +8899,7 @@ "version": "4.1.2", "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", @@ -7425,6 +9007,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "dev": true, "license": "MIT" }, "node_modules/clean-css": { @@ -7450,6 +9033,13 @@ "node": ">=0.10.0" } }, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -7524,6 +9114,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -7566,6 +9157,7 @@ "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, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -7578,6 +9170,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" }, "node_modules/colorette": { @@ -7604,6 +9197,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10" @@ -7630,12 +9224,14 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, "node_modules/constants-browserify": { @@ -7662,6 +9258,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dev": true, "license": "MIT", "dependencies": { "toggle-selection": "^1.0.6" @@ -7827,6 +9424,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -7841,6 +9439,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dev": true, "license": "MIT", "dependencies": { "tiny-invariant": "^1.0.6" @@ -7850,6 +9449,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "dev": true, "license": "MIT", "dependencies": { "hyphenate-style-name": "^1.0.3" @@ -7925,6 +9525,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, "license": "MIT", "dependencies": { "mdn-data": "2.0.14", @@ -7938,6 +9539,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -7980,6 +9582,7 @@ "version": "0.0.10", "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", + "dev": true, "license": "MIT" }, "node_modules/cssom": { @@ -8019,6 +9622,7 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dev": true, "license": "ISC", "dependencies": { "d3-array": "3", @@ -8060,6 +9664,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dev": true, "license": "ISC", "dependencies": { "internmap": "1 - 2" @@ -8072,6 +9677,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8081,6 +9687,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dev": true, "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -8097,6 +9704,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dev": true, "license": "ISC", "dependencies": { "d3-path": "1 - 3" @@ -8109,6 +9717,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8118,6 +9727,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dev": true, "license": "ISC", "dependencies": { "d3-array": "^3.2.0" @@ -8130,6 +9740,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dev": true, "license": "ISC", "dependencies": { "delaunator": "5" @@ -8142,6 +9753,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8151,6 +9763,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dev": true, "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -8164,6 +9777,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dev": true, "license": "ISC", "dependencies": { "commander": "7", @@ -8189,6 +9803,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=12" @@ -8198,6 +9813,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dev": true, "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" @@ -8210,6 +9826,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dev": true, "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -8221,9 +9838,10 @@ } }, "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8233,6 +9851,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dev": true, "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" @@ -8245,6 +9864,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8254,6 +9874,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dev": true, "license": "ISC", "dependencies": { "d3-color": "1 - 3" @@ -8266,6 +9887,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8275,6 +9897,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8284,6 +9907,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8293,6 +9917,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8302,6 +9927,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dev": true, "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", @@ -8318,6 +9944,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dev": true, "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -8331,6 +9958,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8340,6 +9968,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, "license": "ISC", "dependencies": { "d3-path": "^3.1.0" @@ -8352,6 +9981,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dev": true, "license": "ISC", "dependencies": { "d3-array": "2 - 3" @@ -8364,6 +9994,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dev": true, "license": "ISC", "dependencies": { "d3-time": "1 - 3" @@ -8376,6 +10007,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8385,6 +10017,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dev": true, "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -8404,6 +10037,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dev": true, "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -8489,20 +10123,13 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" } }, - "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -8524,6 +10151,7 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, "license": "MIT" }, "node_modules/dedent": { @@ -8587,6 +10215,7 @@ "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" }, "node_modules/deepmerge": { @@ -8646,9 +10275,10 @@ } }, "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "dev": true, "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" @@ -8720,6 +10350,7 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/direction/-/direction-0.1.5.tgz", "integrity": "sha512-HceXsAluGbXKCz2qCVbXFUH4Vn4eNMWxY5gzydMFMnS1zKSwvDASqLwcrYLIFDpwuZ63FUAqjDLEP1eicHt8DQ==", + "dev": true, "license": "MIT", "bin": { "direction": "cli.js" @@ -8729,6 +10360,7 @@ "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" @@ -8757,6 +10389,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/dom-css/-/dom-css-2.1.0.tgz", "integrity": "sha512-w9kU7FAbaSh3QKijL6n59ofAhkkmMJ31GclJIz/vyQdjogfyxcB6Zf8CZyibOERI5o0Hxz30VmJS7+7r5fEj2Q==", + "dev": true, "license": "MIT", "dependencies": { "add-px-to-style": "1.0.0", @@ -8843,10 +10476,14 @@ } }, "node_modules/dompurify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", - "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz", + "integrity": "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==", + "dev": true, "license": "(MPL-2.0 OR Apache-2.0)", + "engines": { + "node": ">=20" + }, "optionalDependencies": { "@types/trusted-types": "^2.0.7" } @@ -8878,16 +10515,17 @@ } }, "node_modules/downshift": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.10.tgz", - "integrity": "sha512-TP/iqV6bBok6eGD5tZ8boM8Xt7/+DZvnVNr8cNIhbAm2oUBd79Tudiccs2hbcV9p7xAgS/ozE7Hxy3a9QqS6Mw==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.4.0.tgz", + "integrity": "sha512-yIwyzRYzycKwMZhvOahsn4BmRr4Ffi0JymdWOtTDhR+LGDEXCZHTcwgUbNBC/oZLT6YrR46iwJe/BrQUS5ClQQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.5", - "compute-scroll-into-view": "^3.1.0", + "@babel/runtime": "^7.28.6", + "compute-scroll-into-view": "^3.1.1", "prop-types": "^15.8.1", - "react-is": "18.2.0", - "tslib": "^2.6.2" + "react-is": "^18.2.0", + "tslib": "^2.8.1" }, "peerDependencies": { "react": ">=16.12.0" @@ -8897,6 +10535,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/dunder-proto": { @@ -8915,9 +10554,10 @@ } }, "node_modules/earcut": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", - "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.2.3.tgz", + "integrity": "sha512-vnS4AVwp1KHAF13i1vp1/2D5evWy3k5u/iW/B81QVsUZtV8cv2tU0b2VNFlqvh4kYwrFMDdjPCfAmfyJW9y14Q==", + "dev": true, "license": "ISC" }, "node_modules/eastasianwidth": { @@ -9028,6 +10668,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, "license": "MIT", "dependencies": { "stackframe": "^1.3.4" @@ -9332,6 +10973,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -9536,6 +11178,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -9573,6 +11216,7 @@ "version": "7.2.2", "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", @@ -9589,6 +11233,7 @@ "version": "9.6.1", "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", @@ -9620,6 +11265,7 @@ "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" @@ -9632,6 +11278,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -9644,6 +11291,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/esrever/-/esrever-0.2.0.tgz", "integrity": "sha512-1e9YJt6yQkyekt2BUjTky7LZWWVyC2cIpgdnsTAvMcnzXIZvlW/fTMPkxBcZoYhgih4d+EC+iw+yv9GIkz7vrw==", + "dev": true, "license": "MIT", "bin": { "esrever": "bin/esrever" @@ -9653,6 +11301,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -9672,6 +11321,7 @@ "version": "2.0.3", "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" @@ -9681,6 +11331,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, "license": "MIT" }, "node_modules/events": { @@ -9754,12 +11405,21 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast_array_intersect/-/fast_array_intersect-1.1.0.tgz", "integrity": "sha512-/DCilZlUdz2XyNDF+ASs0PwY+RKG9Y4Silp/gbS72Cvbg4oibc778xcecg+pnNyiNHYgh/TApsiDTjpdniyShw==", + "dev": true, "license": "MIT" }, "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -9803,18 +11463,21 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, "license": "MIT" }, "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" }, "node_modules/fast-shallow-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", - "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==", + "dev": true }, "node_modules/fast-uri": { "version": "3.1.0", @@ -9847,12 +11510,14 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", + "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -9885,6 +11550,7 @@ "version": "6.0.1", "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" @@ -9897,6 +11563,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.7.0" @@ -9909,6 +11576,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/fill-range": { @@ -9952,6 +11620,7 @@ "version": "5.0.0", "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", @@ -9978,6 +11647,7 @@ "version": "3.2.0", "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", @@ -9992,6 +11662,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, "license": "ISC" }, "node_modules/for-each": { @@ -10131,6 +11802,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" }, "node_modules/fsevents": { @@ -10212,6 +11884,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.3.tgz", "integrity": "sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==", + "dev": true, "license": "MIT", "dependencies": { "@petamoriken/float16": "^3.4.7", @@ -10240,7 +11913,8 @@ "node_modules/get-document": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-document/-/get-document-1.0.0.tgz", - "integrity": "sha512-8E7H2Xxibav+/rQTTtm6gFlSQwDoAQg667yheA+vWQr/amxEuswChzGo4MIbOJJoR0SMpDyhbUqWp3FpIfwD9A==" + "integrity": "sha512-8E7H2Xxibav+/rQTTtm6gFlSQwDoAQg667yheA+vWQr/amxEuswChzGo4MIbOJJoR0SMpDyhbUqWp3FpIfwD9A==", + "dev": true }, "node_modules/get-intrinsic": { "version": "1.3.0", @@ -10326,6 +12000,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-user-locale/-/get-user-locale-3.0.0.tgz", "integrity": "sha512-iJfHSmdYV39UUBw7Jq6GJzeJxUr4U+S03qdhVuDsR9gCEnfbqLy9gYDJFBJQL1riqolFUKQvx36mEkp2iGgJ3g==", + "dev": true, "license": "MIT", "dependencies": { "memoize": "^10.0.0" @@ -10338,6 +12013,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/get-window/-/get-window-1.1.2.tgz", "integrity": "sha512-yjWpFcy9fjhLQHW1dPtg9ga4pmizLY8y4ZSHdGrAQ1NU277MRhnGnnLPxe19X8W5lWVsCZz++5xEuNozWMVmTw==", + "dev": true, "license": "MIT", "dependencies": { "get-document": "1" @@ -10368,6 +12044,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -10413,6 +12090,7 @@ "version": "13.24.0", "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" @@ -10493,6 +12171,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, "license": "MIT" }, "node_modules/harmony-reflect": { @@ -10519,6 +12198,7 @@ "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" @@ -10608,12 +12288,14 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.3.tgz", "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==", + "dev": true, "license": "MIT" }, "node_modules/history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2", @@ -10712,6 +12394,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dev": true, "license": "MIT", "dependencies": { "void-elements": "3.1.0" @@ -10830,32 +12513,34 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/i18next": { - "version": "25.6.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.6.3.tgz", - "integrity": "sha512-AEQvoPDljhp67a1+NsnG/Wb1Nh6YoSvtrmeEd24sfGn3uujCtXCF3cXpr7ulhMywKNFF7p3TX1u2j7y+caLOJg==", + "version": "25.10.10", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.10.10.tgz", + "integrity": "sha512-cqUW2Z3EkRx7NqSyywjkgCLK7KLCL6IFVFcONG7nVYIJ3ekZ1/N5jUsihHV6Bq37NfhgtczxJcxduELtjTwkuQ==", + "dev": true, "funding": [ { "type": "individual", - "url": "https://locize.com" + "url": "https://www.locize.com/i18next" }, { "type": "individual", - "url": "https://locize.com/i18next.html" + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" }, { "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + "url": "https://www.locize.com" } ], "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.4" + "@babel/runtime": "^7.29.2" }, "peerDependencies": { - "typescript": "^5" + "typescript": "^5 || ^6" }, "peerDependenciesMeta": { "typescript": { @@ -10864,9 +12549,10 @@ } }, "node_modules/i18next-browser-languagedetector": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", - "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.1.tgz", + "integrity": "sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" @@ -10876,6 +12562,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/i18next-pseudo/-/i18next-pseudo-2.2.1.tgz", "integrity": "sha512-wGybHZl+D7GXZLxLAWN5AhyrmVBxPd5kPpHgcgPw1yOoJcEEvxRk5+ZpbaAc8R59JHeyXLl99rWIXdg/zCvKFQ==", + "dev": true, "license": "MIT", "dependencies": { "i18next": "^19.1.0" @@ -10885,6 +12572,7 @@ "version": "19.9.2", "resolved": "https://registry.npmjs.org/i18next/-/i18next-19.9.2.tgz", "integrity": "sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.0" @@ -10894,6 +12582,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -10932,6 +12621,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -10948,9 +12638,10 @@ } }, "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, "license": "MIT" }, "node_modules/import-fresh": { @@ -10993,6 +12684,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -11013,6 +12705,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -11023,12 +12716,14 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, "license": "ISC" }, "node_modules/inline-style-prefixer": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "dev": true, "license": "MIT", "dependencies": { "css-in-js-utils": "^3.1.0" @@ -11053,6 +12748,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -11072,6 +12768,7 @@ "version": "10.7.18", "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.18.tgz", "integrity": "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", @@ -11084,12 +12781,14 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" @@ -11301,6 +13000,7 @@ "version": "2.1.1", "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" @@ -11366,6 +13066,7 @@ "version": "4.0.3", "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" @@ -11378,12 +13079,14 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", + "dev": true, "license": "MIT" }, "node_modules/is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", + "dev": true, "license": "MIT" }, "node_modules/is-map": { @@ -11399,6 +13102,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-mobile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-5.0.0.tgz", + "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -11443,6 +13153,7 @@ "version": "3.0.3", "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" @@ -11452,6 +13163,7 @@ "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==", + "dev": true, "license": "MIT", "dependencies": { "isobject": "^3.0.1" @@ -11629,6 +13341,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz", "integrity": "sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==", + "dev": true, "license": "MIT" }, "node_modules/is-wsl": { @@ -11648,18 +13361,21 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, "license": "MIT" }, "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" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11669,6 +13385,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/isomorphic-base64/-/isomorphic-base64-1.0.2.tgz", "integrity": "sha512-pQFyLwShVPA1Qr0dE1ZPguJkbOsFGDfSq6Wzz6XaO33v74X6/iQjgYPozwkeKGQxOI1/H3Fz7+ROtnV1veyKEg==", + "dev": true, "license": "MIT" }, "node_modules/istanbul-lib-coverage": { @@ -13457,12 +15174,14 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "dev": true, "license": "MIT" }, "node_modules/js-cookie": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "dev": true, "license": "MIT" }, "node_modules/js-tokens": { @@ -13472,9 +15191,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -13555,6 +15285,7 @@ "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" }, "node_modules/json-parse-even-better-errors": { @@ -13567,12 +15298,14 @@ "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==", + "dev": true, "license": "MIT" }, "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" }, "node_modules/json5": { @@ -13628,6 +15361,7 @@ "version": "4.5.4", "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" @@ -13667,6 +15401,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz", "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==", + "dev": true, "license": "Apache-2.0" }, "node_modules/leven": { @@ -13683,6 +15418,7 @@ "version": "0.4.1", "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", @@ -13723,6 +15459,7 @@ "version": "6.0.0", "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" @@ -13735,9 +15472,10 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, "license": "MIT" }, "node_modules/lodash.debounce": { @@ -13750,14 +15488,9 @@ "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" }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -13866,6 +15599,7 @@ "version": "16.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", + "dev": true, "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -13875,12 +15609,13 @@ } }, "node_modules/marked-mangle": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/marked-mangle/-/marked-mangle-1.1.11.tgz", - "integrity": "sha512-BUZiRqPooKZZhC7e8aDlzqkZt4MKkbJ/VY22b8iqrI3fJdnWmSyc7/uujDkrMszZrKURrXsYVUfgdWG6gEspcA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/marked-mangle/-/marked-mangle-1.1.12.tgz", + "integrity": "sha512-bRrqNcfU9v3iRECb7YPvA+/xKZMjHojd9R92YwHbFjdPQ+Wc7vozkbGKAv4U8AUl798mNUuY3DTBQkedsV3TeQ==", + "dev": true, "license": "MIT", "peerDependencies": { - "marked": ">=4 <17" + "marked": ">=4 <18" } }, "node_modules/math-intrinsics": { @@ -13897,6 +15632,7 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, "license": "CC0-1.0" }, "node_modules/memfs": { @@ -13916,6 +15652,7 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.2.0.tgz", "integrity": "sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==", + "dev": true, "license": "MIT", "dependencies": { "mimic-function": "^5.0.1" @@ -13964,6 +15701,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/micro-memoize/-/micro-memoize-4.2.0.tgz", "integrity": "sha512-dRxIsNh0XosO9sd3aASUabKOzG9dloLO41g74XUGThpHBoGm1ttakPT5in14CuW/EDedkniaShFHbymmmKGOQA==", + "dev": true, "license": "MIT" }, "node_modules/micromatch": { @@ -14017,6 +15755,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -14036,9 +15775,10 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -14071,6 +15811,7 @@ "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, "license": "MIT", "engines": { "node": "*" @@ -14080,6 +15821,7 @@ "version": "0.5.47", "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.47.tgz", "integrity": "sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA==", + "dev": true, "license": "MIT", "dependencies": { "moment": "^2.29.4" @@ -14092,6 +15834,7 @@ "version": "0.34.1", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.1.tgz", "integrity": "sha512-FKc80TyiMaruhJKKPz5SpJPIjL+dflGvz4CpuThaPMc94AyN7SeC9HQ8hrvaxX7EyHdJcUY5i4D0gNyJj1vSZQ==", + "dev": true, "license": "MIT" }, "node_modules/ms": { @@ -14104,6 +15847,7 @@ "version": "5.6.2", "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", "integrity": "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==", + "dev": true, "license": "Unlicense", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", @@ -14124,6 +15868,7 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -14149,6 +15894,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, "license": "MIT" }, "node_modules/natural-compare-lite": { @@ -14401,9 +16147,10 @@ } }, "node_modules/ol": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/ol/-/ol-10.6.1.tgz", - "integrity": "sha512-xp174YOwPeLj7c7/8TCIEHQ4d41tgTDDhdv6SqNdySsql5/MaFJEJkjlsYcvOPt7xA6vrum/QG4UdJ0iCGT1cg==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ol/-/ol-10.7.0.tgz", + "integrity": "sha512-122U5gamPqNgLpLOkogFJhgpywvd/5en2kETIDW+Ubfi9lPnZ0G9HWRdG+CX0oP8od2d6u6ky3eewIYYlrVczw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "@types/rbush": "4.0.0", @@ -14421,6 +16168,7 @@ "version": "1.4.0", "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" @@ -14464,6 +16212,7 @@ "version": "0.9.4", "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", @@ -14499,6 +16248,7 @@ "version": "3.1.0", "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" @@ -14514,6 +16264,7 @@ "version": "5.0.0", "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" @@ -14543,15 +16294,27 @@ "license": "BlueOak-1.0.0" }, "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz", + "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "(MIT AND Zlib)" }, "node_modules/papaparse": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", + "dev": true, "license": "MIT" }, "node_modules/param-case": { @@ -14581,6 +16344,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz", "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==", + "dev": true, "license": "MIT" }, "node_modules/parse-json": { @@ -14636,6 +16400,7 @@ "version": "4.0.0", "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" @@ -14645,6 +16410,7 @@ "version": "1.0.1", "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" @@ -14654,6 +16420,7 @@ "version": "3.1.1", "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" @@ -14693,6 +16460,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "dev": true, "license": "MIT", "dependencies": { "isarray": "0.0.1" @@ -14721,6 +16489,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz", "integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "resolve-protobuf-schema": "^2.1.0" @@ -14733,6 +16502,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, "license": "MIT" }, "node_modules/picocolors": { @@ -15034,12 +16804,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/prefix-style/-/prefix-style-2.0.1.tgz", "integrity": "sha512-gdr1MBNVT0drzTq95CbSNdsrBDoHGlb2aDJP/FoY+1e+jSDPOb1Cv554gH2MGiSr2WTcXi/zu+NaFzfcHQkfBQ==", + "dev": true, "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -15108,6 +16880,7 @@ "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -15154,34 +16927,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz", + "integrity": "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==", + "dev": true, "license": "MIT" }, "node_modules/psl": { @@ -15201,6 +16951,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -15250,6 +17001,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -15270,6 +17022,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -15282,12 +17035,14 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "dev": true, "license": "ISC" }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, "license": "MIT", "dependencies": { "performance-now": "^2.1.0" @@ -15297,6 +17052,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "dev": true, "license": "MIT" }, "node_modules/randombytes": { @@ -15338,64 +17094,17 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/rbush/-/rbush-4.0.1.tgz", "integrity": "sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==", + "dev": true, "license": "MIT", "dependencies": { "quickselect": "^3.0.0" } }, - "node_modules/rc-cascader": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.34.0.tgz", - "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "classnames": "^2.3.1", - "rc-select": "~14.16.2", - "rc-tree": "~5.13.0", - "rc-util": "^5.43.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-drawer": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.3.0.tgz", - "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@rc-component/portal": "^1.1.1", - "classnames": "^2.2.6", - "rc-motion": "^2.6.1", - "rc-util": "^5.38.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-motion": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", - "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.44.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/rc-overflow": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.5.0.tgz", "integrity": "sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -15408,141 +17117,28 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-picker": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.3.tgz", - "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.7", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.2.1", - "rc-overflow": "^1.3.2", - "rc-resize-observer": "^1.4.0", - "rc-util": "^5.43.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "date-fns": ">= 2.x", - "dayjs": ">= 1.x", - "luxon": ">= 3.x", - "moment": ">= 2.x", - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - }, - "peerDependenciesMeta": { - "date-fns": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { - "optional": true - } - } - }, "node_modules/rc-resize-observer": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", - "classnames": "^2.2.1", - "rc-util": "^5.44.1", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-select": { - "version": "14.16.8", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.8.tgz", - "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^2.1.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-overflow": "^1.3.1", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.5.2" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-slider": { - "version": "11.1.9", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.9.tgz", - "integrity": "sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.36.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tooltip": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz", - "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.2", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.3.1", - "rc-util": "^5.44.3" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tree": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.1.tgz", - "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.5.1" - }, - "engines": { - "node": ">=10.x" + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" }, "peerDependencies": { - "react": "*", - "react-dom": "*" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, "node_modules/rc-util": { "version": "5.44.4", "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -15553,25 +17149,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-virtual-list": { - "version": "3.19.2", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.2.tgz", - "integrity": "sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.0", - "classnames": "^2.2.6", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.36.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -15584,10 +17161,52 @@ "node": ">=0.10.0" } }, + "node_modules/react-aria": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.50.0.tgz", + "integrity": "sha512-S0Os6QZk33fzUAKu1QLT9afoUaCBt1ZNdoiq0n2YMVgKIdNIQS8zxiZ8O9hYE6QyDkHKjD6q39LQZ+qaSAIgjw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.2", + "@internationalized/number": "^3.6.7", + "@internationalized/string": "^3.2.9", + "@react-types/shared": "^3.36.0", + "@swc/helpers": "^0.5.0", + "aria-hidden": "^1.2.3", + "clsx": "^2.0.0", + "react-stately": "3.48.0", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/react-aria-components": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.19.0.tgz", + "integrity": "sha512-2smSS5nqJ8cGYMQezuUXveZm7eMyHCqTN6mDpylQBYLYbdF5dxCCuW1DHn1VKLe1DybSfPvX/cZtJlDmvFfn8A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.2", + "@react-types/shared": "^3.36.0", + "@swc/helpers": "^0.5.0", + "client-only": "^0.0.1", + "react-aria": "3.50.0", + "react-stately": "3.48.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, "node_modules/react-calendar": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/react-calendar/-/react-calendar-6.0.0.tgz", - "integrity": "sha512-6wqaki3Us0DNDjZDr0DYIzhSFprNoy4FdPT9Pjy5aD2hJJVjtJwmdMT9VmrTUo949nlk35BOxehThxX62RkuRQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/react-calendar/-/react-calendar-6.0.1.tgz", + "integrity": "sha512-b8E61W7qk/He9XEbtbQBjnALPuGmxeglsotgZyAShqN1vHMzXWjl4g7WI5tRF93RE4Wbo0c0BKN3vTQhrBojpg==", + "dev": true, "license": "MIT", "dependencies": { "@wojtekmaj/date-utils": "^2.0.2", @@ -15613,6 +17232,7 @@ "version": "5.6.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "dev": true, "license": "MIT", "peerDependencies": { "react": ">=16.8.0", @@ -15623,6 +17243,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/react-custom-scrollbars-2/-/react-custom-scrollbars-2-4.5.0.tgz", "integrity": "sha512-/z0nWAeXfMDr4+OXReTpYd1Atq9kkn4oI3qxq3iMXGQx1EEfwETSqB8HTAvg1X7dEqcCachbny1DRNGlqX5bDQ==", + "dev": true, "license": "MIT", "dependencies": { "dom-css": "^2.0.0", @@ -15634,19 +17255,6 @@ "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-data-grid": { - "version": "7.0.0-beta.56", - "resolved": "git+ssh://git@github.com/grafana/react-data-grid.git#a922856b5ede21d55db3fdffb6d38dc76bdc7c58", - "integrity": "sha512-kE4U/hBd5rNeKT2poz+uMfVlaSqjVLVXs0ZAP674DImFnri/6ARhEtr+6szEboNepQgWXEJYIWtdZ7GbaBpexw==", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0", - "react-dom": "^18.0 || ^19.0" - } - }, "node_modules/react-docgen": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.1.tgz", @@ -15692,10 +17300,26 @@ "react": "^18.3.1" } }, + "node_modules/react-draggable": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.7.0.tgz", + "integrity": "sha512-kTpANmKWVnFXiZ76Ag2ZowiFStuBYnJ606PI1TbUsOg29/400/JNIxI9+CuenhiAqFuXWJffz6F4UI3R51kUug==", + "dev": true, + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, "node_modules/react-dropzone": { "version": "14.3.8", "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.8.tgz", "integrity": "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==", + "dev": true, "license": "MIT", "dependencies": { "attr-accept": "^2.2.4", @@ -15713,15 +17337,36 @@ "version": "0.7.5", "resolved": "https://registry.npmjs.org/react-from-dom/-/react-from-dom-0.7.5.tgz", "integrity": "sha512-CO92PmMKo/23uYPm6OFvh5CtZbMgHs/Xn+o095Lz/TZj9t8DSDhGdSOMLxBxwWI4sr0MF17KUn9yJWc5Q00R/w==", + "dev": true, "license": "MIT", "peerDependencies": { "react": "16.8 - 19" } }, + "node_modules/react-grid-layout": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.5.3.tgz", + "integrity": "sha512-KaG6IbjD6fYhagUtIvOzhftXG+ViKZjCjADe86X1KHl7C/dsBN2z0mi14nbvZKTkp0RKiil9RPcJBgq3LnoA8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "fast-equals": "^4.0.3", + "prop-types": "^15.8.1", + "react-draggable": "^4.4.6", + "react-resizable": "^3.0.5", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, "node_modules/react-highlight-words": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/react-highlight-words/-/react-highlight-words-0.21.0.tgz", "integrity": "sha512-SdWEeU9fIINArEPO1rO5OxPyuhdEKZQhHzZZP1ie6UeXQf+CjycT1kWaB+9bwGcVbR0NowuHK3RqgqNg6bgBDQ==", + "dev": true, "license": "MIT", "dependencies": { "highlight-words-core": "^1.2.0", @@ -15735,12 +17380,14 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.3.tgz", "integrity": "sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==", + "dev": true, "license": "MIT" }, "node_modules/react-hook-form": { - "version": "7.66.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.66.1.tgz", - "integrity": "sha512-2KnjpgG2Rhbi+CIiIBQQ9Df6sMGH5ExNyFl4Hw9qO7pIqMBR8Bvu9RQyjl3JM4vehzCh9soiNUM/xYMswb2EiA==", + "version": "7.81.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.81.0.tgz", + "integrity": "sha512-ocbmr2p5KBMoAfj4WCUvped33lVi1Kd5DuDUvQDnB6VEAacOjPI/jMbtDdbhco4y9ct4xUuCmMY0b/C9L0QHjw==", + "dev": true, "license": "MIT", "engines": { "node": ">=18.0.0" @@ -15757,6 +17404,7 @@ "version": "15.7.4", "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.7.4.tgz", "integrity": "sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", @@ -15783,6 +17431,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz", "integrity": "sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==", + "dev": true, "license": "MIT", "dependencies": { "invariant": "^2.2.2" @@ -15795,6 +17444,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.2.0.tgz", "integrity": "sha512-V59P6sFU7NACIbvoay9ikYKVFWyIIZFGd7w6YT1m+H7Ues0fOI6B6IftE6NPSYXXv7RHVmrncIyJeYurs3OJcA==", + "dev": true, "license": "MIT", "dependencies": { "react-from-dom": "^0.7.5" @@ -15807,12 +17457,14 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true, "license": "MIT" }, "node_modules/react-loading-skeleton": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz", "integrity": "sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==", + "dev": true, "license": "MIT", "peerDependencies": { "react": ">=16.8.0" @@ -15822,6 +17474,7 @@ "version": "9.2.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "devOptional": true, "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.6", @@ -15841,93 +17494,55 @@ } } }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "node_modules/react-resizable": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.2.0.tgz", + "integrity": "sha512-3NKQ0SLZV7rs3LQHeXlOzDSRQfFrkX6TVet77/Qk03zqiZyee37b7N8/gwDJAA8UUjRz7PdWCCy49hcso45SMQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "prop-types": "15.x", + "react-draggable": "^4.5.0" }, "peerDependencies": { - "react": ">=15" + "react": ">= 16.3", + "react-dom": ">= 16.3" } }, - "node_modules/react-router-dom-v5-compat": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router-dom-v5-compat/-/react-router-dom-v5-compat-6.30.0.tgz", - "integrity": "sha512-MAVRASbdQ3+ZOTPPjAa7jKcF0F9LkHWKB/iib3hf+jzzIazL4GEpMDDdTswCsqRQNU+zNnT3qD0WiNbzJ6ncPw==", + "node_modules/react-router": { + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", + "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", + "dev": true, "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.0", - "history": "^5.3.0", - "react-router": "6.30.0" + "@remix-run/router": "1.23.3" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8", - "react-router-dom": "4 || 5" - } - }, - "node_modules/react-router-dom-v5-compat/node_modules/history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.6" + "react": ">=16.8" } }, - "node_modules/react-router-dom-v5-compat/node_modules/react-router": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", - "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", + "node_modules/react-router-dom": { + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", + "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", + "dev": true, "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.0" + "@remix-run/router": "1.23.3", + "react-router": "6.30.4" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "react": ">=16.8" + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/react-router/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" - }, "node_modules/react-select": { "version": "5.10.2", "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz", @@ -15958,10 +17573,29 @@ "@testing-library/dom": ">=7" } }, + "node_modules/react-stately": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.48.0.tgz", + "integrity": "sha512-ImicSAG+lTotAe5izcs1fz49Zk48w7pDusqYg04WaPhCoej8BJ24soMu3iLXIrsi273s4P1gZrYGrqReMfgEEA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.2", + "@internationalized/number": "^3.6.7", + "@internationalized/string": "^3.2.9", + "@react-types/shared": "^3.36.0", + "@swc/helpers": "^0.5.0", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, "node_modules/react-table": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", "integrity": "sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==", + "dev": true, "license": "MIT", "funding": { "type": "github", @@ -15991,6 +17625,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "dev": true, "peerDependencies": { "react": "*", "tslib": "*" @@ -16000,6 +17635,7 @@ "version": "17.6.0", "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.6.0.tgz", "integrity": "sha512-OmedEScUMKFfzn1Ir8dBxiLLSOzhKe/dPZwVxcujweSj45aNM7BEGPb9BEVIgVEqEXx6f3/TsXzwIktNgUR02g==", + "dev": true, "license": "Unlicense", "dependencies": { "@types/js-cookie": "^2.2.6", @@ -16022,10 +17658,22 @@ "react-dom": "*" } }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz", + "integrity": "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-window": { "version": "1.8.11", "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.0.0", @@ -16043,6 +17691,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "dev": true, "license": "MIT" }, "node_modules/readdirp": { @@ -16252,6 +17901,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "dev": true, "license": "MIT" }, "node_modules/resolve": { @@ -16310,12 +17960,14 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "dev": true, "license": "MIT" }, "node_modules/resolve-protobuf-schema": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "dev": true, "license": "MIT", "dependencies": { "protocol-buffers-schema": "^3.3.1" @@ -16335,6 +17987,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -16346,6 +17999,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "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" @@ -16362,6 +18016,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "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", @@ -16379,15 +18034,17 @@ } }, "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "dev": true, "license": "Unlicense" }, "node_modules/rtl-css-js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2" @@ -16397,6 +18054,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -16420,6 +18078,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/rxjs": { @@ -16531,6 +18190,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, "license": "MIT" }, "node_modules/sass": { @@ -16680,6 +18340,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -16692,6 +18353,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/selection-is-backward/-/selection-is-backward-1.0.0.tgz", "integrity": "sha512-C+6PCOO55NLCfS8uQjUKV/6E5XMuUcfOVsix5m0QqCCCKi495NgeQVNfWtAaD71NKHsdmFCJoXUGfir3qWdr9A==", + "dev": true, "license": "MIT" }, "node_modules/semver": { @@ -16752,6 +18414,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "dev": true, "license": "Unlicense", "engines": { "node": ">=6.9" @@ -16789,6 +18452,7 @@ "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" @@ -16801,6 +18465,7 @@ "version": "3.0.0", "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" @@ -16916,6 +18581,7 @@ "version": "0.47.9", "resolved": "https://registry.npmjs.org/slate/-/slate-0.47.9.tgz", "integrity": "sha512-EK4O6b7lGt+g5H9PGw9O5KCM4RrOvOgE9mPi3rzQ0zDRlgAb2ga4TdpS6XNQbrsJWsc8I1fjaSsUeCqCUhhi9A==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^3.1.0", @@ -16935,6 +18601,7 @@ "version": "0.2.115", "resolved": "https://registry.npmjs.org/slate-base64-serializer/-/slate-base64-serializer-0.2.115.tgz", "integrity": "sha512-GnLV7bUW/UQ5j7rVIxCU5zdB6NOVsEU6YWsCp68dndIjSGTGLaQv2+WwV3NcnrGGZEYe5qgo33j2QWrPws2C1A==", + "dev": true, "license": "MIT", "dependencies": { "isomorphic-base64": "^1.0.2" @@ -16947,6 +18614,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/slate-dev-environment/-/slate-dev-environment-0.2.5.tgz", "integrity": "sha512-oLD8Fclv/RqrDv6RYfN2CRzNcRXsUB99Qgcw5L/njTjxAdDPguV6edQ3DgUG9Q2pLFLhI15DwsKClzVfFzfwGQ==", + "dev": true, "license": "MIT", "dependencies": { "is-in-browser": "^1.1.3" @@ -16956,6 +18624,7 @@ "version": "0.2.11", "resolved": "https://registry.npmjs.org/slate-hotkeys/-/slate-hotkeys-0.2.11.tgz", "integrity": "sha512-xhq/TlI74dRbO57O4ulGsvCcV4eaQ5nEEz9noZjeNLtNzFRd6lSgExRqAJqKGGIeJw+FnJ3OcqGvdb5CEc9/Ew==", + "dev": true, "license": "MIT", "dependencies": { "is-hotkey": "0.1.4", @@ -16966,12 +18635,14 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.1.4.tgz", "integrity": "sha512-Py+aW4r5mBBY18TGzGz286/gKS+fCQ0Hee3qkaiSmEPiD0PqFpe0wuA3l7rTOUKyeXl8Mxf3XzJxIoTlSv+kxA==", + "dev": true, "license": "MIT" }, "node_modules/slate-plain-serializer": { "version": "0.7.13", "resolved": "https://registry.npmjs.org/slate-plain-serializer/-/slate-plain-serializer-0.7.13.tgz", "integrity": "sha512-TtrlaslxQBEMV0LYdf3s7VAbTxRPe1xaW10WNNGAzGA855/0RhkaHjKkQiRjHv5rvbRleVf7Nxr9fH+4uErfxQ==", + "dev": true, "license": "MIT", "peerDependencies": { "immutable": ">=3.8.1", @@ -16982,6 +18653,7 @@ "version": "0.5.44", "resolved": "https://registry.npmjs.org/slate-prop-types/-/slate-prop-types-0.5.44.tgz", "integrity": "sha512-JS0iW7uaciE/W3ADuzeN1HOnSjncQhHPXJ65nZNQzB0DF7mXVmbwQKI6cmCo/xKni7XRJT0JbWSpXFhEdPiBUA==", + "dev": true, "license": "MIT", "peerDependencies": { "immutable": ">=3.8.1", @@ -16992,6 +18664,7 @@ "version": "0.22.10", "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.22.10.tgz", "integrity": "sha512-B2Ms1u/REbdd8yKkOItKgrw/tX8klgz5l5x6PP86+oh/yqmB6EHe0QyrYlQ9fc3WBlJUVTOL+nyAP1KmlKj2/w==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^3.1.0", @@ -17022,6 +18695,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -17031,12 +18705,14 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.3.tgz", "integrity": "sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==", + "dev": true, "license": "MIT" }, "node_modules/slate-react/node_modules/slate-react-placeholder": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/slate-react-placeholder/-/slate-react-placeholder-0.2.9.tgz", "integrity": "sha512-YSJ9Gb4tGpbzPje3eNKtu26hWM8ApxTk9RzjK+6zfD5V/RMTkuWONk24y6c9lZk0OAYNZNUmrnb/QZfU3j9nag==", + "dev": true, "license": "MIT", "peerDependencies": { "react": ">=16.0.0", @@ -17048,12 +18724,14 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-0.0.3.tgz", "integrity": "sha512-r0SSA5Y5IWERF9Xh++tFPx0jITBgGggOsRLDWWew6YRw/C2dr4uNO1fw1vanrBmHsICmPyMLNBZboTlxUmUuaA==", + "dev": true, "license": "MIT" }, "node_modules/slate/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -17063,6 +18741,7 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-0.0.3.tgz", "integrity": "sha512-r0SSA5Y5IWERF9Xh++tFPx0jITBgGggOsRLDWWew6YRw/C2dr4uNO1fw1vanrBmHsICmPyMLNBZboTlxUmUuaA==", + "dev": true, "license": "MIT" }, "node_modules/source-map": { @@ -17141,6 +18820,7 @@ "version": "2.0.10", "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dev": true, "license": "MIT", "dependencies": { "stackframe": "^1.3.4" @@ -17173,12 +18853,14 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, "license": "MIT" }, "node_modules/stacktrace-gps": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dev": true, "license": "MIT", "dependencies": { "source-map": "0.5.6", @@ -17189,6 +18871,7 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -17198,6 +18881,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dev": true, "license": "MIT", "dependencies": { "error-stack-parser": "^2.0.6", @@ -17209,6 +18893,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "dev": true, "license": "MIT" }, "node_modules/stop-iteration-iterator": { @@ -17263,6 +18948,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true, "license": "CC0-1.0" }, "node_modules/string-length": { @@ -17446,6 +19132,7 @@ "version": "6.0.1", "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" @@ -17505,6 +19192,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -17546,6 +19234,7 @@ "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, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -17588,9 +19277,10 @@ "license": "MIT" }, "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "dev": true, "license": "MIT" }, "node_modules/tapable": { @@ -17761,12 +19451,14 @@ "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" }, "node_modules/throttle-debounce": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -17776,6 +19468,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, "license": "MIT" }, "node_modules/tiny-lr": { @@ -17807,22 +19500,25 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "dev": true, "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "dev": true, "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -17835,6 +19531,7 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -17849,9 +19546,10 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -17891,6 +19589,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-camel-case/-/to-camel-case-1.0.0.tgz", "integrity": "sha512-nD8pQi5H34kyu1QDMFjzEIYqk0xa9Alt6ZfrdEMuHCFOfTLhDG5pgTu/aAM9Wt9lXILwlXmWP43b8sav0GNE8Q==", + "dev": true, "license": "MIT", "dependencies": { "to-space-case": "^1.0.0" @@ -17900,6 +19599,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", "integrity": "sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==", + "dev": true, "license": "MIT" }, "node_modules/to-regex-range": { @@ -17919,6 +19619,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", "integrity": "sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==", + "dev": true, "license": "MIT", "dependencies": { "to-no-case": "^1.0.0" @@ -17928,6 +19629,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "dev": true, "license": "MIT" }, "node_modules/tough-cookie": { @@ -17970,9 +19672,10 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, "license": "MIT", "engines": { "node": ">=18.12" @@ -17995,6 +19698,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", + "dev": true, "license": "Unlicense" }, "node_modules/ts-node": { @@ -18099,6 +19803,7 @@ "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" @@ -18121,6 +19826,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -18133,6 +19839,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-of/-/type-of-2.0.1.tgz", "integrity": "sha512-39wxbwHdQ2sTiBB8wAzKfQ9GN+om8w+sjNWzr+vZJR5AMD5J+J7Yc8AtXnU9r/r2c8XiDZ/smxutDmZehX/qpQ==", + "dev": true, "license": "MIT" }, "node_modules/typed-array-buffer": { @@ -18217,6 +19924,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -18230,6 +19938,7 @@ "version": "1.0.41", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", + "dev": true, "funding": [ { "type": "opencollective", @@ -18275,6 +19984,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, "node_modules/universalify": { @@ -18336,12 +20046,14 @@ "version": "1.6.32", "resolved": "https://registry.npmjs.org/uplot/-/uplot-1.6.32.tgz", "integrity": "sha512-KIMVnG68zvu5XXUbC4LQEPnhwOxBuLyW1AHtpm6IKTXImkbLgkMy+jabjLgSLMasNuGGzQm/ep3tOkyTxpiQIw==", + "dev": true, "license": "MIT" }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -18397,6 +20109,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "devOptional": true, "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -18463,6 +20176,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/uwrap/-/uwrap-0.1.2.tgz", "integrity": "sha512-f3EJhcx+pB6sWtBZOKAcJ+RweICm/FmFiqCfMy3OLpsXNcf2P5tEYn8nu3BIBYTI/srzN+VrfRN1tCkJL6QuLg==", + "dev": true, "license": "MIT" }, "node_modules/v8-compile-cache-lib": { @@ -18491,12 +20205,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "dev": true, "license": "MIT" }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -18535,6 +20251,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" @@ -18555,15 +20272,17 @@ } }, "node_modules/web-vitals": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", - "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.3.0.tgz", + "integrity": "sha512-q6LWsLatGYZp5VGBIOvbTj6JBV2nOmC8KvWztXBmwJcfFAzhwKwbOxhUH306XY3CcaZDUlSmSuNPBsCn0bFu+g==", + "dev": true, "license": "Apache-2.0" }, "node_modules/web-worker": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", + "dev": true, "license": "Apache-2.0" }, "node_modules/webidl-conversions": { @@ -18839,6 +20558,7 @@ "version": "2.0.2", "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" @@ -18957,6 +20677,7 @@ "version": "1.2.5", "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" @@ -19067,6 +20788,7 @@ "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" }, "node_modules/write-file-atomic": { @@ -19126,6 +20848,7 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.10.2.tgz", "integrity": "sha512-RqM+2o1RYs6T8+3DzDSoTRAUfrvaejbVHcp3+thnAtDKo8LskR+HomLajEy5UjTz24rpka7AxVBRR3g2wTUkJA==", + "dev": true, "license": "CC0-1.0" }, "node_modules/xmlchars": { @@ -19139,6 +20862,7 @@ "version": "1.0.15", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz", "integrity": "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==", + "dev": true, "license": "MIT", "dependencies": { "commander": "^2.20.3", @@ -19155,6 +20879,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, "license": "MIT" }, "node_modules/y18n": { @@ -19255,6 +20980,7 @@ "version": "0.1.0", "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" @@ -19263,10 +20989,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zstddec": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz", "integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==", + "dev": true, "license": "MIT AND BSD-3-Clause" } } diff --git a/package.json b/package.json index a66c5fa..62a1960 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "0.6.4", "description": "Quickwit datasource", "scripts": { - "build": "webpack -c ./.config/webpack/webpack.config.ts --env production", - "dev": "webpack -w -c ./.config/webpack/webpack.config.ts --env development", + "build": "webpack -c ./webpack.config.ts --env production && ./scripts/nest-backend.sh", + "dev": "webpack -w -c ./webpack.config.ts --env development", "test": "jest --watch --onlyChanged", "test:ci": "jest --passWithNoTests --maxWorkers 4", "typecheck": "tsc --noEmit", @@ -21,10 +21,15 @@ "license": "AGPL-3.0", "devDependencies": { "@babel/core": "^7.21.4", - "@grafana/e2e-selectors": "10.1.9", + "@grafana/data": "^13.0.2", + "@grafana/e2e-selectors": "^13.0.2", "@grafana/eslint-config": "^6.0.0", "@grafana/plugin-e2e": "^3.4.2", + "@grafana/runtime": "^13.0.2", + "@grafana/scenes": "^7.4.2", + "@grafana/schema": "^13.0.2", "@grafana/tsconfig": "^1.2.0-rc1", + "@grafana/ui": "^13.0.2", "@playwright/test": "^1.58.2", "@storybook/addon-essentials": "^8.6.14", "@storybook/addon-interactions": "^8.6.14", @@ -56,6 +61,7 @@ "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "prettier": "^2.8.7", + "react-router-dom": "^6.30.4", "replace-in-file-webpack-plugin": "^1.0.6", "sass": "1.63.2", "sass-loader": "13.3.1", @@ -76,9 +82,6 @@ "@codemirror/commands": "^6.8.1", "@codemirror/view": "^6.38.1", "@emotion/css": "^11.11", - "@grafana/data": "^12.1.0", - "@grafana/runtime": "^12.1.0", - "@grafana/ui": "^12.1.0", "@reduxjs/toolkit": "^2.0.0", "@uiw/react-codemirror": "^4.21.21", "lucene": "^2.1.1", diff --git a/pkg/quickwit/data_query.go b/pkg/quickwit/data_query.go index f551380..12c7a9b 100644 --- a/pkg/quickwit/data_query.go +++ b/pkg/quickwit/data_query.go @@ -537,7 +537,13 @@ func processTracesQuery(q *Query, b *es.SearchRequestBuilder, defaultTimeField s func processTraceSearchQuery(q *Query, b *es.SearchRequestBuilder, defaultTimeField string) { metric := q.Metrics[0] - b.Sort(es.SortOrderDesc, defaultTimeField, "epoch_nanos_int") + if metric.Settings.Get("sort").MustString() == "duration" { + // Scan the slowest spans of the whole window (sort_by=-span_duration_millis) + // so "slowest" is not limited to the most recent spans. + b.Sort(es.SortOrderDesc, "span_duration_millis", "") + } else { + b.Sort(es.SortOrderDesc, defaultTimeField, "epoch_nanos_int") + } b.Size(stringToIntWithDefaultValue(metric.Settings.Get("spanLimit").MustString(), 5000)) } diff --git a/pkg/quickwit/response_parser_traces.go b/pkg/quickwit/response_parser_traces.go index abb2085..4d361d5 100644 --- a/pkg/quickwit/response_parser_traces.go +++ b/pkg/quickwit/response_parser_traces.go @@ -3,6 +3,7 @@ package quickwit import ( "encoding/json" "fmt" + neturl "net/url" "sort" "strconv" "strings" @@ -19,7 +20,8 @@ import ( const ( tracesType = "traces" traceSearchType = "trace_search" - quickwitPluginID = "quickwit-quickwit-datasource" + quickwitPluginID = "quickwit-quickwit-datasource" + quickwitAppPluginID = "quickwit-quickwit-app" maxTraceStackTraceBytes = 64 * 1024 traceStackTraceTruncatedText = "\n... truncated" @@ -273,8 +275,32 @@ func processTraceSearchResponse(res *es.SearchResponse, target *Query, dsInfo *e } summaries = append(summaries, summary) } + + // Optional server-side ordering, applied before the limit truncation so + // e.g. "slowest" returns the slowest traces of the scanned window rather + // than a client-side re-sort of the most recent page. + sortKey := "" + if len(target.Metrics) > 0 { + sortKey = target.Metrics[0].Settings.Get("sort").MustString() + } sort.SliceStable(summaries, func(i, j int) bool { - return summaries[i].startTimeMillis > summaries[j].startTimeMillis + a, b := summaries[i], summaries[j] + switch sortKey { + case "duration": + da, db := a.endTimeMillis-a.startTimeMillis, b.endTimeMillis-b.startTimeMillis + if da != db { + return da > db + } + case "errors": + if a.errorCount != b.errorCount { + return a.errorCount > b.errorCount + } + case "spans": + if a.spanCount != b.spanCount { + return a.spanCount > b.spanCount + } + } + return a.startTimeMillis > b.startTimeMillis }) limit := defaultSize @@ -975,7 +1001,19 @@ func traceSearchDataLinks(dsInfo *es.DatasourceInfo) []data.DataLink { return nil } - return traceInternalDataLinks("Open trace", datasourceUID, datasourceName, "trace_id:${__value.raw}", tracesType, "1000") + links := traceInternalDataLinks("Open trace", datasourceUID, datasourceName, "trace_id:${__value.raw}", tracesType, "1000") + return append(links, tracePeekDataLinks(datasourceUID)...) +} + +// tracePeekDataLinks links into the bundled trace explorer app, which opens +// the trace in a side drawer (waterfall or logs tab) without leaving the page. +func tracePeekDataLinks(datasourceUID string) []data.DataLink { + base := "/a/" + quickwitAppPluginID + "/explorer?ds=" + neturl.QueryEscape(datasourceUID) + + "&${__url_time_range}&peek=${__value.raw}" + return []data.DataLink{ + {Title: "Peek trace", URL: base}, + {Title: "Peek logs", URL: base + "&peekTab=logs"}, + } } func traceToLogsDataLinks(dsInfo *es.DatasourceInfo) []data.DataLink { diff --git a/pkg/quickwit/response_parser_traces_test.go b/pkg/quickwit/response_parser_traces_test.go index e256e65..1c4bd5e 100644 --- a/pkg/quickwit/response_parser_traces_test.go +++ b/pkg/quickwit/response_parser_traces_test.go @@ -487,7 +487,15 @@ func TestTraceDataLinks(t *testing.T) { traceIDField, _ := result.Responses["A"].Frames[0].FieldByName("traceID") require.NotNil(t, traceIDField) require.NotNil(t, traceIDField.Config) - require.Len(t, traceIDField.Config.Links, 1) + require.Len(t, traceIDField.Config.Links, 3) + + peekTrace := traceIDField.Config.Links[1] + require.Equal(t, "Peek trace", peekTrace.Title) + require.Equal(t, "/a/quickwit-quickwit-app/explorer?ds=traces-uid&${__url_time_range}&peek=${__value.raw}", peekTrace.URL) + + peekLogs := traceIDField.Config.Links[2] + require.Equal(t, "Peek logs", peekLogs.Title) + require.Equal(t, "/a/quickwit-quickwit-app/explorer?ds=traces-uid&${__url_time_range}&peek=${__value.raw}&peekTab=logs", peekLogs.URL) link := traceIDField.Config.Links[0] require.Equal(t, "Open trace", link.Title) diff --git a/provisioning/datasources/quickwit.yaml b/provisioning/datasources/quickwit.yaml new file mode 100644 index 0000000..2e170d0 --- /dev/null +++ b/provisioning/datasources/quickwit.yaml @@ -0,0 +1,22 @@ +apiVersion: 1 + +datasources: + - name: Quickwit Logs + uid: quickwit-logs + type: quickwit-quickwit-datasource + url: http://quickwit:7280/api/v1 + jsonData: + index: 'otel-logs-v0_9' + logMessageField: body.message + logLevelField: severity_text + tracesDatasourceUid: quickwit-traces + tracesDatasourceName: Quickwit Traces + + - name: Quickwit Traces + uid: quickwit-traces + type: quickwit-quickwit-datasource + url: http://quickwit:7280/api/v1 + jsonData: + index: 'otel-traces-v0_9' + logsDatasourceUid: quickwit-logs + logsDatasourceName: Quickwit Logs diff --git a/provisioning/plugins/quickwit-app.yaml b/provisioning/plugins/quickwit-app.yaml new file mode 100644 index 0000000..272e095 --- /dev/null +++ b/provisioning/plugins/quickwit-app.yaml @@ -0,0 +1,9 @@ +apiVersion: 1 + +apps: + - type: 'quickwit-quickwit-app' + org_id: 1 + disabled: false + jsonData: + tracesDatasourceUid: quickwit-traces + logsDatasourceUid: quickwit-logs diff --git a/scripts/nest-backend.sh b/scripts/nest-backend.sh new file mode 100755 index 0000000..335ebae --- /dev/null +++ b/scripts/nest-backend.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# The Go backend belongs to the nested datasource plugin. Mage now builds it +# straight into dist/datasources/quickwit (see Magefile.go); this script only +# migrates binaries left at the dist root by older builds. +set -euo pipefail +cd "$(dirname "$0")/.." + +mkdir -p dist/datasources/quickwit +for artifact in dist/gpx_quickwit* dist/go_plugin_build_manifest; do + [ -e "$artifact" ] && mv "$artifact" dist/datasources/quickwit/ +done +exit 0 diff --git a/src/app/components/App/App.tsx b/src/app/components/App/App.tsx new file mode 100644 index 0000000..dd1e8d0 --- /dev/null +++ b/src/app/components/App/App.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { SceneApp, useSceneApp } from '@grafana/scenes'; +import { AppRootProps, GrafanaTheme2 } from '@grafana/data'; +import { Alert, useStyles2 } from '@grafana/ui'; +import { PluginPropsContext } from '../../utils/utils.plugin'; +import { + quickwitDatasources, + setTraceExplorerSettings, + TraceExplorerSettings, +} from '../../utils/utils.datasource'; +import { breakdownPage, spanExplorerPage, traceViewerPage } from '../../pages/TraceExplorer/traceExplorerPage'; + +function getSceneApp() { + return new SceneApp({ + pages: [traceViewerPage, breakdownPage, spanExplorerPage], + urlSyncOptions: { + updateUrlOnInit: true, + createBrowserHistorySteps: true, + }, + }); +} + +function AppWithScenes() { + const scene = useSceneApp(getSceneApp); + const styles = useStyles2(getStyles); + + if (quickwitDatasources().length === 0) { + return ( + + The trace explorer queries Quickwit datasources. Add one (pointing at your OTEL traces index, e.g.{' '} + otel-traces-v0_7) and configure it in the app settings. + + ); + } + + // The pages use PageLayoutType.Custom (no standard page header), so provide + // the content padding the standard layout would normally add. + return ( +
+ +
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + wrapper: css` + height: 100%; + padding: ${theme.spacing(2)}; + `, +}); + +function App(props: AppRootProps) { + // Make the configured datasource UIDs available to scene construction. + setTraceExplorerSettings(props.meta.jsonData ?? undefined); + + return ( + + + + ); +} + +export default App; diff --git a/src/app/components/AppConfig/AppConfig.tsx b/src/app/components/AppConfig/AppConfig.tsx new file mode 100644 index 0000000..23db8c1 --- /dev/null +++ b/src/app/components/AppConfig/AppConfig.tsx @@ -0,0 +1,89 @@ +import React, { useState } from 'react'; +import { Button, Field, FieldSet } from '@grafana/ui'; +import { PluginConfigPageProps, AppPluginMeta, PluginMeta } from '@grafana/data'; +import { DataSourcePicker, getBackendSrv, locationService } from '@grafana/runtime'; +import { lastValueFrom } from 'rxjs'; +import { testIds } from '../testIds'; +import { QUICKWIT_DS_TYPE } from '../../constants'; +import { TraceExplorerSettings } from '../../utils/utils.datasource'; + +export interface AppConfigProps extends PluginConfigPageProps> {} + +const AppConfig = ({ plugin }: AppConfigProps) => { + const { enabled, pinned, jsonData } = plugin.meta; + const [state, setState] = useState({ + tracesDatasourceUid: jsonData?.tracesDatasourceUid, + logsDatasourceUid: jsonData?.logsDatasourceUid, + }); + + const onSubmit = (event: React.FormEvent) => { + event.preventDefault(); + updatePluginAndReload(plugin.meta.id, { + enabled, + pinned, + jsonData: state, + }); + }; + + return ( +
+
+ + ds.type === QUICKWIT_DS_TYPE} + current={state.tracesDatasourceUid} + onChange={(ds) => setState({ ...state, tracesDatasourceUid: ds.uid })} + noDefault + /> + + + ds.type === QUICKWIT_DS_TYPE} + current={state.logsDatasourceUid} + onChange={(ds) => setState({ ...state, logsDatasourceUid: ds.uid })} + noDefault + /> + + +
+
+ ); +}; + +export default AppConfig; + +const updatePluginAndReload = async (pluginId: string, data: Partial>) => { + try { + await updatePlugin(pluginId, data); + + // Reloading the page as the changes made here wouldn't be propagated to the actual plugin otherwise. + // This is not ideal, however unfortunately currently there is no supported way for updating the plugin state. + locationService.reload(); + } catch (e) { + console.error('Error while updating the plugin', e); + } +}; + +const updatePlugin = async (pluginId: string, data: Partial) => { + const response = getBackendSrv().fetch({ + url: `/api/plugins/${pluginId}/settings`, + method: 'POST', + data, + }); + + const dataResponse = await lastValueFrom(response); + + return dataResponse.data; +}; diff --git a/src/app/components/testIds.ts b/src/app/components/testIds.ts new file mode 100644 index 0000000..4df554c --- /dev/null +++ b/src/app/components/testIds.ts @@ -0,0 +1,6 @@ +export const testIds = { + appConfig: { + container: 'data-testid ac-container', + submit: 'data-testid ac-submit-form', + }, +}; diff --git a/src/app/constants.ts b/src/app/constants.ts new file mode 100644 index 0000000..7753c38 --- /dev/null +++ b/src/app/constants.ts @@ -0,0 +1,15 @@ +import pluginJson from '../plugin.json'; + +export const PLUGIN_BASE_URL = `/a/${pluginJson.id}`; + +export enum ROUTES { + Explorer = 'explorer', + Breakdown = 'explorer/breakdown', + Trace = 'explorer/trace', +} + +export const QUICKWIT_DS_TYPE = 'quickwit-quickwit-datasource'; + +// Field names of Quickwit's OTEL traces index (otel-traces-v0_*). +export const SPAN_DURATION_FIELD = 'span_duration_millis'; +export const SPAN_ERROR_QUERY = 'span_status.code:error'; diff --git a/src/app/pages/TraceExplorer/AttributesSidebar.tsx b/src/app/pages/TraceExplorer/AttributesSidebar.tsx new file mode 100644 index 0000000..71564c3 --- /dev/null +++ b/src/app/pages/TraceExplorer/AttributesSidebar.tsx @@ -0,0 +1,190 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { + sceneGraph, + SceneComponentProps, + SceneObjectBase, + SceneObjectState, + SceneObjectUrlSyncConfig, + SceneObjectUrlValues, +} from '@grafana/scenes'; +import { Checkbox, FilterInput, IconButton, useStyles2 } from '@grafana/ui'; +import { getTracesDatasource } from '../../utils/utils.datasource'; +import { toggleFavoriteAttribute, useFavoriteAttributes } from '../../utils/favorites'; +import { useQuickwitFields } from './useQuickwitAutocomplete'; + +export interface AttributesSidebarState extends SceneObjectState { + /** Attributes shown as extra columns in the traces table. */ + selected: string[]; +} + +const MAX_VISIBLE_ATTRIBUTES = 50; + +// OTEL plumbing fields (span events, links, scope, SDK metadata, raw ids and +// timestamps) are rarely useful as columns — sort them to the bottom. +const LOW_PRIORITY_PREFIXES = [ + 'events', + 'links', + 'scope_', + 'trace_id', + 'span_id', + 'parent_span_id', + 'trace_state', + 'span_start_timestamp', + 'span_end_timestamp', + 'span_duration', + 'span_fingerprint', + 'resource_attributes.telemetry.', +]; + +function isLowPriority(attribute: string): boolean { + return LOW_PRIORITY_PREFIXES.some((prefix) => attribute === prefix || attribute.startsWith(prefix)); +} + +/** + * Left-hand list of the searchable attributes of the traces index. Checked + * attributes are added as extra columns to the traces table (values joined + * from raw span documents). Starred attributes are pinned to the top and + * shared with the breakdown view's attribute picker; OTEL plumbing fields + * sort to the bottom. Synced to the `columns` URL parameter. + */ +export class AttributesSidebar extends SceneObjectBase { + static Component = AttributesSidebarRenderer; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['columns'] }); + + public getUrlState() { + return { columns: this.state.selected.length ? this.state.selected.join(',') : undefined }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + if (typeof values.columns === 'string') { + const selected = values.columns.split(',').filter(Boolean); + this.setState({ selected }); + } + } + + public onToggle = (attribute: string) => { + const { selected } = this.state; + this.setState({ + selected: selected.includes(attribute) + ? selected.filter((a) => a !== attribute) + : [...selected, attribute], + }); + }; +} + +function AttributesSidebarRenderer({ model }: SceneComponentProps) { + const { selected } = model.useState(); + const styles = useStyles2(getStyles); + const timeRange = sceneGraph.getTimeRange(model).useState(); + const { fields } = useQuickwitFields(getTracesDatasource()?.uid, timeRange.value); + const favorites = useFavoriteAttributes(); + const favoriteSet = new Set(favorites); + + const [search, setSearch] = React.useState(''); + const matching = fields.filter((f) => f.text.toLowerCase().includes(search.toLowerCase())); + + // Selected and favorite attributes are always visible, pinned to the top; + // the rest is capped (OTEL plumbing fields last) — search to narrow. + const pinned = matching.filter((f) => selected.includes(f.text) || favoriteSet.has(f.text)); + const rest = matching.filter((f) => !selected.includes(f.text) && !favoriteSet.has(f.text)); + const cappedRest = [...rest.filter((f) => !isLowPriority(f.text)), ...rest.filter((f) => isLowPriority(f.text))].slice( + 0, + MAX_VISIBLE_ATTRIBUTES + ); + const visibleFields = [...pinned, ...cappedRest]; + const hiddenCount = matching.length - visibleFields.length; + + return ( +
+
Attributes
+
Check to add as a column to the traces table; star to pin as a favorite
+ +
+ {visibleFields.map((field) => { + const isFavorite = favoriteSet.has(field.text); + return ( +
+ + toggleFavoriteAttribute(field.text)} + /> +
+ ); + })} + {hiddenCount > 0 &&
+{hiddenCount} more — search to narrow
} + {visibleFields.length === 0 &&
No matching attributes
} +
+
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + wrapper: css` + display: flex; + flex-direction: column; + gap: ${theme.spacing(1)}; + width: 100%; + height: 100%; + min-height: 0; + padding: ${theme.spacing(1)}; + background: ${theme.colors.background.primary}; + border: 1px solid ${theme.colors.border.weak}; + border-radius: ${theme.shape.radius.default}; + `, + header: css` + font-size: ${theme.typography.h6.fontSize}; + font-weight: ${theme.typography.fontWeightMedium}; + `, + hint: css` + color: ${theme.colors.text.secondary}; + font-size: ${theme.typography.bodySmall.fontSize}; + `, + list: css` + flex: 1; + min-height: 0; + /* Long dotted attribute paths scroll horizontally instead of being cut off. */ + overflow: auto; + `, + row: css` + display: flex; + align-items: center; + gap: ${theme.spacing(0.5)}; + width: max-content; + min-width: 100%; + padding: ${theme.spacing(0.5)}; + border-radius: ${theme.shape.radius.default}; + + &:hover { + background: ${theme.colors.action.hover}; + } + `, + rowLabel: css` + display: flex; + align-items: center; + gap: ${theme.spacing(1)}; + cursor: pointer; + `, + fieldName: css` + font-family: ${theme.typography.fontFamilyMonospace}; + font-size: ${theme.typography.bodySmall.fontSize}; + white-space: nowrap; + `, + star: css` + margin-left: ${theme.spacing(0.5)}; + `, + noValues: css` + padding: ${theme.spacing(0.5)}; + color: ${theme.colors.text.disabled}; + font-size: ${theme.typography.bodySmall.fontSize}; + `, +}); diff --git a/src/app/pages/TraceExplorer/BreakdownRows.tsx b/src/app/pages/TraceExplorer/BreakdownRows.tsx new file mode 100644 index 0000000..e2b951c --- /dev/null +++ b/src/app/pages/TraceExplorer/BreakdownRows.tsx @@ -0,0 +1,236 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { + SceneComponentProps, + SceneFlexLayout, + SceneObject, + SceneObjectBase, + SceneObjectState, +} from '@grafana/scenes'; +import { Button, FilterInput, useStyles2 } from '@grafana/ui'; + +const BATCH_SIZE = 20; + +export interface BreakdownRowsState extends SceneObjectState { + /** Attribute being broken down (for the helper text). */ + attribute: string; + values: string[]; + /** True when the value list was truncated to the fetch cap. */ + capped: boolean; + /** Client-side search over the value list. */ + search: string; + visibleCount: number; + /** Column layout whose children are the per-value rows (keeps scene-graph parenting). */ + list: SceneFlexLayout; +} + +/** + * One full-width row of panels per breakdown value, each with a header naming + * the value and a button to add it to the query filter. At most 20 rows render + * initially; scrolling to the bottom loads 20 more (infinite scroll), and the + * search box narrows the value list for high-cardinality attributes. + */ +export class BreakdownRows extends SceneObjectBase { + static Component = BreakdownRowsRenderer; + + /** Builds the panels row for one value. Assigned by the scene. */ + public buildRow?: (value: string) => SceneFlexLayout; + /** Adds the value as a query filter. Assigned by the scene. */ + public onAddFilter?: (value: string) => void; + + public constructor() { + super({ + attribute: '', + values: [], + capped: false, + search: '', + visibleCount: 0, + list: new SceneFlexLayout({ direction: 'column', children: [] }), + }); + } + + public filteredValues(): string[] { + const search = this.state.search.trim().toLowerCase(); + return search ? this.state.values.filter((v) => v.toLowerCase().includes(search)) : this.state.values; + } + + /** Replaces the value list and rebuilds all rows (new attribute or filter). */ + public setValues(attribute: string, values: string[], capped = false) { + this.setState({ attribute, values, capped, search: '' }); + this.showFirstBatch(); + } + + public onSearch = (search: string) => { + this.setState({ search }); + this.showFirstBatch(); + }; + + /** Rebuilds the currently visible rows (e.g. after the query changed). */ + public rebuild() { + const visible = this.filteredValues().slice(0, this.state.visibleCount); + this.state.list.setState({ children: visible.map((value) => this.buildRow!(value)) }); + } + + public loadMore = () => { + const filtered = this.filteredValues(); + const { visibleCount, list } = this.state; + if (visibleCount >= filtered.length) { + return; + } + const nextCount = Math.min(filtered.length, visibleCount + BATCH_SIZE); + const appended = filtered.slice(visibleCount, nextCount).map((value) => this.buildRow!(value)); + this.setState({ visibleCount: nextCount }); + list.setState({ children: [...list.state.children, ...appended] }); + }; + + private showFirstBatch() { + const filtered = this.filteredValues(); + const visibleCount = Math.min(filtered.length, BATCH_SIZE); + this.setState({ visibleCount }); + this.state.list.setState({ children: filtered.slice(0, visibleCount).map((value) => this.buildRow!(value)) }); + } +} + +function BreakdownRowsRenderer({ model }: SceneComponentProps) { + const { attribute, values, capped, search, visibleCount, list } = model.useState(); + const { children } = list.useState(); + const styles = useStyles2(getStyles); + const sentinelRef = React.useRef(null); + + // Rebuilding rows is expensive (panels + queries), so the search input is + // debounced: it only applies 500ms after typing stops. + const [draft, setDraft] = React.useState(search); + const [prevSearch, setPrevSearch] = React.useState(search); + if (prevSearch !== search) { + setPrevSearch(search); + setDraft(search); + } + const debounceRef = React.useRef>(); + const onSearchChange = (value: string) => { + setDraft(value); + clearTimeout(debounceRef.current); + debounceRef.current = setTimeout(() => model.onSearch(value), 500); + }; + React.useEffect(() => () => clearTimeout(debounceRef.current), []); + + const searchTerm = search.trim().toLowerCase(); + const filtered = searchTerm ? values.filter((v) => v.toLowerCase().includes(searchTerm)) : values; + + React.useEffect(() => { + const sentinel = sentinelRef.current; + if (!sentinel) { + return; + } + const observer = new IntersectionObserver((entries) => { + if (entries.some((e) => e.isIntersecting)) { + model.loadMore(); + } + }); + observer.observe(sentinel); + return () => observer.disconnect(); + }, [model]); + + return ( +
+
+
+ Each row shows span rate, errors and p90 duration for one value of{' '} + {attribute || 'the selected attribute'}, most active first. Use Filter to narrow the + query to that value. +
+
+ +
+
+ {children.map((row, index) => { + const value = filtered[index] ?? ''; + const body = row as SceneObject; + return ( +
+
+ + {value} + + +
+
+ +
+
+ ); + })} +
+
+ {filtered.length === 0 + ? search + ? 'No values match the search.' + : 'No values found for this attribute in the current time range.' + : `Showing ${visibleCount} of ${filtered.length} values${ + visibleCount < filtered.length ? ' — scroll for more' : '' + }${capped && !search ? ` (list capped at ${values.length}; search or refine the query to find others)` : ''}`} +
+
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + wrapper: css` + display: flex; + flex-direction: column; + width: 100%; + `, + headerRow: css` + display: flex; + align-items: center; + gap: ${theme.spacing(2)}; + padding: ${theme.spacing(0.5, 0, 1)}; + `, + helper: css` + flex: 1; + color: ${theme.colors.text.secondary}; + font-size: ${theme.typography.bodySmall.fontSize}; + + code { + font-size: ${theme.typography.bodySmall.fontSize}; + } + `, + search: css` + flex: 0 0 240px; + `, + row: css` + padding: ${theme.spacing(1, 0, 2)}; + border-top: 1px solid ${theme.colors.border.medium}; + `, + rowHeader: css` + display: flex; + align-items: center; + gap: ${theme.spacing(1)}; + padding-bottom: ${theme.spacing(1)}; + `, + rowTitle: css` + font-family: ${theme.typography.fontFamilyMonospace}; + font-size: ${theme.typography.h5.fontSize}; + font-weight: ${theme.typography.fontWeightMedium}; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + `, + rowBody: css` + min-height: 170px; + `, + footer: css` + color: ${theme.colors.text.secondary}; + font-size: ${theme.typography.bodySmall.fontSize}; + padding: ${theme.spacing(1, 0)}; + border-top: 1px solid ${theme.colors.border.medium}; + `, +}); diff --git a/src/app/pages/TraceExplorer/DatasourceControl.tsx b/src/app/pages/TraceExplorer/DatasourceControl.tsx new file mode 100644 index 0000000..7106b75 --- /dev/null +++ b/src/app/pages/TraceExplorer/DatasourceControl.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { + SceneComponentProps, + SceneObjectBase, + SceneObjectState, + SceneObjectUrlSyncConfig, + SceneObjectUrlValues, +} from '@grafana/scenes'; +import { DataSourcePicker } from '@grafana/runtime'; +import { QUICKWIT_DS_TYPE } from '../../constants'; +import { getTracesDatasource, setTracesDatasourceOverride } from '../../utils/utils.datasource'; + +export interface DatasourceControlState extends SceneObjectState { + uid?: string; +} + +/** + * Toolbar picker for the traces datasource (Quickwit datasources only), + * synced to the `ds` URL parameter. The logs datasource follows the selected + * traces datasource's `logsDatasourceUid` pairing (or the app defaults stored + * server-side in the plugin settings). Scenes subscribe to this object to + * repoint their query runners. + */ +export class DatasourceControl extends SceneObjectBase { + static Component = DatasourceControlRenderer; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['ds'] }); + + public constructor(state: DatasourceControlState = {}) { + super(state); + setTracesDatasourceOverride(state.uid); + } + + public getUrlState() { + return { ds: this.state.uid || undefined }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + if (typeof values.ds === 'string' && values.ds !== this.state.uid) { + this.onChange(values.ds); + } + } + + public onChange = (uid: string) => { + setTracesDatasourceOverride(uid); + this.setState({ uid }); + }; +} + +function DatasourceControlRenderer({ model }: SceneComponentProps) { + const { uid } = model.useState(); + return ( +
+ ds.type === QUICKWIT_DS_TYPE} + current={uid ?? getTracesDatasource()?.uid} + onChange={(ds) => model.onChange(ds.uid)} + noDefault + /> +
+ ); +} diff --git a/src/app/pages/TraceExplorer/ExplorerQueryBar.tsx b/src/app/pages/TraceExplorer/ExplorerQueryBar.tsx new file mode 100644 index 0000000..41b21b7 --- /dev/null +++ b/src/app/pages/TraceExplorer/ExplorerQueryBar.tsx @@ -0,0 +1,198 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { + sceneGraph, + SceneComponentProps, + SceneObject, + SceneObjectBase, + SceneObjectState, + SceneObjectUrlSyncConfig, + SceneObjectUrlValues, +} from '@grafana/scenes'; +import { Button, FilterPill, Input, useStyles2 } from '@grafana/ui'; +import { getTracesDatasource } from '../../utils/utils.datasource'; +import { LuceneQueryEditor } from '@/components/LuceneQueryEditor'; +import { useQuickwitAutocomplete } from './useQuickwitAutocomplete'; +import { ExplorerFilter } from './queries'; + +export interface ExplorerQueryBarState extends SceneObjectState, ExplorerFilter { + /** Optional extra control rendered after the filter chips (e.g. the Slowest pill). */ + trailing?: SceneObject; +} + +export function filterOf(state: ExplorerQueryBarState): ExplorerFilter { + return { + query: state.query, + durationMin: state.durationMin, + durationMax: state.durationMax, + errorsOnly: state.errorsOnly, + rootOnly: state.rootOnly, + }; +} + +export function filtersEqual(a: ExplorerFilter, b: ExplorerFilter): boolean { + return ( + a.query === b.query && + a.durationMin === b.durationMin && + a.durationMax === b.durationMax && + a.errorsOnly === b.errorsOnly && + a.rootOnly === b.rootOnly + ); +} + +/** + * The explorer's filter bar: the datasource's CodeMirror Lucene editor + * (autocomplete via Ctrl-Enter, run via Shift-Enter), a span-duration range + * and quick filter chips — all kept in sync with the URL so searches are + * shareable. Scenes subscribe to this object's state to rebuild their queries. + */ +export class ExplorerQueryBar extends SceneObjectBase { + static Component = ExplorerQueryBarRenderer; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { + keys: ['query', 'durationMin', 'durationMax', 'errors', 'root'], + }); + + public getUrlState() { + return { + query: this.state.query || undefined, + durationMin: this.state.durationMin || undefined, + durationMax: this.state.durationMax || undefined, + errors: this.state.errorsOnly ? '1' : undefined, + root: this.state.rootOnly ? '1' : undefined, + }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + const update: Partial = {}; + if (typeof values.query === 'string') { + update.query = values.query; + } + if (typeof values.durationMin === 'string') { + update.durationMin = values.durationMin; + } + if (typeof values.durationMax === 'string') { + update.durationMax = values.durationMax; + } + if (values.errors !== undefined) { + update.errorsOnly = values.errors === '1'; + } + if (values.root !== undefined) { + update.rootOnly = values.root === '1'; + } + if (Object.keys(update).length > 0) { + this.setState(update); + } + } + + public onApply = (filter: ExplorerFilter) => { + this.setState(filter); + }; +} + +function ExplorerQueryBarRenderer({ model }: SceneComponentProps) { + const state = model.useState(); + const styles = useStyles2(getStyles); + const timeRange = sceneGraph.getTimeRange(model).useState(); + const { getSuggestions } = useQuickwitAutocomplete(getTracesDatasource()?.uid, timeRange.value); + + const [draft, setDraft] = React.useState(filterOf(state)); + const [prevFilter, setPrevFilter] = React.useState(filterOf(state)); + + // Reflect external updates (URL navigation, chips, heatmap selection) into the local draft. + if (!filtersEqual(prevFilter, filterOf(state))) { + const filter = filterOf(state); + setPrevFilter(filter); + setDraft(filter); + } + + const draftRef = React.useRef(draft); + React.useEffect(() => { + draftRef.current = draft; + }); + + const apply = () => model.onApply(draftRef.current); + const onKeyDown = (event: React.KeyboardEvent) => { + if (event.key === 'Enter') { + apply(); + } + }; + + return ( +
+
+ setDraft((current) => ({ ...current, query }))} + onSubmit={(query) => model.onApply({ ...draftRef.current, query })} + /> +
+ model.onApply({ ...filterOf(state), errorsOnly: !state.errorsOnly })} + /> + model.onApply({ ...filterOf(state), rootOnly: !state.rootOnly })} + /> + {state.trailing && } + setDraft({ ...draft, durationMin: e.currentTarget.value })} + onKeyDown={onKeyDown} + /> + setDraft({ ...draft, durationMax: e.currentTarget.value })} + onKeyDown={onKeyDown} + /> + +
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + wrapper: css` + display: flex; + align-items: flex-start; + gap: ${theme.spacing(1)}; + width: 100%; + `, + editor: css` + flex: 1; + min-width: 0; + min-height: ${theme.spacing(4)}; + border: 1px solid ${theme.components.input.borderColor}; + border-radius: ${theme.shape.radius.default}; + overflow: hidden; + + .cm-editor { + font-size: ${theme.typography.bodySmall.fontSize}; + } + `, + durationInput: css` + width: auto; + flex: 0 0 auto; + + input { + font-family: ${theme.typography.fontFamilyMonospace}; + } + `, +}); diff --git a/src/app/pages/TraceExplorer/ExplorerTabs.tsx b/src/app/pages/TraceExplorer/ExplorerTabs.tsx new file mode 100644 index 0000000..5d88e4f --- /dev/null +++ b/src/app/pages/TraceExplorer/ExplorerTabs.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { SceneComponentProps, SceneObjectBase, SceneObjectState } from '@grafana/scenes'; +import { locationService } from '@grafana/runtime'; +import { RadioButtonGroup } from '@grafana/ui'; +import { PLUGIN_BASE_URL, ROUTES } from '../../constants'; + +export type ExplorerTab = 'explorer' | 'breakdown' | 'trace'; + +export interface ExplorerTabsState extends SceneObjectState { + active: ExplorerTab; +} + +const TABS: Array<{ label: string; value: ExplorerTab }> = [ + { label: 'Span explorer', value: 'explorer' }, + { label: 'Breakdown', value: 'breakdown' }, + { label: 'Trace viewer', value: 'trace' }, +]; + +const TAB_ROUTES: Record = { + explorer: ROUTES.Explorer, + breakdown: ROUTES.Breakdown, + trace: ROUTES.Trace, +}; + +/** + * Compact page switcher rendered inline with the time picker (the pages use a + * custom layout without the standard page header/tabs to save vertical space). + * Navigation keeps the current URL query params so time range and filters carry over. + */ +export class ExplorerTabs extends SceneObjectBase { + static Component = ExplorerTabsRenderer; + + public onChangeTab = (tab: ExplorerTab) => { + if (tab === this.state.active) { + return; + } + locationService.push({ pathname: `${PLUGIN_BASE_URL}/${TAB_ROUTES[tab]}`, search: window.location.search }); + }; +} + +function ExplorerTabsRenderer({ model }: SceneComponentProps) { + const { active } = model.useState(); + return ; +} diff --git a/src/app/pages/TraceExplorer/HeatmapSelect.tsx b/src/app/pages/TraceExplorer/HeatmapSelect.tsx new file mode 100644 index 0000000..7141733 --- /dev/null +++ b/src/app/pages/TraceExplorer/HeatmapSelect.tsx @@ -0,0 +1,155 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { SceneComponentProps, SceneObjectBase, SceneObjectState, VizPanel } from '@grafana/scenes'; +import { useStyles2 } from '@grafana/ui'; + +export interface HeatmapSelection { + /** Fraction of the plot width, left/right edge of the selection (0..1). */ + fx0: number; + fx1: number; + /** Fraction of the plot height, top/bottom edge of the selection (0..1, 0 = top). */ + fyTop: number; + fyBottom: number; + /** Set when the drag was flat in one dimension. */ + timeOnly: boolean; + durationOnly: boolean; +} + +export interface HeatmapSelectState extends SceneObjectState { + panel: VizPanel; +} + +const MIN_DRAG_PX = 12; + +/** + * Wraps the duration heatmap and replaces the panel's built-in time-only drag + * zoom with a rectangular selection: horizontal extent narrows the time range, + * vertical extent sets the span-duration filter. A flat drag selects only the + * dimension it covers. + */ +export class HeatmapSelect extends SceneObjectBase { + static Component = HeatmapSelectRenderer; + + /** Assigned by the scene that owns the query bar and time range. */ + public onSelect?: (selection: HeatmapSelection) => void; +} + +interface DragState { + startX: number; + startY: number; + plotRect: DOMRect; + wrapRect: DOMRect; +} + +function clamp(value: number, min: number, max: number) { + return Math.min(max, Math.max(min, value)); +} + +function HeatmapSelectRenderer({ model }: SceneComponentProps) { + const { panel } = model.useState(); + const styles = useStyles2(getStyles); + const wrapRef = React.useRef(null); + const dragRef = React.useRef(null); + const [rect, setRect] = React.useState<{ left: number; top: number; width: number; height: number } | null>(null); + + const onMouseDown = (event: React.MouseEvent) => { + const wrap = wrapRef.current; + if (!wrap || event.button !== 0) { + return; + } + // Only take over drags that start inside the uPlot drawing area. + const over = wrap.querySelector('.u-over'); + if (!over) { + return; + } + const plotRect = over.getBoundingClientRect(); + if ( + event.clientX < plotRect.left || + event.clientX > plotRect.right || + event.clientY < plotRect.top || + event.clientY > plotRect.bottom + ) { + return; + } + // Stop uPlot's own drag-to-zoom from starting. + event.preventDefault(); + event.stopPropagation(); + + const wrapRect = wrap.getBoundingClientRect(); + dragRef.current = { startX: event.clientX, startY: event.clientY, plotRect, wrapRect }; + + const onMove = (moveEvent: MouseEvent) => { + const drag = dragRef.current; + if (!drag) { + return; + } + const x0 = clamp(Math.min(drag.startX, moveEvent.clientX), drag.plotRect.left, drag.plotRect.right); + const x1 = clamp(Math.max(drag.startX, moveEvent.clientX), drag.plotRect.left, drag.plotRect.right); + const y0 = clamp(Math.min(drag.startY, moveEvent.clientY), drag.plotRect.top, drag.plotRect.bottom); + const y1 = clamp(Math.max(drag.startY, moveEvent.clientY), drag.plotRect.top, drag.plotRect.bottom); + setRect({ left: x0 - drag.wrapRect.left, top: y0 - drag.wrapRect.top, width: x1 - x0, height: y1 - y0 }); + }; + + const onUp = (upEvent: MouseEvent) => { + window.removeEventListener('mousemove', onMove); + window.removeEventListener('mouseup', onUp); + const drag = dragRef.current; + dragRef.current = null; + setRect(null); + if (!drag) { + return; + } + + const dx = Math.abs(upEvent.clientX - drag.startX); + const dy = Math.abs(upEvent.clientY - drag.startY); + if (dx < MIN_DRAG_PX && dy < MIN_DRAG_PX) { + return; // Just a click. + } + + const { plotRect } = drag; + const x0 = clamp(Math.min(drag.startX, upEvent.clientX), plotRect.left, plotRect.right); + const x1 = clamp(Math.max(drag.startX, upEvent.clientX), plotRect.left, plotRect.right); + const y0 = clamp(Math.min(drag.startY, upEvent.clientY), plotRect.top, plotRect.bottom); + const y1 = clamp(Math.max(drag.startY, upEvent.clientY), plotRect.top, plotRect.bottom); + + model.onSelect?.({ + fx0: (x0 - plotRect.left) / plotRect.width, + fx1: (x1 - plotRect.left) / plotRect.width, + fyTop: (y0 - plotRect.top) / plotRect.height, + fyBottom: (y1 - plotRect.top) / plotRect.height, + timeOnly: dy < MIN_DRAG_PX, + durationOnly: dx < MIN_DRAG_PX, + }); + }; + + window.addEventListener('mousemove', onMove); + window.addEventListener('mouseup', onUp); + }; + + return ( +
+ + {rect && ( +
+ )} +
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + wrapper: css` + position: relative; + width: 100%; + height: 100%; + `, + selection: css` + position: absolute; + pointer-events: none; + border: 1px solid ${theme.colors.primary.border}; + background: ${theme.colors.primary.transparent}; + `, +}); diff --git a/src/app/pages/TraceExplorer/MetricFocus.tsx b/src/app/pages/TraceExplorer/MetricFocus.tsx new file mode 100644 index 0000000..44dc428 --- /dev/null +++ b/src/app/pages/TraceExplorer/MetricFocus.tsx @@ -0,0 +1,68 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { SceneObjectBase, SceneObjectState, SceneObjectUrlSyncConfig, SceneObjectUrlValues } from '@grafana/scenes'; +import { useStyles2 } from '@grafana/ui'; + +export type MetricKey = 'duration' | 'spans' | 'errors'; + +export const METRIC_KEYS: MetricKey[] = ['duration', 'spans', 'errors']; + +export interface MetricFocusState extends SceneObjectState { + metric: MetricKey; +} + +/** + * Tracks which metric panel (duration heatmap, span rate, error rate) is + * focused — i.e. rendered large, with the other two stacked beside it. + * Synced to the `metric` URL parameter. + */ +export class MetricFocus extends SceneObjectBase { + static Component = () => null; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['metric'] }); + + public getUrlState() { + return { metric: this.state.metric === 'duration' ? undefined : this.state.metric }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + const metric = values.metric; + if (typeof metric === 'string' && METRIC_KEYS.includes(metric as MetricKey)) { + this.setState({ metric: metric as MetricKey }); + } + } + + public onFocus = (metric: MetricKey) => { + if (metric !== this.state.metric) { + this.setState({ metric }); + } + }; +} + +/** Radio dot rendered in each metric panel's header to focus that panel. */ +export function FocusRadio({ controller, metric }: { controller: MetricFocus; metric: MetricKey }) { + const { metric: active } = controller.useState(); + const styles = useStyles2(getStyles); + return ( + controller.onFocus(metric)} + /> + ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + radio: css` + cursor: pointer; + width: 14px; + height: 14px; + margin: ${theme.spacing(0.5)}; + accent-color: ${theme.colors.primary.main}; + `, +}); diff --git a/src/app/pages/TraceExplorer/SpanFilter.tsx b/src/app/pages/TraceExplorer/SpanFilter.tsx new file mode 100644 index 0000000..c20baee --- /dev/null +++ b/src/app/pages/TraceExplorer/SpanFilter.tsx @@ -0,0 +1,107 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { + SceneObjectBase, + SceneObjectState, + SceneObjectUrlSyncConfig, + SceneObjectUrlValues, +} from '@grafana/scenes'; +import { Icon, Input, Tag, useStyles2 } from '@grafana/ui'; + +export interface LogsFilterState extends SceneObjectState { + /** Restrict log lines to one span of the trace. */ + spanId: string; + /** Free-text search within the trace's log lines. */ + text: string; +} + +/** Filters applied to the trace logs panel, synced to `spanId` / `logq` URL parameters. */ +export class LogsFilter extends SceneObjectBase { + static Component = () => null; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['spanId', 'logq'] }); + + public getUrlState() { + return { spanId: this.state.spanId || undefined, logq: this.state.text || undefined }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + const update: Partial = {}; + if (typeof values.spanId === 'string' && values.spanId !== this.state.spanId) { + update.spanId = values.spanId; + } + if (typeof values.logq === 'string' && values.logq !== this.state.text) { + update.text = values.logq; + } + if (Object.keys(update).length > 0) { + this.setState(update); + } + } + + public onChangeSpan = (spanId: string) => { + if (spanId !== this.state.spanId) { + this.setState({ spanId }); + } + }; + + public onChangeText = (text: string) => { + if (text !== this.state.text) { + this.setState({ text }); + } + }; + + public clear = () => { + this.setState({ spanId: '', text: '' }); + }; +} + +/** Logs panel header controls: text search plus the active span filter chip. */ +export function LogsFilterControls({ controller }: { controller: LogsFilter }) { + const { spanId, text } = controller.useState(); + const styles = useStyles2(getStyles); + const [draft, setDraft] = React.useState(text); + const [prevText, setPrevText] = React.useState(text); + + // Reflect external updates (URL navigation, clear) into the local draft. + if (prevText !== text) { + setPrevText(text); + setDraft(text); + } + + return ( +
+ {spanId && ( + controller.onChangeSpan('')} + /> + )} + } + placeholder="Filter logs… (Enter)" + value={draft} + onChange={(e) => setDraft(e.currentTarget.value)} + onKeyDown={(e) => e.key === 'Enter' && controller.onChangeText(draft.trim())} + onBlur={() => controller.onChangeText(draft.trim())} + /> +
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + wrapper: css` + display: flex; + align-items: center; + gap: ${theme.spacing(1)}; + `, + search: css` + input { + font-family: ${theme.typography.fontFamilyMonospace}; + } + `, +}); diff --git a/src/app/pages/TraceExplorer/SpanLogsLink.tsx b/src/app/pages/TraceExplorer/SpanLogsLink.tsx new file mode 100644 index 0000000..03e5a9f --- /dev/null +++ b/src/app/pages/TraceExplorer/SpanLogsLink.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { SceneComponentProps, SceneObjectBase, SceneObjectState, VizPanel } from '@grafana/scenes'; + +export interface SpanLogsLinkState extends SceneObjectState { + panel: VizPanel; +} + +/** + * Wraps the trace waterfall panel and intercepts the per-span "Logs for span" + * links the datasource generates (which normally jump to Explore): clicking + * one instead filters the in-app trace logs panel to that span. + */ +export class SpanLogsLink extends SceneObjectBase { + static Component = SpanLogsLinkRenderer; + + /** Assigned by the scene that owns the logs query. */ + public onSelectSpan?: (spanId: string) => void; +} + +function SpanLogsLinkRenderer({ model }: SceneComponentProps) { + const { panel } = model.useState(); + + const onClickCapture = (event: React.MouseEvent) => { + const anchor = (event.target as HTMLElement).closest?.('a'); + if (!anchor || !anchor.href.includes('/explore?')) { + return; + } + const match = decodeURIComponent(anchor.href).match(/span_id:([0-9a-fA-F]+)/); + if (!match) { + return; + } + event.preventDefault(); + event.stopPropagation(); + model.onSelectSpan?.(match[1]); + }; + + return ( +
+ +
+ ); +} diff --git a/src/app/pages/TraceExplorer/TableSortPills.tsx b/src/app/pages/TraceExplorer/TableSortPills.tsx new file mode 100644 index 0000000..9e3303a --- /dev/null +++ b/src/app/pages/TraceExplorer/TableSortPills.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { + SceneObjectBase, + SceneObjectState, + SceneObjectUrlSyncConfig, + SceneObjectUrlValues, +} from '@grafana/scenes'; +import { FilterPill, Tooltip } from '@grafana/ui'; +import { TraceSearchSort } from './queries'; + +export interface TableSortState extends SceneObjectState { + sort?: 'slowest'; +} + +/** Server-side trace_search sort for the pill, or undefined for most recent. */ +export function serverSortFor(sort: TableSortState['sort']): TraceSearchSort | undefined { + return sort === 'slowest' ? 'duration' : undefined; +} + +/** + * "Slowest" toggle for the traces table: when active, the trace search scans + * the slowest spans of the window server-side (sort_by=-span_duration_millis) + * and orders traces by duration. Off by default (most recent first). + * Synced to the `sort` URL parameter. + */ +export class TableSort extends SceneObjectBase { + static Component = TableSortRenderer; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['sort'] }); + + public getUrlState() { + return { sort: this.state.sort }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + if (values.sort !== undefined) { + const sort = values.sort === 'slowest' ? 'slowest' : undefined; + if (sort !== this.state.sort) { + this.setState({ sort }); + } + } + } + + public onToggle = () => { + this.setState({ sort: this.state.sort === 'slowest' ? undefined : 'slowest' }); + }; +} + +function TableSortRenderer({ model }: { model: TableSort }) { + const { sort } = model.useState(); + return ( + + + + + + ); +} diff --git a/src/app/pages/TraceExplorer/TraceHeader.tsx b/src/app/pages/TraceExplorer/TraceHeader.tsx new file mode 100644 index 0000000..eb03a53 --- /dev/null +++ b/src/app/pages/TraceExplorer/TraceHeader.tsx @@ -0,0 +1,154 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { DataFrame, GrafanaTheme2 } from '@grafana/data'; +import { sceneGraph, SceneComponentProps, SceneObjectBase, SceneObjectState } from '@grafana/scenes'; +import { useStyles2 } from '@grafana/ui'; + +export interface TraceHeaderState extends SceneObjectState {} + +interface TraceSummary { + traceId: string; + rootSpan: string; + durationMs: number; + spanCount: number; + errorCount: number; + services: string[]; + start: Date | undefined; +} + +/** + * Summary strip above the waterfall: trace ID, root span, duration, span and + * error counts, services and start time — computed from the trace query data. + */ +export class TraceHeader extends SceneObjectBase { + static Component = TraceHeaderRenderer; +} + +function fieldValues(frame: DataFrame, name: string): T[] { + const field = frame.fields.find((f) => f.name === name); + return field ? (field.values as unknown as T[]) : []; +} + +function summarize(frame: DataFrame): TraceSummary | undefined { + if (frame.length === 0) { + return undefined; + } + const traceIds = fieldValues(frame, 'traceID'); + const parents = fieldValues(frame, 'parentSpanID'); + const names = fieldValues(frame, 'operationName'); + const services = fieldValues(frame, 'serviceName'); + const startTimes = fieldValues(frame, 'startTime'); + const durations = fieldValues(frame, 'duration'); + const statusCodes = fieldValues(frame, 'statusCode'); + + let rootIndex = 0; + let minStart = Infinity; + let maxEnd = -Infinity; + let errorCount = 0; + const serviceSet = new Set(); + + for (let i = 0; i < frame.length; i++) { + if (!parents[i]) { + rootIndex = i; + } + const start = startTimes[i] ?? 0; + minStart = Math.min(minStart, start); + maxEnd = Math.max(maxEnd, start + (durations[i] ?? 0)); + if (statusCodes[i] === 2) { + errorCount++; + } + if (services[i]) { + serviceSet.add(services[i]); + } + } + + return { + traceId: traceIds[rootIndex] ?? '', + rootSpan: names[rootIndex] ?? '', + durationMs: maxEnd > minStart ? maxEnd - minStart : 0, + spanCount: frame.length, + errorCount, + services: Array.from(serviceSet).sort(), + start: Number.isFinite(minStart) ? new Date(minStart) : undefined, + }; +} + +function formatDuration(ms: number): string { + if (ms >= 1000) { + return `${(ms / 1000).toFixed(2)} s`; + } + if (ms >= 1) { + return `${ms.toFixed(ms < 10 ? 1 : 0)} ms`; + } + return `${(ms * 1000).toFixed(0)} µs`; +} + +function TraceHeaderRenderer({ model }: SceneComponentProps) { + const styles = useStyles2(getStyles); + const { data } = sceneGraph.getData(model).useState(); + + const frame = data?.series.find((s) => s.fields.some((f) => f.name === 'spanID')); + const summary = frame ? summarize(frame) : undefined; + + if (!summary) { + return
Enter a trace ID to inspect its spans and logs.
; + } + + const stats: Array<[string, React.ReactNode]> = [ + ['Root', {summary.rootSpan}], + ['Duration', {formatDuration(summary.durationMs)}], + ['Spans', summary.spanCount], + [ + 'Errors', + 0 ? styles.error : undefined}> + {summary.errorCount} + , + ], + ['Services', summary.services.join(' · ')], + ['Start', summary.start ? summary.start.toISOString().replace('T', ' ').replace('Z', '') : '—'], + ]; + + return ( +
+ {stats.map(([label, value]) => ( +
+
{label}
+
{value}
+
+ ))} +
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + wrapper: css` + display: flex; + gap: ${theme.spacing(4)}; + flex-wrap: wrap; + padding: ${theme.spacing(1, 0)}; + `, + stat: css` + min-width: 0; + `, + label: css` + font-size: ${theme.typography.bodySmall.fontSize}; + letter-spacing: 0.08em; + text-transform: uppercase; + color: ${theme.colors.text.secondary}; + `, + value: css` + font-size: ${theme.typography.body.fontSize}; + margin-top: ${theme.spacing(0.25)}; + `, + mono: css` + font-family: ${theme.typography.fontFamilyMonospace}; + `, + error: css` + color: ${theme.colors.error.text}; + font-weight: ${theme.typography.fontWeightBold}; + `, + empty: css` + color: ${theme.colors.text.secondary}; + padding: ${theme.spacing(1, 0)}; + `, +}); diff --git a/src/app/pages/TraceExplorer/TraceIdBar.tsx b/src/app/pages/TraceExplorer/TraceIdBar.tsx new file mode 100644 index 0000000..50167fc --- /dev/null +++ b/src/app/pages/TraceExplorer/TraceIdBar.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { + SceneComponentProps, + SceneObjectBase, + SceneObjectState, + SceneObjectUrlSyncConfig, + SceneObjectUrlValues, +} from '@grafana/scenes'; +import { Button, InlineField, Input, useStyles2 } from '@grafana/ui'; + +export interface TraceIdBarState extends SceneObjectState { + traceId: string; +} + +/** + * Trace ID lookup input, synced to the `traceId` URL parameter so the explorer + * table (and external tools) can deep-link straight to a trace. + */ +export class TraceIdBar extends SceneObjectBase { + static Component = TraceIdBarRenderer; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['traceId'] }); + + public getUrlState() { + return { traceId: this.state.traceId || undefined }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + if (typeof values.traceId === 'string' && values.traceId !== this.state.traceId) { + this.setState({ traceId: values.traceId }); + } + } + + public onLookup = (traceId: string) => { + this.setState({ traceId: traceId.trim() }); + }; +} + +function TraceIdBarRenderer({ model }: SceneComponentProps) { + const { traceId } = model.useState(); + const styles = useStyles2(getStyles); + const [draft, setDraft] = React.useState(traceId); + const [prevTraceId, setPrevTraceId] = React.useState(traceId); + + // Reflect external updates (URL navigation) into the local draft. + if (prevTraceId !== traceId) { + setPrevTraceId(traceId); + setDraft(traceId); + } + + const apply = () => model.onLookup(draft); + + return ( +
+ + setDraft(e.currentTarget.value)} + onKeyDown={(e) => e.key === 'Enter' && apply()} + spellCheck={false} + /> + + +
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + wrapper: css` + display: flex; + align-items: flex-start; + gap: ${theme.spacing(1)}; + width: 100%; + `, + field: css` + flex: 1; + margin: 0; + `, + monoInput: css` + input { + font-family: ${theme.typography.fontFamilyMonospace}; + } + `, +}); diff --git a/src/app/pages/TraceExplorer/TracePeekDrawer.tsx b/src/app/pages/TraceExplorer/TracePeekDrawer.tsx new file mode 100644 index 0000000..a5e25ee --- /dev/null +++ b/src/app/pages/TraceExplorer/TracePeekDrawer.tsx @@ -0,0 +1,232 @@ +import React from 'react'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { + PanelBuilders, + SceneComponentProps, + SceneObjectBase, + SceneObjectState, + SceneObjectUrlSyncConfig, + SceneObjectUrlValues, + SceneQueryRunner, + VizPanel, +} from '@grafana/scenes'; +import { Drawer, LinkButton, Tab, TabsBar, useStyles2 } from '@grafana/ui'; +import { PLUGIN_BASE_URL, ROUTES } from '../../constants'; +import { getLogsDatasource, getTracesDatasource } from '../../utils/utils.datasource'; +import { LogsFilter, LogsFilterControls } from './SpanFilter'; +import { SpanLogsLink } from './SpanLogsLink'; +import { traceLogsQuery, traceLookupQuery } from './queries'; + +type PeekTab = 'waterfall' | 'logs'; + +export interface TracePeekDrawerState extends SceneObjectState { + traceId: string; + activeTab: PeekTab; + /** Span restriction (waterfall log icons) and free-text search for the logs tab. */ + logsFilter: LogsFilter; + waterfall: SpanLogsLink; + logsPanel: VizPanel; +} + +/** + * Right-hand drawer showing a trace without leaving the explorer, with two + * tabs: the waterfall and the trace's correlated logs. Clicking a span's log + * icon in the waterfall switches to the logs tab filtered to that span. + * Opened by the "Peek trace" data link on the traces table (URL `peek=`). + */ +export class TracePeekDrawer extends SceneObjectBase { + static Component = TracePeekDrawerRenderer; + + private _traceRunner: SceneQueryRunner; + private _logsRunner: SceneQueryRunner; + /** Suppresses the filter subscription while setTraceId resets the filters itself. */ + private _resettingFilter = false; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['peek', 'peekTab'] }); + + public constructor() { + const traceRunner = new SceneQueryRunner({ + datasource: getTracesDatasource(), + queries: [traceLookupQuery('')], + }); + const logsRunner = new SceneQueryRunner({ + datasource: getLogsDatasource(), + queries: [traceLogsQuery('')], + }); + + const waterfallPanel = PanelBuilders.traces().setTitle('Waterfall').setData(traceRunner).build(); + const waterfall = new SpanLogsLink({ panel: waterfallPanel }); + + const logsFilter = new LogsFilter({ spanId: '', text: '' }); + + const logsPanel = PanelBuilders.logs() + .setTitle('Trace logs') + .setData(logsRunner) + .setOption('showTime', true) + .setOption('wrapLogMessage', true) + .setOption('enableLogDetails', true) + .build(); + + super({ traceId: '', activeTab: 'waterfall', logsFilter, waterfall, logsPanel }); + + this._traceRunner = traceRunner; + this._logsRunner = logsRunner; + waterfall.onSelectSpan = this.onSelectSpan; + + this.addActivationHandler(() => { + const sub = logsFilter.subscribeToState((newState, prevState) => { + if ( + !this._resettingFilter && + (newState.spanId !== prevState.spanId || newState.text !== prevState.text) + ) { + this.applyLogsQuery(this.state.traceId, newState.spanId, newState.text); + } + }); + return () => sub.unsubscribe(); + }); + } + + public getUrlState() { + return { + peek: this.state.traceId || undefined, + peekTab: this.state.traceId && this.state.activeTab === 'logs' ? 'logs' : undefined, + }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + if (typeof values.peek === 'string' && values.peek !== this.state.traceId) { + this.setTraceId(values.peek); + } + if (this.state.traceId && values.peekTab !== undefined) { + this.setState({ activeTab: values.peekTab === 'logs' ? 'logs' : 'waterfall' }); + } + } + + public onClose = () => { + this.setTraceId(''); + }; + + public onChangeTab = (tab: PeekTab) => { + this.setState({ activeTab: tab }); + }; + + public onSelectSpan = (spanId: string) => { + this.setState({ activeTab: 'logs' }); + // The filter subscription re-runs the logs query. + this.state.logsFilter.onChangeSpan(spanId); + }; + + public refreshDatasource() { + this._traceRunner.setState({ datasource: getTracesDatasource() }); + this._logsRunner.setState({ datasource: getLogsDatasource() }); + if (this.state.traceId) { + this._traceRunner.runQueries(); + this._logsRunner.runQueries(); + } + } + + private setTraceId(traceId: string) { + const prevTraceId = this.state.traceId; + this.setState({ traceId, activeTab: 'waterfall' }); + if (prevTraceId && traceId !== prevTraceId) { + // Closing or switching traces invalidates the log filters. On the initial + // deep-linked open (prevTraceId empty) the filters may already hold + // URL-restored values, so leave them alone. + this._resettingFilter = true; + this.state.logsFilter.clear(); + this._resettingFilter = false; + } + if (traceId) { + // Always re-run: the runners keep the previous trace's data while the + // drawer is closed (panels unmounted), and scenes would otherwise show + // that stale result when the drawer re-opens for a different trace. + this._traceRunner.setState({ queries: [traceLookupQuery(traceId)] }); + this._traceRunner.runQueries(); + const { spanId, text } = this.state.logsFilter.state; + this.applyLogsQuery(traceId, spanId, text); + } + } + + private applyLogsQuery(traceId: string, spanId: string, text: string) { + this._logsRunner.setState({ queries: [traceLogsQuery(traceId, spanId, text)] }); + if (traceId) { + this._logsRunner.runQueries(); + } + } +} + +function TracePeekDrawerRenderer({ model }: SceneComponentProps) { + const { traceId, activeTab, logsFilter, waterfall, logsPanel } = model.useState(); + const styles = useStyles2(getStyles); + + if (!traceId) { + return null; + } + + const params = new URLSearchParams(window.location.search); + params.delete('peek'); + params.set('traceId', traceId); + + return ( + + Open full view + + } + tabs={ + + model.onChangeTab('waterfall')} + /> + model.onChangeTab('logs')} /> + + } + > + {/* The waterfall stays mounted on the logs tab so span expansion state survives tab switches. */} +
+ +
+ {activeTab === 'logs' && ( +
+
+ +
+
+ +
+
+ )} +
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + tabContent: css` + display: flex; + flex-direction: column; + gap: ${theme.spacing(1)}; + height: 100%; + `, + hidden: css` + display: none; + `, + filterRow: css` + flex: 0 0 auto; + `, + panel: css` + flex: 1; + min-height: 0; + `, +}); diff --git a/src/app/pages/TraceExplorer/attributeColumns.test.ts b/src/app/pages/TraceExplorer/attributeColumns.test.ts new file mode 100644 index 0000000..7828ab9 --- /dev/null +++ b/src/app/pages/TraceExplorer/attributeColumns.test.ts @@ -0,0 +1,63 @@ +import { of } from 'rxjs'; +import { DataFrame, DataTransformContext, toDataFrame } from '@grafana/data'; +import { attributeColumnsTransform } from './attributeColumns'; + +const context = {} as DataTransformContext; + +function run(frames: DataFrame[], selected: string[]): Promise { + return new Promise((resolve) => { + attributeColumnsTransform(() => selected)(context)(of(frames)).subscribe(resolve); + }); +} + +const traceFrame = toDataFrame({ + fields: [ + { + name: 'traceID', + values: ['aaa', 'bbb', 'ccc'], + config: { links: [{ title: 'Open trace', url: '/explore' }] }, + }, + { name: 'duration', values: [10, 20, 30] }, + ], +}); + +// The raw frame's refId is intentionally unset — the backend does not stamp it. +const rawFrame = toDataFrame({ + fields: [ + { name: 'trace_id', values: ['bbb', 'bbb', 'aaa'] }, + { name: 'span_attributes.workspace', values: [null, 'pyrosolv', 'uptick'] }, + { name: 'span_attributes.retries', values: [2, null, 7] }, + ], +}); + +describe('attributeColumnsTransform', () => { + it('joins first non-null attribute values by trace id', async () => { + const [result] = await run([traceFrame, rawFrame], ['span_attributes.workspace']); + const column = result.fields.find((f) => f.name === 'span_attributes.workspace'); + expect(column?.values).toEqual(['uptick', 'pyrosolv', null]); + }); + + it('keeps numeric attributes numeric', async () => { + const [result] = await run([traceFrame, rawFrame], ['span_attributes.retries']); + const column = result.fields.find((f) => f.name === 'span_attributes.retries'); + expect(column?.values).toEqual([7, 2, null]); + }); + + it('drops the raw frame from the output', async () => { + const result = await run([traceFrame, rawFrame], ['span_attributes.workspace']); + expect(result).toHaveLength(1); + expect(result[0].fields.some((f) => f.name === 'trace_id')).toBe(false); + }); + + it('returns only the trace frame when nothing is selected', async () => { + const result = await run([traceFrame, rawFrame], []); + expect(result).toHaveLength(1); + expect(result[0].fields.map((f) => f.name)).toEqual(['traceID', 'duration']); + }); + + it('strips the datasource-provided links from the trace id field', async () => { + const [result] = await run([traceFrame, rawFrame], []); + const traceIdField = result.fields.find((f) => f.name === 'traceID'); + expect(traceIdField?.config.links).toEqual([]); + }); +}); diff --git a/src/app/pages/TraceExplorer/attributeColumns.ts b/src/app/pages/TraceExplorer/attributeColumns.ts new file mode 100644 index 0000000..3e3040d --- /dev/null +++ b/src/app/pages/TraceExplorer/attributeColumns.ts @@ -0,0 +1,75 @@ +import { map, Observable } from 'rxjs'; +import { DataFrame, Field, FieldType } from '@grafana/data'; +import type { CustomTransformOperator } from '@grafana/scenes'; + +function fieldByName(frame: DataFrame, name: string): Field | undefined { + return frame.fields.find((f) => f.name === name); +} + +/** + * Joins extra attribute columns onto the trace-search table: for every trace + * row, takes the first non-null value of each selected attribute among that + * trace's raw span documents (fetched by the companion `rawspans` query). + */ +export function attributeColumnsTransform(getSelected: () => string[]): CustomTransformOperator { + return () => (source: Observable) => + source.pipe( + map((frames) => { + // Detect frames structurally — the raw frame's refId is not always set. + const found = frames.find((f) => fieldByName(f, 'traceID')); + if (!found) { + return frames; + } + // Drop the datasource's built-in Explore link on the trace ID — the + // panel adds its own "Open in trace viewer" / "Peek trace" links. + const traceFrame: DataFrame = { + ...found, + fields: found.fields.map((f) => + f.name === 'traceID' ? { ...f, config: { ...f.config, links: [] } } : f + ), + }; + const selected = getSelected(); + const rawFrame = frames.find((f) => f !== found && fieldByName(f, 'trace_id')); + if (selected.length === 0 || !rawFrame) { + return [traceFrame]; + } + + const rawTraceIds = fieldByName(rawFrame, 'trace_id')?.values ?? []; + + // First non-null value per trace, for each selected attribute. + const valuesByAttribute = new Map>(); + for (const attribute of selected) { + const rawValues = fieldByName(rawFrame, attribute)?.values; + const byTrace = new Map(); + if (rawValues) { + for (let i = 0; i < rawFrame.length; i++) { + const traceId = String(rawTraceIds[i] ?? ''); + const value = rawValues[i]; + if (traceId && value !== null && value !== undefined && !byTrace.has(traceId)) { + byTrace.set(traceId, value); + } + } + } + valuesByAttribute.set(attribute, byTrace); + } + + const tableTraceIds = fieldByName(traceFrame, 'traceID')?.values ?? []; + const extraFields: Field[] = selected.map((attribute) => { + const byTrace = valuesByAttribute.get(attribute)!; + const values: unknown[] = []; + for (let row = 0; row < traceFrame.length; row++) { + values.push(byTrace.get(String(tableTraceIds[row] ?? '')) ?? null); + } + const sample = values.find((v) => v !== null && v !== undefined); + return { + name: attribute, + type: typeof sample === 'number' ? FieldType.number : FieldType.string, + values: typeof sample === 'number' ? values : values.map((v) => (v == null ? null : String(v))), + config: {}, + } as Field; + }); + + return [{ ...traceFrame, fields: [...traceFrame.fields, ...extraFields] }]; + }) + ); +} diff --git a/src/app/pages/TraceExplorer/breakdownScene.tsx b/src/app/pages/TraceExplorer/breakdownScene.tsx new file mode 100644 index 0000000..df03bfd --- /dev/null +++ b/src/app/pages/TraceExplorer/breakdownScene.tsx @@ -0,0 +1,312 @@ +import React from 'react'; +import { css } from '@emotion/css'; + +import { + EmbeddedScene, + PanelBuilders, + SceneControlsSpacer, + SceneComponentProps, + SceneFlexItem, + SceneFlexLayout, + SceneObjectBase, + SceneObjectState, + SceneObjectUrlSyncConfig, + SceneObjectUrlValues, + SceneQueryRunner, + SceneRefreshPicker, + SceneTimePicker, + sceneGraph, +} from '@grafana/scenes'; +import { Combobox, ComboboxOption, InlineField, MultiCombobox } from '@grafana/ui'; +import { getDataSourceSrv } from '@grafana/runtime'; +import { getTracesDatasource } from '../../utils/utils.datasource'; +import { useFavoriteAttributes } from '../../utils/favorites'; +import { BreakdownRows } from './BreakdownRows'; +import { DatasourceControl } from './DatasourceControl'; +import { ExplorerQueryBar, filterOf } from './ExplorerQueryBar'; +import { ExplorerTabs } from './ExplorerTabs'; +import { useQuickwitFields, QuickwitDatasource } from './useQuickwitAutocomplete'; +import { zoomOutHotkeyBehavior } from './zoomOutBehavior'; +import { + attributeTerm, + buildLuceneQuery, + durationPercentilesQuery, + errorRateQuery, + percentileSeriesName, + spanRateQuery, + valueLucene, + DEFAULT_FILTER, +} from './queries'; + +const DEFAULT_ATTRIBUTE = 'service_name'; +const MAX_VALUES = 200; + +const DEFAULT_PERCENTILES = ['50', '95', '99']; +const PERCENTILE_OPTIONS = ['50', '75', '90', '95', '99', '99.9']; +const PERCENTILE_COLORS: Record = { + '50': 'green', + '75': 'blue', + '90': 'orange', + '95': 'yellow', + '99': 'red', + '99.9': 'purple', +}; + +interface DurationLinesState extends SceneObjectState { + percents: string[]; +} + +/** Which duration percentile lines to draw, synced to the `pcts` URL parameter. */ +class DurationLines extends SceneObjectBase { + static Component = DurationLinesRenderer; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['pcts'] }); + + public getUrlState() { + const joined = this.state.percents.join(','); + return { pcts: joined === DEFAULT_PERCENTILES.join(',') ? undefined : joined }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + if (typeof values.pcts === 'string') { + const percents = values.pcts.split(',').filter((p) => PERCENTILE_OPTIONS.includes(p)); + if (percents.length && percents.join(',') !== this.state.percents.join(',')) { + this.setState({ percents }); + } + } + } + + public onChange = (percents: string[]) => { + const sorted = [...percents].sort((a, b) => Number(a) - Number(b)); + this.setState({ percents: sorted.length ? sorted : DEFAULT_PERCENTILES }); + }; +} + +function DurationLinesRenderer({ model }: SceneComponentProps) { + const { percents } = model.useState(); + return ( + + ({ label: `p${p}`, value: p }))} + value={percents} + onChange={(options) => model.onChange(options.map((o) => o.value!))} + /> + + ); +} + +interface BreakdownAttributeState extends SceneObjectState { + attribute: string; +} + +/** Attribute to break the span stream down by, synced to the `by` URL parameter. */ +class BreakdownAttribute extends SceneObjectBase { + static Component = BreakdownAttributeRenderer; + + protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['by'] }); + + public getUrlState() { + return { by: this.state.attribute === DEFAULT_ATTRIBUTE ? undefined : this.state.attribute }; + } + + public updateFromUrl(values: SceneObjectUrlValues) { + if (typeof values.by === 'string' && values.by && values.by !== this.state.attribute) { + this.setState({ attribute: values.by }); + } + } + + public onChange = (attribute: string) => { + if (attribute && attribute !== this.state.attribute) { + this.setState({ attribute }); + } + }; +} + +function BreakdownAttributeRenderer({ model }: SceneComponentProps) { + const { attribute } = model.useState(); + const timeRange = sceneGraph.getTimeRange(model).useState(); + const { fields } = useQuickwitFields(getTracesDatasource()?.uid, timeRange.value); + const favorites = useFavoriteAttributes(); + const favoriteSet = new Set(favorites); + + // Favorites (shared with the span explorer's attributes sidebar) come first. + const options: Array> = [ + ...fields.filter((f) => favoriteSet.has(f.text)).map((f) => ({ label: `★ ${f.text}`, value: f.text })), + ...fields.filter((f) => !favoriteSet.has(f.text)).map((f) => ({ label: f.text, value: f.text })), + ]; + if (!options.some((o) => o.value === attribute)) { + options.unshift({ label: attribute, value: attribute }); + } + + return ( + + option?.value && model.onChange(option.value)} + /> + + ); +} + +const comboFieldStyle = css` + margin: 0; +`; + +export function breakdownScene() { + const attribute = new BreakdownAttribute({ attribute: DEFAULT_ATTRIBUTE }); + const queryBar = new ExplorerQueryBar(DEFAULT_FILTER); + const dsControl = new DatasourceControl(); + const durationLines = new DurationLines({ percents: DEFAULT_PERCENTILES }); + const rows = new BreakdownRows(); + + // One row of rate / errors / duration-percentile panels per attribute value. + rows.buildRow = (value: string) => { + const datasource = getTracesDatasource(); + const lucene = valueLucene(buildLuceneQuery(filterOf(queryBar.state)), attribute.state.attribute, value); + + const ratePanel = PanelBuilders.timeseries() + .setTitle('Rate') + .setDescription(`Span rate for ${attribute.state.attribute} = ${value}`) + .setData(new SceneQueryRunner({ datasource, queries: [spanRateQuery(lucene)], maxDataPoints: 60 })) + .setCustomFieldConfig('drawStyle', 'bars' as never) + .setCustomFieldConfig('fillOpacity', 100) + .setCustomFieldConfig('lineWidth', 0) + .setColor({ mode: 'fixed', fixedColor: 'green' }) + .setOption('legend', { showLegend: false } as never) + .build(); + + const errorsPanel = PanelBuilders.timeseries() + .setTitle('Errors') + .setDescription(`Error rate for ${attribute.state.attribute} = ${value}`) + .setData(new SceneQueryRunner({ datasource, queries: [errorRateQuery(lucene)], maxDataPoints: 60 })) + .setCustomFieldConfig('drawStyle', 'bars' as never) + .setCustomFieldConfig('fillOpacity', 100) + .setCustomFieldConfig('lineWidth', 0) + .setColor({ mode: 'fixed', fixedColor: 'red' }) + .setOption('legend', { showLegend: false } as never) + .build(); + + const percents = durationLines.state.percents; + const durationBuilder = PanelBuilders.timeseries() + .setTitle(`Duration ${percents.map((p) => `p${p}`).join('/')}`) + .setDescription(`Span duration percentiles for ${attribute.state.attribute} = ${value}`) + .setData( + new SceneQueryRunner({ datasource, queries: [durationPercentilesQuery(lucene, percents)], maxDataPoints: 60 }) + ) + .setUnit('ms') + .setCustomFieldConfig('fillOpacity', 8) + .setOption('legend', { showLegend: false } as never) + .setOverrides((builder) => { + for (const percent of percents) { + const color = PERCENTILE_COLORS[percent]; + if (color) { + builder + .matchFieldsWithName(percentileSeriesName(percent)) + .overrideColor({ mode: 'fixed', fixedColor: color }); + } + } + }); + const durationPanel = durationBuilder.build(); + + return new SceneFlexLayout({ + direction: 'row', + children: [ratePanel, errorsPanel, durationPanel].map( + (panel) => new SceneFlexItem({ height: 170, body: panel }) + ), + }); + }; + + // Clicking a row's Filter button narrows the query to that value. + rows.onAddFilter = (value: string) => { + const term = attributeTerm(attribute.state.attribute, value); + const current = queryBar.state.query.trim(); + const query = current && current !== '*' ? `${current} AND ${term}` : term; + queryBar.onApply({ ...filterOf(queryBar.state), query }); + }; + + // Loads the attribute's values for the current time range and rebuilds the rows. + const reloadValues = async () => { + const by = attribute.state.attribute; + const uid = getTracesDatasource()?.uid; + if (!uid) { + rows.setValues(by, []); + return; + } + try { + const datasource = (await getDataSourceSrv().get(uid)) as QuickwitDatasource; + const timeRange = sceneGraph.getTimeRange(rows).state.value; + const values = await datasource.getTagValues({ key: by, timeRange }); + rows.setValues( + by, + values.map((v) => String(v.text)).slice(0, MAX_VALUES), + values.length > MAX_VALUES + ); + } catch { + rows.setValues(by, []); + } + }; + + rows.addActivationHandler(() => { + reloadValues(); + }); + + attribute.addActivationHandler(() => { + const sub = attribute.subscribeToState((newState, prevState) => { + if (newState.attribute !== prevState.attribute) { + reloadValues(); + } + }); + return () => sub.unsubscribe(); + }); + + durationLines.addActivationHandler(() => { + const sub = durationLines.subscribeToState((newState, prevState) => { + if (newState.percents.join(',') !== prevState.percents.join(',')) { + rows.rebuild(); + } + }); + return () => sub.unsubscribe(); + }); + + queryBar.addActivationHandler(() => { + const sub = queryBar.subscribeToState((newState, prevState) => { + if (buildLuceneQuery(filterOf(newState)) !== buildLuceneQuery(filterOf(prevState))) { + rows.rebuild(); + } + }); + return () => sub.unsubscribe(); + }); + + dsControl.addActivationHandler(() => { + const sub = dsControl.subscribeToState(() => { + reloadValues(); + queryBar.forceRender(); + attribute.forceRender(); + }); + return () => sub.unsubscribe(); + }); + + return new EmbeddedScene({ + $behaviors: [zoomOutHotkeyBehavior], + body: new SceneFlexLayout({ + direction: 'column', + children: [ + new SceneFlexItem({ ySizing: 'content', body: queryBar }), + new SceneFlexItem({ ySizing: 'content', body: rows }), + ], + }), + controls: [ + new ExplorerTabs({ active: 'breakdown' }), + dsControl, + attribute, + durationLines, + new SceneControlsSpacer(), + new SceneTimePicker({ isOnCanvas: true }), + new SceneRefreshPicker({ isOnCanvas: true }), + ], + }); +} diff --git a/src/app/pages/TraceExplorer/queries.ts b/src/app/pages/TraceExplorer/queries.ts new file mode 100644 index 0000000..4039b65 --- /dev/null +++ b/src/app/pages/TraceExplorer/queries.ts @@ -0,0 +1,170 @@ +import { DataQuery } from '@grafana/schema'; +import { SPAN_DURATION_FIELD, SPAN_ERROR_QUERY } from '../../constants'; + +// Query shapes understood by the Quickwit datasource backend (Elasticsearch-style). +export interface QuickwitQuery extends DataQuery { + query: string; + alias?: string; + metrics: Array<{ id: string; type: string; settings?: Record; field?: string }>; + bucketAggs: Array<{ id: string; type: string; field?: string; settings?: Record }>; +} + +export interface ExplorerFilter { + query: string; + durationMin: string; + durationMax: string; + errorsOnly: boolean; + rootOnly: boolean; +} + +export const DEFAULT_FILTER: ExplorerFilter = { + query: '', + durationMin: '', + durationMax: '', + errorsOnly: false, + rootOnly: false, +}; + +// Root spans have no parent_span_id indexed. +const ROOT_SPAN_QUERY = 'NOT parent_span_id:*'; + +// Combines the user's Lucene query with the duration range and quick filters. +export function buildLuceneQuery({ query, durationMin, durationMax, errorsOnly, rootOnly }: ExplorerFilter): string { + const parts: string[] = []; + const trimmed = query.trim(); + if (trimmed && trimmed !== '*') { + parts.push(`(${trimmed})`); + } + if (durationMin.trim() || durationMax.trim()) { + parts.push(`${SPAN_DURATION_FIELD}:[${durationMin.trim() || '0'} TO ${durationMax.trim() || '*'}]`); + } + if (errorsOnly) { + parts.push(SPAN_ERROR_QUERY); + } + if (rootOnly) { + parts.push(ROOT_SPAN_QUERY); + } + return parts.join(' AND ') || '*'; +} + +// Exponential duration buckets (milliseconds, ×4 per row). Each becomes one +// count-over-time query; the series alias is the bucket's upper bound so the +// heatmap panel reads the set as "time series buckets" with a log-scale y axis. +export const HEATMAP_BUCKET_UPPER_MS = [1, 4, 16, 64, 256, 1024, 4096, 16384, 65536]; +export const HEATMAP_BUCKET_LOWER_MS = [0, 1, 4, 16, 64, 256, 1024, 4096, 16384]; + +const HEATMAP_DURATION_BUCKETS: Array<{ le: string; range: string }> = [ + { le: '1', range: '[0 TO 0]' }, + { le: '4', range: '[1 TO 3]' }, + { le: '16', range: '[4 TO 15]' }, + { le: '64', range: '[16 TO 63]' }, + { le: '256', range: '[64 TO 255]' }, + { le: '1024', range: '[256 TO 1023]' }, + { le: '4096', range: '[1024 TO 4095]' }, + { le: '16384', range: '[4096 TO 16383]' }, + { le: '65536', range: '[16384 TO *]' }, +]; + +export function heatmapQueries(lucene: string): QuickwitQuery[] { + return HEATMAP_DURATION_BUCKETS.map(({ le, range }, index) => { + const rangeQuery = `${SPAN_DURATION_FIELD}:${range}`; + return { + refId: `heat${index}`, + query: lucene === '*' ? rangeQuery : `${lucene} AND ${rangeQuery}`, + alias: le, + metrics: [{ id: '1', type: 'count' }], + bucketAggs: [{ id: '2', type: 'date_histogram', settings: { interval: 'auto', min_doc_count: '0' } }], + }; + }); +} + +export function spanRateQuery(lucene: string): QuickwitQuery { + return { + refId: 'spanrate', + query: lucene, + alias: 'spans', + metrics: [{ id: '1', type: 'count' }], + bucketAggs: [{ id: '2', type: 'date_histogram', settings: { interval: 'auto', min_doc_count: '0' } }], + }; +} + +export function errorRateQuery(lucene: string): QuickwitQuery { + const query = lucene === '*' ? SPAN_ERROR_QUERY : `${lucene} AND ${SPAN_ERROR_QUERY}`; + return { ...spanRateQuery(query), refId: 'errorrate', query, alias: 'errors' }; +} + +/** Server-side ordering of trace summaries, applied before the result limit. */ +export type TraceSearchSort = 'duration' | 'errors' | 'spans'; + +export function traceSearchQuery(lucene: string, sort?: TraceSearchSort): QuickwitQuery { + return { + refId: 'traces', + query: lucene, + metrics: [{ id: '1', type: 'trace_search', settings: { limit: '200', ...(sort ? { sort } : {}) } }], + bucketAggs: [], + }; +} + +// Raw span documents used to join extra attribute columns onto the trace table. +export function rawSpansQuery(lucene: string): QuickwitQuery { + return { + refId: 'rawspans', + query: lucene, + metrics: [{ id: '1', type: 'raw_data', settings: { size: '500' } }], + bucketAggs: [], + }; +} + +/** Lucene term matching one value of an attribute, e.g. `service_name:"frontend"`. */ +export function attributeTerm(attribute: string, value: string): string { + const escaped = value.replace(/(["\\])/g, '\\$1'); + return `${attribute}:"${escaped}"`; +} + +/** Scopes a base Lucene query to one value of a breakdown attribute. */ +export function valueLucene(lucene: string, attribute: string, value: string): string { + const term = attributeTerm(attribute, value); + return lucene === '*' ? term : `${lucene} AND ${term}`; +} + +export function durationPercentilesQuery(lucene: string, percents: string[]): QuickwitQuery { + return { + refId: 'duration', + query: lucene, + // The alias names each series after its percentile, e.g. "p95.0". + alias: '{{metric}}', + metrics: [{ id: '1', type: 'percentiles', field: SPAN_DURATION_FIELD, settings: { percents } }], + bucketAggs: [{ id: '2', type: 'date_histogram', settings: { interval: 'auto', min_doc_count: '0' } }], + }; +} + +/** Series name the backend produces for a percentile, e.g. '99.9' → "p99.9". */ +export function percentileSeriesName(percent: string): string { + return `p${Number(percent).toFixed(1)}`; +} + + +export function traceLookupQuery(traceId: string): QuickwitQuery { + return { + refId: 'trace', + query: traceId ? `trace_id:${traceId.trim()}` : 'trace_id:__none__', + metrics: [{ id: '1', type: 'traces', settings: { limit: '10000' } }], + bucketAggs: [], + }; +} + +export function traceLogsQuery(traceId: string, spanId?: string, text?: string): QuickwitQuery { + const parts = [traceId ? `trace_id:${traceId.trim()}` : 'trace_id:__none__']; + if (spanId) { + parts.push(`span_id:${spanId.trim()}`); + } + if (text?.trim()) { + parts.push(`(${text.trim()})`); + } + return { + refId: 'logs', + query: parts.join(' AND '), + metrics: [{ id: '1', type: 'logs', settings: { limit: '500', sortDirection: 'asc' } }], + bucketAggs: [], + }; +} diff --git a/src/app/pages/TraceExplorer/spanExplorerScene.tsx b/src/app/pages/TraceExplorer/spanExplorerScene.tsx new file mode 100644 index 0000000..929111d --- /dev/null +++ b/src/app/pages/TraceExplorer/spanExplorerScene.tsx @@ -0,0 +1,302 @@ +import React from 'react'; +import { dateTime } from '@grafana/data'; +import { + EmbeddedScene, + PanelBuilders, + SceneControlsSpacer, + SceneCSSGridItem, + SceneCSSGridLayout, + SceneDataTransformer, + SceneFlexItem, + SceneFlexLayout, + SceneQueryRunner, + SceneRefreshPicker, + SceneTimePicker, + sceneGraph, +} from '@grafana/scenes'; +import { PLUGIN_BASE_URL, ROUTES } from '../../constants'; +import { getTracesDatasource } from '../../utils/utils.datasource'; +import { attributeColumnsTransform } from './attributeColumns'; +import { AttributesSidebar } from './AttributesSidebar'; +import { DatasourceControl } from './DatasourceControl'; +import { ExplorerQueryBar, filterOf } from './ExplorerQueryBar'; +import { ExplorerTabs } from './ExplorerTabs'; +import { FocusRadio, MetricFocus, MetricKey, METRIC_KEYS } from './MetricFocus'; +import { HeatmapSelect, HeatmapSelection } from './HeatmapSelect'; +import { serverSortFor, TableSort } from './TableSortPills'; +import { TracePeekDrawer } from './TracePeekDrawer'; +import { zoomOutHotkeyBehavior } from './zoomOutBehavior'; +import { + buildLuceneQuery, + errorRateQuery, + heatmapQueries, + rawSpansQuery, + spanRateQuery, + traceSearchQuery, + DEFAULT_FILTER, + HEATMAP_BUCKET_LOWER_MS, + HEATMAP_BUCKET_UPPER_MS, +} from './queries'; + +function clamp(value: number, min: number, max: number) { + return Math.min(max, Math.max(min, value)); +} + +export function spanExplorerScene() { + const datasource = getTracesDatasource(); + const initialLucene = buildLuceneQuery(DEFAULT_FILTER); + + const heatmapRunner = new SceneQueryRunner({ + datasource, + queries: heatmapQueries(initialLucene), + maxDataPoints: 120, + }); + const spanRateRunner = new SceneQueryRunner({ + datasource, + queries: [spanRateQuery(initialLucene)], + maxDataPoints: 80, + }); + const errorRateRunner = new SceneQueryRunner({ + datasource, + queries: [errorRateQuery(initialLucene)], + maxDataPoints: 80, + }); + const traceSearchRunner = new SceneQueryRunner({ datasource, queries: [traceSearchQuery(initialLucene)] }); + + const tableSort = new TableSort({}); + const queryBar = new ExplorerQueryBar({ ...DEFAULT_FILTER, trailing: tableSort }); + const attributesSidebar = new AttributesSidebar({ selected: [] }); + const dsControl = new DatasourceControl(); + const tracePeek = new TracePeekDrawer(); + + const allRunners = [heatmapRunner, spanRateRunner, errorRateRunner, traceSearchRunner]; + + // Trace search carries the server-side ordering and a companion raw-spans + // query when attribute columns are selected. + const traceSearchQueries = (lucene: string) => { + const search = traceSearchQuery(lucene, serverSortFor(tableSort.state.sort)); + return attributesSidebar.state.selected.length > 0 ? [search, rawSpansQuery(lucene)] : [search]; + }; + + const applyQueries = () => { + const lucene = buildLuceneQuery(filterOf(queryBar.state)); + heatmapRunner.setState({ queries: heatmapQueries(lucene) }); + spanRateRunner.setState({ queries: [spanRateQuery(lucene)] }); + errorRateRunner.setState({ queries: [errorRateQuery(lucene)] }); + traceSearchRunner.setState({ queries: traceSearchQueries(lucene) }); + allRunners.filter((runner) => runner.isActive).forEach((runner) => runner.runQueries()); + }; + + // Rebuild every query when the filter bar changes (Run button, chips, URL restore). + queryBar.addActivationHandler(() => { + if (buildLuceneQuery(filterOf(queryBar.state)) !== initialLucene) { + applyQueries(); + } + const sub = queryBar.subscribeToState((newState, prevState) => { + if (buildLuceneQuery(filterOf(newState)) !== buildLuceneQuery(filterOf(prevState))) { + applyQueries(); + } + }); + return () => sub.unsubscribe(); + }); + + // Re-run the trace search when attribute columns change (adds/removes the raw-spans query). + attributesSidebar.addActivationHandler(() => { + const applyColumns = () => { + traceSearchRunner.setState({ queries: traceSearchQueries(buildLuceneQuery(filterOf(queryBar.state))) }); + traceSearchRunner.runQueries(); + }; + if (attributesSidebar.state.selected.length > 0) { + applyColumns(); + } + const sub = attributesSidebar.subscribeToState((newState, prevState) => { + if (newState.selected.join(',') !== prevState.selected.join(',')) { + applyColumns(); + } + }); + return () => sub.unsubscribe(); + }); + + // Repoint every runner when the datasource picker changes. + dsControl.addActivationHandler(() => { + const sub = dsControl.subscribeToState(() => { + const ref = getTracesDatasource(); + allRunners.forEach((runner) => { + runner.setState({ datasource: ref }); + if (runner.isActive) { + runner.runQueries(); + } + }); + tracePeek.refreshDatasource(); + queryBar.forceRender(); + attributesSidebar.forceRender(); + }); + return () => sub.unsubscribe(); + }); + + const metricFocus = new MetricFocus({ metric: 'duration' }); + + const heatmapPanel = PanelBuilders.heatmap() + .setTitle('Duration') + .setDescription( + 'Span count by duration over time. Drag a rectangle to filter: width narrows the time range, height sets the duration filter.' + ) + .setData(heatmapRunner) + .setHeaderActions() + .setOption('calculate', false) + .setOption('yAxis', { unit: 'ms', decimals: 0 } as never) + .setOption('cellGap', 1) + .setOption('color', { scheme: 'Blues', steps: 24 } as never) + .setOption('legend', { show: false } as never) + .build(); + + const spanRatePanel = PanelBuilders.timeseries() + .setTitle('Span rate') + .setData(spanRateRunner) + .setHeaderActions() + .setCustomFieldConfig('drawStyle', 'bars' as never) + .setCustomFieldConfig('fillOpacity', 100) + .setCustomFieldConfig('lineWidth', 0) + .setColor({ mode: 'fixed', fixedColor: 'green' }) + .setOption('legend', { showLegend: false } as never) + .build(); + + const errorRatePanel = PanelBuilders.timeseries() + .setTitle('Error rate') + .setData(errorRateRunner) + .setHeaderActions() + .setCustomFieldConfig('drawStyle', 'bars' as never) + .setCustomFieldConfig('fillOpacity', 100) + .setCustomFieldConfig('lineWidth', 0) + .setColor({ mode: 'fixed', fixedColor: 'red' }) + .setOption('legend', { showLegend: false } as never) + .build(); + + // Drag-to-filter overlay on the heatmap: x = time range, y = span duration. + const heatmapSelect = new HeatmapSelect({ panel: heatmapPanel }); + heatmapSelect.onSelect = (selection: HeatmapSelection) => { + if (!selection.durationOnly) { + const timeRange = sceneGraph.getTimeRange(heatmapSelect); + const { from, to } = timeRange.state.value; + const span = to.valueOf() - from.valueOf(); + const newFrom = dateTime(from.valueOf() + selection.fx0 * span); + const newTo = dateTime(from.valueOf() + selection.fx1 * span); + timeRange.onTimeRangeChange({ from: newFrom, to: newTo, raw: { from: newFrom, to: newTo } }); + } + if (!selection.timeOnly) { + const bucketCount = HEATMAP_BUCKET_UPPER_MS.length; + // Rows render top-down from the largest bucket to the smallest. + const topRow = clamp(Math.floor(selection.fyTop * bucketCount), 0, bucketCount - 1); + const bottomRow = clamp(Math.ceil(selection.fyBottom * bucketCount) - 1, 0, bucketCount - 1); + const upperIndex = bucketCount - 1 - topRow; + const lowerIndex = bucketCount - 1 - bottomRow; + const durationMax = upperIndex >= bucketCount - 1 ? '' : String(HEATMAP_BUCKET_UPPER_MS[upperIndex]); + const durationMin = lowerIndex <= 0 ? '' : String(HEATMAP_BUCKET_LOWER_MS[lowerIndex]); + queryBar.onApply({ ...filterOf(queryBar.state), durationMin, durationMax }); + } + }; + + // Focused metric renders large on the left (2/3), the other two stack beside it. + const gridItems: Record = { + duration: new SceneCSSGridItem({ body: heatmapSelect }), + spans: new SceneCSSGridItem({ body: spanRatePanel }), + errors: new SceneCSSGridItem({ body: errorRatePanel }), + }; + + const applyFocus = (metric: MetricKey) => { + const side = METRIC_KEYS.filter((key) => key !== metric); + gridItems[metric].setState({ gridColumn: '1', gridRow: `1 / span ${side.length}` }); + side.forEach((key, index) => { + gridItems[key].setState({ gridColumn: '2', gridRow: `${index + 1}` }); + }); + }; + applyFocus(metricFocus.state.metric); + + metricFocus.addActivationHandler(() => { + applyFocus(metricFocus.state.metric); + const sub = metricFocus.subscribeToState((newState) => applyFocus(newState.metric)); + return () => sub.unsubscribe(); + }); + + const metricsGrid = new SceneCSSGridLayout({ + templateColumns: 'minmax(0, 2fr) minmax(0, 1fr)', + templateRows: `repeat(${METRIC_KEYS.length - 1}, minmax(0, 1fr))`, + rowGap: 1, + columnGap: 1, + children: METRIC_KEYS.map((key) => gridItems[key]), + }); + + const traceSearchData = new SceneDataTransformer({ + $data: traceSearchRunner, + transformations: [attributeColumnsTransform(() => attributesSidebar.state.selected)], + }); + + const tracesPanel = PanelBuilders.table() + .setTitle('Traces') + .setDescription( + 'Trace summaries matching the current filters, most recent first (or slowest first with the Slowest pill, applied server-side). Click a trace ID to open the trace viewer. Extra columns come from the attributes sidebar.' + ) + .setData(traceSearchData) + .setOverrides((builder) => + builder.matchFieldsWithName('traceID').overrideLinks([ + { + title: 'Open in trace viewer', + url: `${PLUGIN_BASE_URL}/${ROUTES.Trace}\${__url.params:exclude:traceId,query,durationMin,durationMax,peek,peekTab}&traceId=\${__value.text}`, + }, + { + title: 'Peek trace', + url: `${PLUGIN_BASE_URL}/${ROUTES.Explorer}\${__url.params:exclude:peek,peekTab}&peek=\${__value.text}`, + }, + { + title: 'Peek logs', + url: `${PLUGIN_BASE_URL}/${ROUTES.Explorer}\${__url.params:exclude:peek,peekTab}&peek=\${__value.text}&peekTab=logs`, + }, + ]) + ) + .build(); + + // The sort pills re-run the trace search with server-side ordering + // (URL restore included). + tableSort.addActivationHandler(() => { + const apply = () => { + traceSearchRunner.setState({ queries: traceSearchQueries(buildLuceneQuery(filterOf(queryBar.state))) }); + traceSearchRunner.runQueries(); + }; + if (tableSort.state.sort) { + apply(); + } + const sub = tableSort.subscribeToState((newState, prevState) => { + if (newState.sort !== prevState.sort) { + apply(); + } + }); + return () => sub.unsubscribe(); + }); + + return new EmbeddedScene({ + $behaviors: [zoomOutHotkeyBehavior], + body: new SceneFlexLayout({ + direction: 'column', + children: [ + new SceneFlexItem({ ySizing: 'content', body: queryBar }), + new SceneFlexItem({ height: 280, body: metricsGrid }), + new SceneFlexLayout({ + direction: 'row', + children: [ + new SceneFlexItem({ width: 340, body: attributesSidebar }), + new SceneFlexItem({ minHeight: 320, body: tracesPanel }), + ], + }), + ], + }), + controls: [ + new ExplorerTabs({ active: 'explorer' }), + dsControl, + metricFocus, + tracePeek, + new SceneControlsSpacer(), + new SceneTimePicker({ isOnCanvas: true }), + new SceneRefreshPicker({ isOnCanvas: true }), + ], + }); +} diff --git a/src/app/pages/TraceExplorer/traceExplorerPage.ts b/src/app/pages/TraceExplorer/traceExplorerPage.ts new file mode 100644 index 0000000..455880c --- /dev/null +++ b/src/app/pages/TraceExplorer/traceExplorerPage.ts @@ -0,0 +1,36 @@ +import { PageLayoutType } from '@grafana/data'; +import { SceneAppPage, SceneTimeRange } from '@grafana/scenes'; +import { ROUTES } from '../../constants'; +import { prefixRoute } from '../../utils/utils.routing'; +import { breakdownScene } from './breakdownScene'; +import { spanExplorerScene } from './spanExplorerScene'; +import { traceViewerScene } from './traceViewerScene'; + +// All pages use a custom layout (no page header) — the scenes render their own +// compact toolbar with the page switcher inline with the time picker. +export const traceViewerPage = new SceneAppPage({ + title: 'Trace viewer', + layout: PageLayoutType.Custom, + $timeRange: new SceneTimeRange({ from: 'now-15m', to: 'now' }), + url: prefixRoute(ROUTES.Trace), + routePath: ROUTES.Trace, + getScene: traceViewerScene, +}); + +export const breakdownPage = new SceneAppPage({ + title: 'Breakdown', + layout: PageLayoutType.Custom, + $timeRange: new SceneTimeRange({ from: 'now-15m', to: 'now' }), + url: prefixRoute(ROUTES.Breakdown), + routePath: ROUTES.Breakdown, + getScene: breakdownScene, +}); + +export const spanExplorerPage = new SceneAppPage({ + title: 'Span explorer', + layout: PageLayoutType.Custom, + $timeRange: new SceneTimeRange({ from: 'now-15m', to: 'now' }), + url: prefixRoute(ROUTES.Explorer), + routePath: ROUTES.Explorer, + getScene: spanExplorerScene, +}); diff --git a/src/app/pages/TraceExplorer/traceViewerScene.tsx b/src/app/pages/TraceExplorer/traceViewerScene.tsx new file mode 100644 index 0000000..9b60ff7 --- /dev/null +++ b/src/app/pages/TraceExplorer/traceViewerScene.tsx @@ -0,0 +1,132 @@ +import React from 'react'; +import { + EmbeddedScene, + PanelBuilders, + SceneControlsSpacer, + SceneFlexItem, + SceneFlexLayout, + SceneQueryRunner, + SceneRefreshPicker, + SceneTimePicker, +} from '@grafana/scenes'; +import { getLogsDatasource, getTracesDatasource } from '../../utils/utils.datasource'; +import { DatasourceControl } from './DatasourceControl'; +import { ExplorerTabs } from './ExplorerTabs'; +import { LogsFilter, LogsFilterControls } from './SpanFilter'; +import { SpanLogsLink } from './SpanLogsLink'; +import { TraceHeader } from './TraceHeader'; +import { TraceIdBar } from './TraceIdBar'; +import { zoomOutHotkeyBehavior } from './zoomOutBehavior'; +import { traceLogsQuery, traceLookupQuery } from './queries'; + +// Approximate vertical chrome above the waterfall/logs row (top nav, toolbar, +// trace ID bar, trace header, paddings) — the row fills the rest of the viewport. +const CHROME_HEIGHT_PX = 240; + +export function traceViewerScene() { + const traceRunner = new SceneQueryRunner({ + datasource: getTracesDatasource(), + queries: [traceLookupQuery('')], + }); + const logsRunner = new SceneQueryRunner({ + datasource: getLogsDatasource(), + queries: [traceLogsQuery('')], + }); + + const traceIdBar = new TraceIdBar({ traceId: '' }); + const logsFilter = new LogsFilter({ spanId: '', text: '' }); + const dsControl = new DatasourceControl(); + + const applyQueries = () => { + const { traceId } = traceIdBar.state; + const { spanId, text } = logsFilter.state; + traceRunner.setState({ datasource: getTracesDatasource(), queries: [traceLookupQuery(traceId)] }); + logsRunner.setState({ datasource: getLogsDatasource(), queries: [traceLogsQuery(traceId, spanId, text)] }); + traceRunner.runQueries(); + logsRunner.runQueries(); + }; + + traceIdBar.addActivationHandler(() => { + // The URL may have populated the trace ID before activation (deep link). + if (traceIdBar.state.traceId) { + applyQueries(); + } + const sub = traceIdBar.subscribeToState((newState, prevState) => { + if (newState.traceId !== prevState.traceId) { + // A new trace invalidates the log filters. + logsFilter.clear(); + applyQueries(); + } + }); + return () => sub.unsubscribe(); + }); + + logsFilter.addActivationHandler(() => { + const sub = logsFilter.subscribeToState((newState, prevState) => { + if (newState.spanId !== prevState.spanId || newState.text !== prevState.text) { + logsRunner.setState({ + queries: [traceLogsQuery(traceIdBar.state.traceId, newState.spanId, newState.text)], + }); + logsRunner.runQueries(); + } + }); + return () => sub.unsubscribe(); + }); + + dsControl.addActivationHandler(() => { + const sub = dsControl.subscribeToState(() => applyQueries()); + return () => sub.unsubscribe(); + }); + + const traceHeader = new TraceHeader({ $data: traceRunner }); + + const waterfallPanel = PanelBuilders.traces() + .setTitle('Waterfall') + .setDescription('Click a span’s log icon to filter the trace logs to that span.') + .setData(traceRunner) + .build(); + + // Clicking a span's "Logs for span" icon filters the in-app logs panel. + const spanLogsLink = new SpanLogsLink({ panel: waterfallPanel }); + spanLogsLink.onSelectSpan = (spanId) => logsFilter.onChangeSpan(spanId); + + const logsPanel = PanelBuilders.logs() + .setTitle('Trace logs') + .setDescription( + 'Log lines sharing this trace ID, interleaved by time. Click a line for its fields; scroll to load more.' + ) + .setData(logsRunner) + .setHeaderActions() + .setOption('showTime', true) + .setOption('wrapLogMessage', true) + .setOption('enableLogDetails', true) + .setOption('enableInfiniteScrolling' as never, true as never) + .build(); + + return new EmbeddedScene({ + $behaviors: [zoomOutHotkeyBehavior], + body: new SceneFlexLayout({ + direction: 'column', + children: [ + new SceneFlexItem({ ySizing: 'content', body: traceIdBar }), + new SceneFlexItem({ ySizing: 'content', body: traceHeader }), + new SceneFlexLayout({ + direction: 'row', + minHeight: `calc(100vh - ${CHROME_HEIGHT_PX}px)`, + children: [ + new SceneFlexItem({ body: spanLogsLink }), + new SceneFlexItem({ width: '42%', body: logsPanel }), + ], + }), + ], + }), + controls: [ + new ExplorerTabs({ active: 'trace' }), + dsControl, + logsFilter, + new SceneControlsSpacer(), + new SceneTimePicker({ isOnCanvas: true }), + new SceneRefreshPicker({ isOnCanvas: true }), + ], + }); +} diff --git a/src/app/pages/TraceExplorer/useQuickwitAutocomplete.ts b/src/app/pages/TraceExplorer/useQuickwitAutocomplete.ts new file mode 100644 index 0000000..405d381 --- /dev/null +++ b/src/app/pages/TraceExplorer/useQuickwitAutocomplete.ts @@ -0,0 +1,79 @@ +import { useCallback, useEffect, useState } from 'react'; +import { DataSourceApi, MetricFindValue, TimeRange } from '@grafana/data'; +import { getDataSourceSrv } from '@grafana/runtime'; +import { Suggestion } from '@/components/LuceneQueryEditor'; + +// Quickwit datasource instance methods used for autocomplete. Same contract as +// the datasource's own query editor (datasource/utils.ts useDatasourceFields). +export type QuickwitDatasource = DataSourceApi & { + getTagKeys: (options: { searchable: boolean; timeRange: TimeRange }) => Promise; + getTagValues: (options: { key: string; timeRange: TimeRange }) => Promise; +}; + +/** Resolves the datasource instance and its searchable fields for a time range. */ +export function useQuickwitFields(datasourceUid: string | undefined, range: TimeRange) { + const [datasource, setDatasource] = useState(); + const [fields, setFields] = useState([]); + + useEffect(() => { + if (!datasourceUid) { + return; + } + getDataSourceSrv() + .get(datasourceUid) + .then((ds) => setDatasource(ds as QuickwitDatasource)) + .catch(() => setDatasource(undefined)); + }, [datasourceUid]); + + // Refresh the field list at minute granularity, like the datasource editor. + const fromMinute = range.from.startOf('minute').valueOf(); + const toMinute = range.to.startOf('minute').valueOf(); + + useEffect(() => { + if (!datasource?.getTagKeys) { + return; + } + datasource + .getTagKeys({ searchable: true, timeRange: range }) + .then(setFields) + .catch(() => setFields([])); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [datasource, fromMinute, toMinute]); + + return { datasource, fields }; +} + +export function useQuickwitAutocomplete(datasourceUid: string | undefined, range: TimeRange) { + const { datasource, fields } = useQuickwitFields(datasourceUid, range); + + const getSuggestions = useCallback( + async (word: string): Promise => { + let suggestions: Suggestion = { from: 0, options: [] }; + if (!datasource) { + return suggestions; + } + + const wordIsField = word.match(/([^:\s]+):"?([^"\s]*)"?/); + if (wordIsField?.length) { + const [, fieldName] = wordIsField; + const candidateValues = await datasource.getTagValues({ key: fieldName, timeRange: range }); + suggestions.from = fieldName.length + 1; // Replace only the value part + suggestions.options = candidateValues.map((v) => ({ + type: 'text', + label: typeof v.text === 'number' ? `${v.text}` : `"${v.text}"`, + })); + } else { + suggestions.from = 0; + suggestions.options = fields.map((f) => ({ + type: 'variable', + label: f.text, + detail: f.value !== undefined ? `${f.value}` : '', + })); + } + return suggestions; + }, + [datasource, fields, range] + ); + + return { getSuggestions }; +} diff --git a/src/app/pages/TraceExplorer/zoomOutBehavior.ts b/src/app/pages/TraceExplorer/zoomOutBehavior.ts new file mode 100644 index 0000000..a9a186d --- /dev/null +++ b/src/app/pages/TraceExplorer/zoomOutBehavior.ts @@ -0,0 +1,34 @@ +import { dateTime } from '@grafana/data'; +import { sceneGraph, SceneObject } from '@grafana/scenes'; + +function isTypingTarget(target: EventTarget | null): boolean { + const element = target as HTMLElement | null; + if (!element) { + return false; + } + return element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.isContentEditable; +} + +/** + * Scene behavior: ctrl+z / cmd+z zooms the time range out (2×, centered), + * matching Grafana's dashboard hotkey. Ignored while typing in an input or + * the query editor. + */ +export function zoomOutHotkeyBehavior(scene: SceneObject) { + const onKeyDown = (event: KeyboardEvent) => { + if (!(event.ctrlKey || event.metaKey) || event.key.toLowerCase() !== 'z' || isTypingTarget(event.target)) { + return; + } + event.preventDefault(); + const timeRange = sceneGraph.getTimeRange(scene); + const { from, to } = timeRange.state.value; + const span = to.valueOf() - from.valueOf(); + const center = (to.valueOf() + from.valueOf()) / 2; + const newFrom = dateTime(center - span); + const newTo = dateTime(center + span); + timeRange.onTimeRangeChange({ from: newFrom, to: newTo, raw: { from: newFrom, to: newTo } }); + }; + + window.addEventListener('keydown', onKeyDown); + return () => window.removeEventListener('keydown', onKeyDown); +} diff --git a/src/app/utils/favorites.ts b/src/app/utils/favorites.ts new file mode 100644 index 0000000..bbe0d61 --- /dev/null +++ b/src/app/utils/favorites.ts @@ -0,0 +1,57 @@ +import { useEffect, useState } from 'react'; + +const STORAGE_KEY = 'quickwit-quickwit-app.favoriteAttributes'; + +/** Starting set until the user edits their favorites (then localStorage wins). */ +export const DEFAULT_FAVORITE_ATTRIBUTES = [ + 'service_name', + 'span_name', + 'resource_attributes.k8s.cluster.name', + 'resource_attributes.k8s.namespace.name', + 'resource_attributes.k8s.node.name', + 'resource_attributes.k8s.pod.name', + 'resource_attributes.k8s.container.name', + 'resource_attributes.service.version', +]; + +type Listener = (favorites: string[]) => void; +const listeners = new Set(); + +export function getFavoriteAttributes(): string[] { + try { + const raw = window.localStorage.getItem(STORAGE_KEY); + if (raw) { + const parsed = JSON.parse(raw); + if (Array.isArray(parsed)) { + return parsed.map(String); + } + } + } catch { + // Fall through to defaults on quota/parse errors. + } + return DEFAULT_FAVORITE_ATTRIBUTES; +} + +export function toggleFavoriteAttribute(attribute: string): string[] { + const current = getFavoriteAttributes(); + const next = current.includes(attribute) ? current.filter((a) => a !== attribute) : [...current, attribute]; + try { + window.localStorage.setItem(STORAGE_KEY, JSON.stringify(next)); + } catch { + // Persisting is best-effort; the in-memory state still updates below. + } + listeners.forEach((listener) => listener(next)); + return next; +} + +/** Favorite attributes, shared live between the span explorer and breakdown views. */ +export function useFavoriteAttributes(): string[] { + const [favorites, setFavorites] = useState(getFavoriteAttributes); + useEffect(() => { + listeners.add(setFavorites); + return () => { + listeners.delete(setFavorites); + }; + }, []); + return favorites; +} diff --git a/src/app/utils/utils.datasource.ts b/src/app/utils/utils.datasource.ts new file mode 100644 index 0000000..8c4f130 --- /dev/null +++ b/src/app/utils/utils.datasource.ts @@ -0,0 +1,74 @@ +import { DataSourceInstanceSettings } from '@grafana/data'; +import { config } from '@grafana/runtime'; +import { DataSourceRef } from '@grafana/schema'; +import { QUICKWIT_DS_TYPE } from '../constants'; + +export type TraceExplorerSettings = { + tracesDatasourceUid?: string; + logsDatasourceUid?: string; +}; + +// Populated from the app plugin meta (jsonData) before any scene activates. +let settings: TraceExplorerSettings = {}; + +// Session override from the toolbar datasource picker (URL-synced per scene). +let tracesOverrideUid: string | undefined; + +export function setTraceExplorerSettings(newSettings?: TraceExplorerSettings) { + settings = newSettings ?? {}; +} + +export function setTracesDatasourceOverride(uid: string | undefined) { + tracesOverrideUid = uid; +} + +export function quickwitDatasources(): DataSourceInstanceSettings[] { + return Object.values(config.datasources).filter((ds) => ds.type === QUICKWIT_DS_TYPE); +} + +function findByUid(uid: string | undefined): DataSourceInstanceSettings | undefined { + return uid ? quickwitDatasources().find((ds) => ds.uid === uid) : undefined; +} + +function findByHint(hint: RegExp): DataSourceInstanceSettings | undefined { + const candidates = quickwitDatasources(); + const index = (ds: DataSourceInstanceSettings) => (ds.jsonData as { index?: string })?.index ?? ''; + return candidates.find((ds) => hint.test(`${ds.name} ${index(ds)}`)) ?? candidates[0]; +} + +/** Grafana's default datasource, when it is a Quickwit one. */ +function grafanaDefaultQuickwit(): DataSourceInstanceSettings | undefined { + const byFlag = quickwitDatasources().find((ds) => ds.isDefault); + if (byFlag) { + return byFlag; + } + const byName = config.datasources[config.defaultDatasource]; + return byName?.type === QUICKWIT_DS_TYPE ? byName : undefined; +} + +function toRef(ds: DataSourceInstanceSettings | undefined): DataSourceRef | undefined { + return ds ? { uid: ds.uid, type: ds.type } : undefined; +} + +export function getTracesDatasource(): DataSourceRef | undefined { + // Grafana's default datasource (when it is a Quickwit one) wins over the + // app-config default, so the app follows whatever "Default" is set on the + // datasource settings page. + return toRef( + findByUid(tracesOverrideUid) ?? + grafanaDefaultQuickwit() ?? + findByUid(settings.tracesDatasourceUid) ?? + findByHint(/trace/i) + ); +} + +/** + * Logs datasource associated with the active traces datasource: the traces + * datasource's own `logsDatasourceUid` pairing wins, then the app-level + * default stored in the plugin settings, then a name/index heuristic. + */ +export function getLogsDatasource(): DataSourceRef | undefined { + const traces = findByUid(getTracesDatasource()?.uid); + const pairedUid = (traces?.jsonData as { logsDatasourceUid?: string })?.logsDatasourceUid; + return toRef(findByUid(pairedUid) ?? findByUid(settings.logsDatasourceUid) ?? findByHint(/log/i)); +} diff --git a/src/app/utils/utils.plugin.ts b/src/app/utils/utils.plugin.ts new file mode 100644 index 0000000..2687f4b --- /dev/null +++ b/src/app/utils/utils.plugin.ts @@ -0,0 +1,17 @@ +import React, { useContext } from 'react'; +import { AppRootProps } from '@grafana/data'; + +// This is used to be able to retrieve the root plugin props anywhere inside the app. +export const PluginPropsContext = React.createContext(null); + +export const usePluginProps = () => { + const pluginProps = useContext(PluginPropsContext); + + return pluginProps; +}; + +export const usePluginMeta = () => { + const pluginProps = usePluginProps(); + + return pluginProps?.meta; +}; diff --git a/src/app/utils/utils.routing.ts b/src/app/utils/utils.routing.ts new file mode 100644 index 0000000..b9e4c99 --- /dev/null +++ b/src/app/utils/utils.routing.ts @@ -0,0 +1,6 @@ +import { PLUGIN_BASE_URL } from '../constants'; + +// Prefixes the route with the base URL of the plugin +export function prefixRoute(route: string): string { + return `${PLUGIN_BASE_URL}/${route}`; +} diff --git a/src/components/LuceneQueryEditor.tsx b/src/components/LuceneQueryEditor.tsx index cc1a938..3b5daf4 100644 --- a/src/components/LuceneQueryEditor.tsx +++ b/src/components/LuceneQueryEditor.tsx @@ -6,8 +6,13 @@ import CodeMirror, { Prec, ReactCodeMirrorRef } from '@uiw/react-codemirror'; import { keymap } from '@codemirror/view'; import { linter, Diagnostic, lintGutter } from "@codemirror/lint" import { autocompletion, CompletionContext, startCompletion } from "@codemirror/autocomplete" +import { useTheme2 } from '@grafana/ui'; import { LuceneQuery } from "@/utils/lucene"; +export interface Suggestion { + from: number; + options: Array<{ type: string; label: string; detail?: string }>; +} export type LuceneQueryEditorProps = { placeholder?: string, @@ -19,6 +24,7 @@ export type LuceneQueryEditorProps = { export function LuceneQueryEditor(props: LuceneQueryEditorProps){ const editorRef = useRef(null) + const theme = useTheme2() const queryLinter = linter( view => { let diagnostics: Diagnostic[] = []; @@ -78,7 +84,7 @@ export function LuceneQueryEditor(props: LuceneQueryEditorProps){ ref={editorRef} className={css`height:100%`} // XXX : need to set height for both wrapper elements height="100%" - theme={'dark'} + theme={theme.isDark ? 'dark' : 'light'} placeholder={props.placeholder} value={props.value} onChange={props.onChange} diff --git a/src/datasource/supplementaryQueries.ts b/src/datasource/supplementaryQueries.ts index 43e0866..1a410e6 100644 --- a/src/datasource/supplementaryQueries.ts +++ b/src/datasource/supplementaryQueries.ts @@ -8,6 +8,12 @@ import { BucketAggregation, ElasticsearchQuery } from '@/types'; import { BaseQuickwitDataSourceConstructor } from './base'; export const REF_ID_STARTER_LOG_VOLUME = 'log-volume-'; +export const REF_ID_STARTER_LOG_SAMPLE = 'log-sample-'; + +const DEFAULT_LOG_SAMPLE_LIMIT = 50; + +// Metric types whose queries already return documents — a log sample adds nothing. +const DOCUMENT_METRIC_TYPES = ['logs', 'raw_data', 'raw_document', 'trace_search', 'traces']; export function withSupplementaryQueries ( Base: T ){ return class DSWithSupplementaryQueries extends Base implements DataSourceWithSupplementaryQueriesSupport { @@ -23,6 +29,8 @@ export function withSupplementaryQueries agg.type === 'date_histogram') + ); + if (!isQuerySuitable) { + return undefined; + } + + return { + refId: `${REF_ID_STARTER_LOG_SAMPLE}${query.refId}`, + query: query.query, + metrics: [ + { type: 'logs', id: '1', settings: { limit: String(options.limit ?? DEFAULT_LOG_SAMPLE_LIMIT) } }, + ], + filters: query.filters, + }; + } + default: return undefined; } @@ -106,5 +137,20 @@ export function withSupplementaryQueries + ): DataQueryRequest | undefined { + const logsSampleRequest = cloneDeep(request); + const targets = logsSampleRequest.targets + .map((target) => this.getSupplementaryQuery({ type: SupplementaryQueryType.LogsSample }, target)) + .filter((query): query is ElasticsearchQuery => !!query); + + if (!targets.length) { + return undefined; + } + + return { ...logsSampleRequest, targets }; + } }; } diff --git a/src/datasources/quickwit/img/logo.svg b/src/datasources/quickwit/img/logo.svg new file mode 100644 index 0000000..f8f81a9 --- /dev/null +++ b/src/datasources/quickwit/img/logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/datasources/quickwit/module.ts b/src/datasources/quickwit/module.ts new file mode 100644 index 0000000..b5ca7b6 --- /dev/null +++ b/src/datasources/quickwit/module.ts @@ -0,0 +1,12 @@ +import { DataSourcePlugin } from '@grafana/data'; +import { QuickwitDataSource } from '@/datasource'; +import { ConfigEditor } from '@/configuration/ConfigEditor'; +import { QueryEditor } from '@/components/QueryEditor'; +import { ElasticsearchQuery } from '@/types'; +import { QuickwitOptions } from '@/quickwit'; + +export const plugin = new DataSourcePlugin, ElasticsearchQuery, QuickwitOptions>( + QuickwitDataSource +) + .setConfigEditor(ConfigEditor) + .setQueryEditor(QueryEditor); diff --git a/src/datasources/quickwit/plugin.json b/src/datasources/quickwit/plugin.json new file mode 100644 index 0000000..fcaa091 --- /dev/null +++ b/src/datasources/quickwit/plugin.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://raw.githubusercontent.com/grafana/grafana/master/docs/sources/developers/plugins/plugin.schema.json", + "type": "datasource", + "name": "Quickwit", + "id": "quickwit-quickwit-datasource", + "metrics": true, + "backend": true, + "alerting": true, + "annotations": true, + "logs": true, + "tracing": true, + "executable": "gpx_quickwit", + "category": "logging", + "info": { + "description": "Quickwit is an OSS, Cloud-Native search engine on object storage. This plugin allows you to visualize logs, traces, and build dashboards on top of Quickwit.", + "author": { + "name": "Quickwit", + "url": "https://quickwit.io" + }, + "keywords": ["datasource", "logs", "traces", "log management", "log observability", "log analytics", "quickwit"], + "logos": { + "small": "img/logo.svg", + "large": "img/logo.svg" + }, + "links": [ + { + "name": "GitHub", + "url": "https://github.com/quickwit-oss/quickwit-datasource" + }, + { + "name": "License", + "url": "https://github.com/quickwit-oss/quickwit-datasource/blob/main/LICENSE" + }, + { + "name": "Website", + "url": "https://quickwit.io" + } + ], + "screenshots": [], + "version": "%VERSION%", + "updated": "%TODAY%" + }, + "dependencies": { + "grafanaDependency": ">=12", + "plugins": [] + } +} diff --git a/src/module.ts b/src/module.ts deleted file mode 100644 index 7e2c7a3..0000000 --- a/src/module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { DataSourcePlugin } from '@grafana/data'; -import { QuickwitDataSource} from './datasource'; -import { ConfigEditor } from './configuration/ConfigEditor'; -import { QueryEditor } from './components/QueryEditor'; -import { ElasticsearchQuery } from 'types'; -import { QuickwitOptions } from 'quickwit'; - -export const plugin = new DataSourcePlugin, ElasticsearchQuery, QuickwitOptions>(QuickwitDataSource) - .setConfigEditor(ConfigEditor) - .setQueryEditor(QueryEditor); diff --git a/src/module.tsx b/src/module.tsx new file mode 100644 index 0000000..3cb13c4 --- /dev/null +++ b/src/module.tsx @@ -0,0 +1,26 @@ +import React, { Suspense, lazy } from 'react'; +import { AppPlugin, type AppRootProps } from '@grafana/data'; +import { LoadingPlaceholder } from '@grafana/ui'; +import type { AppConfigProps } from './app/components/AppConfig/AppConfig'; + +const LazyApp = lazy(() => import('./app/components/App/App')); +const LazyAppConfig = lazy(() => import('./app/components/AppConfig/AppConfig')); + +const App = (props: AppRootProps) => ( + }> + + +); + +const AppConfig = (props: AppConfigProps) => ( + }> + + +); + +export const plugin = new AppPlugin<{}>().setRootPage(App).addConfigPage({ + title: 'Configuration', + icon: 'cog', + body: AppConfig, + id: 'configuration', +}); diff --git a/src/plugin.json b/src/plugin.json index ed56cb0..25fdab7 100644 --- a/src/plugin.json +++ b/src/plugin.json @@ -1,23 +1,15 @@ { "$schema": "https://raw.githubusercontent.com/grafana/grafana/master/docs/sources/developers/plugins/plugin.schema.json", - "type": "datasource", + "type": "app", "name": "Quickwit", - "id": "quickwit-quickwit-datasource", - "metrics": true, - "backend": true, - "alerting": true, - "annotations": true, - "logs": true, - "tracing": true, - "executable": "gpx_quickwit", - "category": "logging", + "id": "quickwit-quickwit-app", "info": { - "description": "Quickwit is an OSS, Cloud-Native search engine on object storage. This plugin allows you to visualize logs, traces, and build dashboards on top of Quickwit.", + "description": "Quickwit for Grafana: datasource for logs, traces and metrics, plus a trace explorer app.", "author": { "name": "Quickwit", "url": "https://quickwit.io" }, - "keywords": ["datasource", "logs", "traces", "log management", "log observability", "log analytics", "quickwit"], + "keywords": ["app", "datasource", "quickwit", "logs", "traces", "log management", "observability"], "logos": { "small": "img/logo.svg", "large": "img/logo.svg" @@ -36,29 +28,35 @@ "url": "https://quickwit.io" } ], - "screenshots": [ - { - "name": "Log Explorer", - "path": "img/screenshot-explorer-view.png" - }, - { - "name": "Log Explorer with query", - "path": "img/screenshot-explorer-view-with-query.png" - }, - { - "name": "Log Explorer with raw query", - "path": "img/screenshot-explorer-view-with-raw-query.png" - }, - { - "name": "Dashboard", - "path": "img/screenshot-dashboard-view.png" - } - ], + "screenshots": [], "version": "%VERSION%", "updated": "%TODAY%" }, + "includes": [ + { + "type": "page", + "name": "Span explorer", + "path": "/a/%PLUGIN_ID%/explorer", + "addToNav": true, + "defaultNav": true + }, + { + "type": "page", + "name": "Breakdown", + "path": "/a/%PLUGIN_ID%/explorer/breakdown", + "addToNav": true, + "defaultNav": false + }, + { + "type": "page", + "name": "Trace viewer", + "path": "/a/%PLUGIN_ID%/explorer/trace", + "addToNav": true, + "defaultNav": false + } + ], "dependencies": { - "grafanaDependency": ">=12", + "grafanaDependency": ">=12.3.0", "plugins": [] } } diff --git a/webpack.config.ts b/webpack.config.ts new file mode 100644 index 0000000..f6827b3 --- /dev/null +++ b/webpack.config.ts @@ -0,0 +1,33 @@ +import ReplaceInFileWebpackPlugin from 'replace-in-file-webpack-plugin'; +import type { Configuration } from 'webpack'; + +import { getPackageJson } from './.config/webpack/utils'; +import grafanaConfig from './.config/webpack/webpack.config'; + +/** + * Extends the scaffolded config: the base ReplaceInFileWebpackPlugin only + * templates dist/plugin.json, so add the same %VERSION%/%TODAY%/%PLUGIN_ID% + * replacement for the nested datasource plugin manifest. + */ +const config = async (env: Record): Promise => { + const baseConfig = await grafanaConfig(env); + + baseConfig.plugins = baseConfig.plugins ?? []; + baseConfig.plugins.push( + new ReplaceInFileWebpackPlugin([ + { + dir: 'dist/datasources/quickwit', + files: ['plugin.json'], + rules: [ + { search: /\%VERSION\%/g, replace: getPackageJson().version }, + { search: /\%TODAY\%/g, replace: new Date().toISOString().substring(0, 10) }, + { search: /\%PLUGIN_ID\%/g, replace: 'quickwit-quickwit-datasource' }, + ], + }, + ]) + ); + + return baseConfig; +}; + +export default config;