From f47300102cc4d279b7b2052a487ca1a1b26248e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 06:26:20 -0700 Subject: [PATCH 01/48] chore(deps): bump github/codeql-action from 4.35.4 to 4.35.5 (#40218) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c37f04e5173..ddfc5456c49 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,7 +41,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4 + uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -53,6 +53,6 @@ jobs: - name: Perform CodeQL Analysis if: steps.check.outputs.python || steps.check.outputs.frontend - uses: github/codeql-action/analyze@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4 + uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4 with: category: "/language:${{matrix.language}}" From 80a200820c91221b5dd98b408514ffb7c9444945 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 06:26:50 -0700 Subject: [PATCH 02/48] chore(deps): bump react-map-gl from 8.1.0 to 8.1.1 in /superset-frontend (#40217) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- superset-frontend/package-lock.json | 624 ++++++++---------- .../package.json | 2 +- 2 files changed, 289 insertions(+), 337 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 61bddb54fc3..d0120ffae1b 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -344,7 +344,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", - "dev": true, "license": "MIT" }, "node_modules/@ant-design/colors": { @@ -2998,6 +2997,20 @@ "react-dom": ">=16.3.0" } }, + "node_modules/@deck.gl/widgets": { + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.11.tgz", + "integrity": "sha512-90HWlQPsiRyTPWR4aYfLwnYDrJdHG2mqCzRcyMUKewWBNQLu4upB//l4ewIkUeXXCzAprjjVeRnNb7wdYj2CXQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "preact": "^10.17.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@luma.gl/core": "~9.2.6" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -9437,6 +9450,84 @@ "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==", "license": "MIT" }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "license": "MIT", + "peer": true + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "license": "MIT", + "peer": true + }, + "node_modules/@react-spring/web": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", + "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@reduxjs/toolkit": { "version": "1.9.7", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", @@ -11496,7 +11587,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-4.0.0.tgz", "integrity": "sha512-+dGZ1X2KqtwXaabVjTGxy0a3VzYfvYsWaRcuO8vMhyclHSOpGSI1+5cmlqzzCwQ3+fv0EjkTc7I5aV9lo08dYw==", - "deprecated": "\u26a0\ufe0f The 'jest-playwright-preset' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", + "deprecated": "⚠️ The 'jest-playwright-preset' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", "dev": true, "license": "MIT", "dependencies": { @@ -12397,7 +12488,7 @@ "version": "1.15.33", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.33.tgz", "integrity": "sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -12441,7 +12532,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12458,7 +12548,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12475,7 +12564,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -12492,7 +12580,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12509,7 +12596,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12526,7 +12612,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12543,7 +12628,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12560,7 +12644,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12577,7 +12660,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12594,7 +12676,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12611,7 +12692,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12628,7 +12708,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12642,7 +12721,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@swc/jest": { @@ -12687,7 +12766,7 @@ "version": "0.1.26", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.26.tgz", "integrity": "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -12697,7 +12776,6 @@ "version": "9.3.4", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", @@ -12717,7 +12795,6 @@ "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", @@ -12734,7 +12811,6 @@ "version": "6.9.1", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", @@ -12754,14 +12830,12 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, "license": "MIT" }, "node_modules/@testing-library/react": { "version": "14.3.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -12780,7 +12854,6 @@ "version": "12.8.3", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" @@ -12985,7 +13058,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { @@ -13300,6 +13372,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "license": "MIT", + "peer": true + }, "node_modules/@types/express": { "version": "4.17.25", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", @@ -13912,7 +13991,6 @@ "version": "5.5.11", "resolved": "https://registry.npmjs.org/@types/react-loadable/-/react-loadable-5.5.11.tgz", "integrity": "sha512-/tq2IJ853MoIFRBmqVOxnGsRRjER5TmEKzsZtaAkiXAWoDeKgR/QNOT1vd9k0p9h/F616X21cpNh3hu4RutzRQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/react": "*", @@ -13923,7 +14001,6 @@ "version": "4.41.40", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz", "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -13938,7 +14015,6 @@ "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" @@ -14020,7 +14096,6 @@ "version": "1.8.8", "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", - "dev": true, "license": "MIT", "dependencies": { "@types/react": "*" @@ -14134,7 +14209,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz", "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", - "dev": true, "license": "MIT" }, "node_modules/@types/stack-utils": { @@ -14157,14 +14231,12 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz", "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", - "dev": true, "license": "MIT" }, "node_modules/@types/tinycolor2": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", - "dev": true, "license": "MIT" }, "node_modules/@types/tough-cookie": { @@ -14185,7 +14257,6 @@ "version": "3.17.5", "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz", "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", - "dev": true, "license": "MIT", "dependencies": { "source-map": "^0.6.1" @@ -14195,7 +14266,6 @@ "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" @@ -14238,6 +14308,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/vinyl": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", + "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, "node_modules/@types/wait-on": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.4.tgz", @@ -14252,7 +14333,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -16171,6 +16251,29 @@ "node": "^16.13.0 || >=18.12.0" } }, + "node_modules/@yeoman/types": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.11.1.tgz", + "integrity": "sha512-27CI5hHQAHfq8ohYILmLNzClbdzBJzu+ny9AzUVV6naJO0l4/+t+67QDKlwQvt+TW3oE5j74I/Mh4Kn14rsVXA==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^16.13.0 || >=18.12.0" + }, + "peerDependencies": { + "@types/node": ">=16.18.26", + "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0", + "mem-fs": "^3.0.0 || ^4.0.0-beta.1" + }, + "peerDependenciesMeta": { + "@yeoman/adapter": { + "optional": true + }, + "mem-fs": { + "optional": true + } + } + }, "node_modules/@zarrita/storage": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@zarrita/storage/-/storage-0.2.0.tgz", @@ -16554,7 +16657,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -16610,7 +16712,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" @@ -20669,7 +20770,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, "license": "MIT" }, "node_modules/csscolorparser": { @@ -21299,7 +21399,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", @@ -21769,7 +21868,6 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, "license": "MIT" }, "node_modules/dom-align": { @@ -21867,6 +21965,7 @@ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz", "integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==", "license": "(MPL-2.0 OR Apache-2.0)", + "optional": true, "optionalDependencies": { "@types/trusted-types": "^2.0.7" } @@ -22411,7 +22510,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -23655,7 +23753,7 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz", "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==", - "deprecated": "\u26a0\ufe0f The 'expect-playwright' package is deprecated. The Playwright core assertions (via @playwright/test) now cover the same functionality. Please migrate to built-in expect. See https://playwright.dev/docs/test-assertions for migration.", + "deprecated": "⚠️ The 'expect-playwright' package is deprecated. The Playwright core assertions (via @playwright/test) now cover the same functionality. Please migrate to built-in expect. See https://playwright.dev/docs/test-assertions for migration.", "dev": true, "license": "MIT" }, @@ -24370,6 +24468,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/first-chunk-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-5.0.0.tgz", + "integrity": "sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -27157,7 +27268,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -27330,7 +27440,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -27998,6 +28107,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "license": "MIT", + "peer": true + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -30332,7 +30448,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.4.0.tgz", "integrity": "sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==", - "deprecated": "\u26a0\ufe0f The 'jest-process-manager' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", + "deprecated": "⚠️ The 'jest-process-manager' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", "dev": true, "license": "MIT", "dependencies": { @@ -31958,6 +32074,21 @@ } } }, + "node_modules/jsdom/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/jsdom/node_modules/css-tree": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -33620,7 +33751,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, "license": "MIT", "bin": { "lz-string": "bin/bin.js" @@ -34540,6 +34670,22 @@ "node": ">= 0.6" } }, + "node_modules/mem-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.4.tgz", + "integrity": "sha512-NlRHmUiEcxDHI7FeDlrrTZP5YFvnoS74wEf5OrQ7NAg83B2Rv3oF+FWr961I0rVdxkKbZMjq2BcV7VFWGFPkog==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": ">=18", + "@types/vinyl": "^2.0.12", + "vinyl": "^3.0.1", + "vinyl-file": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/memfs": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", @@ -36469,7 +36615,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -37886,7 +38031,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -39248,7 +39392,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.8" @@ -39911,6 +40054,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/preact": { + "version": "10.29.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", + "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -39983,7 +40137,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", @@ -39998,7 +40151,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -40011,7 +40163,6 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, "license": "MIT" }, "node_modules/pretty-ms": { @@ -41146,6 +41297,24 @@ "node": ">=0.10.0" } }, + "node_modules/react-ace": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-10.1.0.tgz", + "integrity": "sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ace-builds": "^1.4.14", + "diff-match-patch": "^1.0.5", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-arborist": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/react-arborist/-/react-arborist-3.6.1.tgz", @@ -42289,7 +42458,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, "license": "MIT", "dependencies": { "indent-string": "^4.0.0", @@ -42303,7 +42471,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, "license": "MIT", "dependencies": { "min-indent": "^1.0.0" @@ -44200,7 +44367,6 @@ "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 12" @@ -45035,6 +45201,39 @@ "node": ">=8" } }, + "node_modules/strip-bom-buf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-3.0.1.tgz", + "integrity": "sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-utf8": "^0.2.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-bom-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-5.0.0.tgz", + "integrity": "sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "first-chunk-stream": "^5.0.0", + "strip-bom-buf": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", @@ -46934,7 +47133,6 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -47938,6 +48136,25 @@ "node": ">=10.13.0" } }, + "node_modules/vinyl-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-5.0.0.tgz", + "integrity": "sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/vinyl": "^2.0.7", + "strip-bom-buf": "^3.0.1", + "strip-bom-stream": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", @@ -48914,6 +49131,21 @@ } } }, + "node_modules/whatwg-url/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/whatwg-url/node_modules/webidl-conversions": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", @@ -54625,7 +54857,7 @@ "@math.gl/web-mercator": "^4.1.0", "mapbox-gl": "^3.23.1", "maplibre-gl": "^5.24.0", - "react-map-gl": "^8.1.1", + "react-map-gl": "^8.1.0", "supercluster": "^8.0.1" }, "peerDependencies": { @@ -54842,286 +55074,6 @@ "version": "1.0.0", "extraneous": true, "license": "Apache-2.0" - }, - "node_modules/@deck.gl/widgets": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.11.tgz", - "integrity": "sha512-90HWlQPsiRyTPWR4aYfLwnYDrJdHG2mqCzRcyMUKewWBNQLu4upB//l4ewIkUeXXCzAprjjVeRnNb7wdYj2CXQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "preact": "^10.17.0" - }, - "peerDependencies": { - "@deck.gl/core": "~9.2.0", - "@luma.gl/core": "~9.2.6" - } - }, - "node_modules/@react-spring/animated": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", - "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", - "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", - "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-spring/shared": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", - "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/rafz": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", - "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-spring/web": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", - "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@types/expect": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", - "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/vinyl": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", - "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/expect": "^1.20.4", - "@types/node": "*" - } - }, - "node_modules/@yeoman/types": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.11.1.tgz", - "integrity": "sha512-27CI5hHQAHfq8ohYILmLNzClbdzBJzu+ny9AzUVV6naJO0l4/+t+67QDKlwQvt+TW3oE5j74I/Mh4Kn14rsVXA==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^16.13.0 || >=18.12.0" - }, - "peerDependencies": { - "@types/node": ">=16.18.26", - "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0", - "mem-fs": "^3.0.0 || ^4.0.0-beta.1" - }, - "peerDependenciesMeta": { - "@yeoman/adapter": { - "optional": true - }, - "mem-fs": { - "optional": true - } - } - }, - "node_modules/first-chunk-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-5.0.0.tgz", - "integrity": "sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "license": "MIT", - "peer": true - }, - "node_modules/jsdom/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/mem-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.4.tgz", - "integrity": "sha512-NlRHmUiEcxDHI7FeDlrrTZP5YFvnoS74wEf5OrQ7NAg83B2Rv3oF+FWr961I0rVdxkKbZMjq2BcV7VFWGFPkog==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": ">=18", - "@types/vinyl": "^2.0.12", - "vinyl": "^3.0.1", - "vinyl-file": "^5.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/preact": { - "version": "10.29.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", - "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/react-ace": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-10.1.0.tgz", - "integrity": "sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ace-builds": "^1.4.14", - "diff-match-patch": "^1.0.5", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/strip-bom-buf": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-3.0.1.tgz", - "integrity": "sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==", - "license": "MIT", - "peer": true, - "dependencies": { - "is-utf8": "^0.2.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-bom-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-5.0.0.tgz", - "integrity": "sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "first-chunk-stream": "^5.0.0", - "strip-bom-buf": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vinyl-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-5.0.0.tgz", - "integrity": "sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/vinyl": "^2.0.7", - "strip-bom-buf": "^3.0.1", - "strip-bom-stream": "^5.0.0", - "vinyl": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/whatwg-url/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } } } } diff --git a/superset-frontend/plugins/plugin-chart-point-cluster-map/package.json b/superset-frontend/plugins/plugin-chart-point-cluster-map/package.json index 32e975a070e..f6b2b5edb7e 100644 --- a/superset-frontend/plugins/plugin-chart-point-cluster-map/package.json +++ b/superset-frontend/plugins/plugin-chart-point-cluster-map/package.json @@ -29,7 +29,7 @@ "@math.gl/web-mercator": "^4.1.0", "mapbox-gl": "^3.23.1", "maplibre-gl": "^5.24.0", - "react-map-gl": "^8.1.1", + "react-map-gl": "^8.1.0", "supercluster": "^8.0.1" }, "peerDependencies": { From 684a66aee617fae5b05feb046e69145146a80fa3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 06:27:09 -0700 Subject: [PATCH 03/48] chore(deps): update zod requirement from ^4.4.1 to ^4.4.3 in /superset-frontend/plugins/plugin-chart-echarts (#40215) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- superset-frontend/plugins/plugin-chart-echarts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/package.json b/superset-frontend/plugins/plugin-chart-echarts/package.json index 43a2552b3b5..eb68a240a31 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/package.json +++ b/superset-frontend/plugins/plugin-chart-echarts/package.json @@ -29,7 +29,7 @@ "acorn": "^8.16.0", "d3-array": "^3.2.4", "lodash": "^4.18.1", - "zod": "^4.4.1" + "zod": "^4.4.3" }, "peerDependencies": { "@apache-superset/core": "*", From cf831388d881fecf60d775912ee80f912656772a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 06:27:36 -0700 Subject: [PATCH 04/48] chore(deps): bump caniuse-lite from 1.0.30001792 to 1.0.30001793 in /docs (#40212) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package.json | 2 +- docs/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/package.json b/docs/package.json index 6e0ff67eff4..52f62001ec2 100644 --- a/docs/package.json +++ b/docs/package.json @@ -73,7 +73,7 @@ "@swc/core": "^1.15.33", "antd": "^6.4.2", "baseline-browser-mapping": "^2.10.29", - "caniuse-lite": "^1.0.30001792", + "caniuse-lite": "^1.0.30001793", "docusaurus-plugin-openapi-docs": "^5.0.2", "docusaurus-theme-openapi-docs": "^5.0.2", "js-yaml": "^4.1.1", diff --git a/docs/yarn.lock b/docs/yarn.lock index 74b344ea3fe..81c9645ff2f 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -6051,10 +6051,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001792: - version "1.0.30001792" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz#ca8bb9be244835a335e2018272ce7223691873c5" - integrity sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001793: + version "1.0.30001793" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz#238887ddf5fcfc8c36d872394d0a78a517312a72" + integrity sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA== ccount@^2.0.0: version "2.0.1" From 6a6be4c38583b528faa2cd2254c3c2b9de6b5c96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 06:28:00 -0700 Subject: [PATCH 05/48] chore(deps): bump antd from 6.4.2 to 6.4.3 in /docs (#40210) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package.json | 2 +- docs/yarn.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/package.json b/docs/package.json index 52f62001ec2..d888f473d0a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -71,7 +71,7 @@ "@storybook/theming": "^8.6.15", "@superset-ui/core": "^0.20.4", "@swc/core": "^1.15.33", - "antd": "^6.4.2", + "antd": "^6.4.3", "baseline-browser-mapping": "^2.10.29", "caniuse-lite": "^1.0.30001793", "docusaurus-plugin-openapi-docs": "^5.0.2", diff --git a/docs/yarn.lock b/docs/yarn.lock index 81c9645ff2f..ad6107b6df6 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -3078,7 +3078,7 @@ dependencies: "@rc-component/util" "^1.2.0" -"@rc-component/notification@~2.0.6": +"@rc-component/notification@~2.0.7": version "2.0.7" resolved "https://registry.yarnpkg.com/@rc-component/notification/-/notification-2.0.7.tgz#f2450a482f87e4698285833c4a8efcac169acabb" integrity sha512-nqZzpf6BPdaj+3ILx7si79LLmqPKyUmQoXa+/9gg0SkH0v1DbD66oJgRMSBEVnd/zUT3D4gwxWIHUKebYf2ZXQ== @@ -5498,10 +5498,10 @@ ansis@^3.2.0: resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7" integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg== -antd@^6.4.2: - version "6.4.2" - resolved "https://registry.yarnpkg.com/antd/-/antd-6.4.2.tgz#9fc0fee455a5c56e7ec27855495eefadc8df636a" - integrity sha512-PNJz8Vxc/mC3EsOg/h3e2YuaZduJ1RDp4RmySDuDmKPCxVgyp4Da4kB36o87p9hbLbOWdAWCKQlnyopsN8utKQ== +antd@^6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/antd/-/antd-6.4.3.tgz#80a7aab9c13c35daa0e0e7eea80585ba57cb7203" + integrity sha512-6H2avkxCGfxcF67r3J2mwm9Ck50el1pks/73vfM1wDsPL/tPtj5vHuauMgJFnrqmq7CH3g8aoZ0VBQbt+jpAsw== dependencies: "@ant-design/colors" "^8.0.1" "@ant-design/cssinjs" "^2.1.2" @@ -5525,7 +5525,7 @@ antd@^6.4.2: "@rc-component/menu" "~1.3.0" "@rc-component/motion" "^1.3.2" "@rc-component/mutate-observer" "^2.0.1" - "@rc-component/notification" "~2.0.6" + "@rc-component/notification" "~2.0.7" "@rc-component/pagination" "~1.2.0" "@rc-component/picker" "~1.10.0" "@rc-component/progress" "~1.0.2" @@ -5545,7 +5545,7 @@ antd@^6.4.2: "@rc-component/tree-select" "~1.9.0" "@rc-component/trigger" "^3.9.0" "@rc-component/upload" "~1.1.0" - "@rc-component/util" "^1.10.1" + "@rc-component/util" "^1.11.0" clsx "^2.1.1" dayjs "^1.11.11" scroll-into-view-if-needed "^3.1.0" From e2ff2d5d4136989a39da3fd039b3f31f1ff42f24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 06:28:25 -0700 Subject: [PATCH 06/48] chore(deps): bump reselect from 5.1.1 to 5.2.0 in /docs (#40209) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package.json | 2 +- docs/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/package.json b/docs/package.json index d888f473d0a..9ee86444a6f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -87,7 +87,7 @@ "react-svg-pan-zoom": "^3.13.1", "react-table": "^7.8.0", "remark-import-partial": "^0.0.2", - "reselect": "^5.1.1", + "reselect": "^5.2.0", "storybook": "^8.6.18", "swagger-ui-react": "^5.32.5", "swc-loader": "^0.2.7", diff --git a/docs/yarn.lock b/docs/yarn.lock index ad6107b6df6..3ff2813b2a3 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -13291,10 +13291,10 @@ reselect@^4.0.0: resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz" integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== -reselect@^5.1.0, reselect@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz" - integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== +reselect@^5.1.0, reselect@^5.1.1, reselect@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.2.0.tgz#f380ef7664332d26ea06c1cba04bdbbdcaa955f1" + integrity sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw== resize-observer-polyfill@1.5.1: version "1.5.1" From 0da07677804a266178824c9b7b878833526738fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 06:28:43 -0700 Subject: [PATCH 07/48] chore(deps-dev): bump eslint from 10.3.0 to 10.4.0 in /superset-websocket (#40208) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- superset-websocket/package-lock.json | 30 ++++++++++++++-------------- superset-websocket/package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/superset-websocket/package-lock.json b/superset-websocket/package-lock.json index a15129c0693..d8acb92b29c 100644 --- a/superset-websocket/package-lock.json +++ b/superset-websocket/package-lock.json @@ -27,7 +27,7 @@ "@types/ws": "^8.18.1", "@typescript-eslint/eslint-plugin": "^8.59.3", "@typescript-eslint/parser": "^8.59.3", - "eslint": "^10.3.0", + "eslint": "^10.4.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-lodash": "^8.0.0", "globals": "^17.6.0", @@ -802,9 +802,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", - "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2794,16 +2794,16 @@ } }, "node_modules/eslint": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz", - "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.0.tgz", + "integrity": "sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.5.5", + "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", @@ -7081,9 +7081,9 @@ } }, "@eslint/config-helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", - "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", "dev": true, "requires": { "@eslint/core": "^1.2.1" @@ -8578,15 +8578,15 @@ "dev": true }, "eslint": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz", - "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.0.tgz", + "integrity": "sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.5.5", + "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", diff --git a/superset-websocket/package.json b/superset-websocket/package.json index 2665bcf0269..f5f3068792f 100644 --- a/superset-websocket/package.json +++ b/superset-websocket/package.json @@ -35,7 +35,7 @@ "@types/ws": "^8.18.1", "@typescript-eslint/eslint-plugin": "^8.59.3", "@typescript-eslint/parser": "^8.59.3", - "eslint": "^10.3.0", + "eslint": "^10.4.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-lodash": "^8.0.0", "globals": "^17.6.0", From 61b77fa35d35ebd9d6b3ef8d4df00611a77134e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 06:29:05 -0700 Subject: [PATCH 08/48] chore(deps-dev): bump ip-address from 10.1.0 to 10.2.0 in /superset-frontend (#40199) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Claude --- superset-frontend/package-lock.json | 621 +++++++++++++++------------- 1 file changed, 335 insertions(+), 286 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index d0120ffae1b..fedbebbb63f 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -344,6 +344,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", + "dev": true, "license": "MIT" }, "node_modules/@ant-design/colors": { @@ -2997,20 +2998,6 @@ "react-dom": ">=16.3.0" } }, - "node_modules/@deck.gl/widgets": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.11.tgz", - "integrity": "sha512-90HWlQPsiRyTPWR4aYfLwnYDrJdHG2mqCzRcyMUKewWBNQLu4upB//l4ewIkUeXXCzAprjjVeRnNb7wdYj2CXQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "preact": "^10.17.0" - }, - "peerDependencies": { - "@deck.gl/core": "~9.2.0", - "@luma.gl/core": "~9.2.6" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -9450,84 +9437,6 @@ "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==", "license": "MIT" }, - "node_modules/@react-spring/animated": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", - "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", - "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", - "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-spring/shared": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", - "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/rafz": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", - "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-spring/web": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", - "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/@reduxjs/toolkit": { "version": "1.9.7", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", @@ -11587,7 +11496,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-4.0.0.tgz", "integrity": "sha512-+dGZ1X2KqtwXaabVjTGxy0a3VzYfvYsWaRcuO8vMhyclHSOpGSI1+5cmlqzzCwQ3+fv0EjkTc7I5aV9lo08dYw==", - "deprecated": "⚠️ The 'jest-playwright-preset' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", + "deprecated": "\u26a0\ufe0f The 'jest-playwright-preset' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", "dev": true, "license": "MIT", "dependencies": { @@ -12488,7 +12397,7 @@ "version": "1.15.33", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.33.tgz", "integrity": "sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ==", - "devOptional": true, + "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -12532,6 +12441,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12548,6 +12458,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12564,6 +12475,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -12580,6 +12492,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12596,6 +12509,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12612,6 +12526,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12628,6 +12543,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12644,6 +12560,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12660,6 +12577,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12676,6 +12594,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12692,6 +12611,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12708,6 +12628,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12721,7 +12642,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "devOptional": true, + "dev": true, "license": "Apache-2.0" }, "node_modules/@swc/jest": { @@ -12766,7 +12687,7 @@ "version": "0.1.26", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.26.tgz", "integrity": "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -12776,6 +12697,7 @@ "version": "9.3.4", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", @@ -12795,6 +12717,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", @@ -12811,6 +12734,7 @@ "version": "6.9.1", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", @@ -12830,12 +12754,14 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, "license": "MIT" }, "node_modules/@testing-library/react": { "version": "14.3.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -12854,6 +12780,7 @@ "version": "12.8.3", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" @@ -13058,6 +12985,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { @@ -13372,13 +13300,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/expect": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", - "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", - "license": "MIT", - "peer": true - }, "node_modules/@types/express": { "version": "4.17.25", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", @@ -13991,6 +13912,7 @@ "version": "5.5.11", "resolved": "https://registry.npmjs.org/@types/react-loadable/-/react-loadable-5.5.11.tgz", "integrity": "sha512-/tq2IJ853MoIFRBmqVOxnGsRRjER5TmEKzsZtaAkiXAWoDeKgR/QNOT1vd9k0p9h/F616X21cpNh3hu4RutzRQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/react": "*", @@ -14001,6 +13923,7 @@ "version": "4.41.40", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz", "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -14015,6 +13938,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" @@ -14096,6 +14020,7 @@ "version": "1.8.8", "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", + "dev": true, "license": "MIT", "dependencies": { "@types/react": "*" @@ -14209,6 +14134,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz", "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", + "dev": true, "license": "MIT" }, "node_modules/@types/stack-utils": { @@ -14231,12 +14157,14 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz", "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", + "dev": true, "license": "MIT" }, "node_modules/@types/tinycolor2": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", + "dev": true, "license": "MIT" }, "node_modules/@types/tough-cookie": { @@ -14257,6 +14185,7 @@ "version": "3.17.5", "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz", "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", + "dev": true, "license": "MIT", "dependencies": { "source-map": "^0.6.1" @@ -14266,6 +14195,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" @@ -14308,17 +14238,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/vinyl": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", - "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/expect": "^1.20.4", - "@types/node": "*" - } - }, "node_modules/@types/wait-on": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.4.tgz", @@ -14333,6 +14252,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -16251,29 +16171,6 @@ "node": "^16.13.0 || >=18.12.0" } }, - "node_modules/@yeoman/types": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.11.1.tgz", - "integrity": "sha512-27CI5hHQAHfq8ohYILmLNzClbdzBJzu+ny9AzUVV6naJO0l4/+t+67QDKlwQvt+TW3oE5j74I/Mh4Kn14rsVXA==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^16.13.0 || >=18.12.0" - }, - "peerDependencies": { - "@types/node": ">=16.18.26", - "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0", - "mem-fs": "^3.0.0 || ^4.0.0-beta.1" - }, - "peerDependenciesMeta": { - "@yeoman/adapter": { - "optional": true - }, - "mem-fs": { - "optional": true - } - } - }, "node_modules/@zarrita/storage": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@zarrita/storage/-/storage-0.2.0.tgz", @@ -16657,6 +16554,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -16712,6 +16610,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" @@ -20770,6 +20669,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, "license": "MIT" }, "node_modules/csscolorparser": { @@ -21399,6 +21299,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", @@ -21868,6 +21769,7 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, "license": "MIT" }, "node_modules/dom-align": { @@ -22510,6 +22412,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -23753,7 +23656,7 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz", "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==", - "deprecated": "⚠️ The 'expect-playwright' package is deprecated. The Playwright core assertions (via @playwright/test) now cover the same functionality. Please migrate to built-in expect. See https://playwright.dev/docs/test-assertions for migration.", + "deprecated": "\u26a0\ufe0f The 'expect-playwright' package is deprecated. The Playwright core assertions (via @playwright/test) now cover the same functionality. Please migrate to built-in expect. See https://playwright.dev/docs/test-assertions for migration.", "dev": true, "license": "MIT" }, @@ -24468,19 +24371,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/first-chunk-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-5.0.0.tgz", - "integrity": "sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -27268,6 +27158,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -27440,6 +27331,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -28107,13 +27999,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "license": "MIT", - "peer": true - }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -30448,7 +30333,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.4.0.tgz", "integrity": "sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==", - "deprecated": "⚠️ The 'jest-process-manager' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", + "deprecated": "\u26a0\ufe0f The 'jest-process-manager' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", "dev": true, "license": "MIT", "dependencies": { @@ -32074,21 +31959,6 @@ } } }, - "node_modules/jsdom/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/jsdom/node_modules/css-tree": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -33751,6 +33621,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, "license": "MIT", "bin": { "lz-string": "bin/bin.js" @@ -34670,22 +34541,6 @@ "node": ">= 0.6" } }, - "node_modules/mem-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.4.tgz", - "integrity": "sha512-NlRHmUiEcxDHI7FeDlrrTZP5YFvnoS74wEf5OrQ7NAg83B2Rv3oF+FWr961I0rVdxkKbZMjq2BcV7VFWGFPkog==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": ">=18", - "@types/vinyl": "^2.0.12", - "vinyl": "^3.0.1", - "vinyl-file": "^5.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/memfs": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", @@ -36615,6 +36470,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -38031,6 +37887,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -39392,6 +39249,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.8" @@ -40054,17 +39912,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/preact": { - "version": "10.29.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", - "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -40137,6 +39984,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", @@ -40151,6 +39999,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -40163,6 +40012,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, "license": "MIT" }, "node_modules/pretty-ms": { @@ -41297,24 +41147,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-ace": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-10.1.0.tgz", - "integrity": "sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ace-builds": "^1.4.14", - "diff-match-patch": "^1.0.5", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-arborist": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/react-arborist/-/react-arborist-3.6.1.tgz", @@ -42458,6 +42290,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, "license": "MIT", "dependencies": { "indent-string": "^4.0.0", @@ -42471,6 +42304,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, "license": "MIT", "dependencies": { "min-indent": "^1.0.0" @@ -44367,6 +44201,7 @@ "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 12" @@ -45201,39 +45036,6 @@ "node": ">=8" } }, - "node_modules/strip-bom-buf": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-3.0.1.tgz", - "integrity": "sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==", - "license": "MIT", - "peer": true, - "dependencies": { - "is-utf8": "^0.2.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-bom-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-5.0.0.tgz", - "integrity": "sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "first-chunk-stream": "^5.0.0", - "strip-bom-buf": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", @@ -47133,6 +46935,7 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -48136,25 +47939,6 @@ "node": ">=10.13.0" } }, - "node_modules/vinyl-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-5.0.0.tgz", - "integrity": "sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/vinyl": "^2.0.7", - "strip-bom-buf": "^3.0.1", - "strip-bom-stream": "^5.0.0", - "vinyl": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", @@ -49131,21 +48915,6 @@ } } }, - "node_modules/whatwg-url/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/whatwg-url/node_modules/webidl-conversions": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", @@ -55074,6 +54843,286 @@ "version": "1.0.0", "extraneous": true, "license": "Apache-2.0" + }, + "node_modules/@deck.gl/widgets": { + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.11.tgz", + "integrity": "sha512-90HWlQPsiRyTPWR4aYfLwnYDrJdHG2mqCzRcyMUKewWBNQLu4upB//l4ewIkUeXXCzAprjjVeRnNb7wdYj2CXQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "preact": "^10.17.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@luma.gl/core": "~9.2.6" + } + }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "license": "MIT", + "peer": true + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "license": "MIT", + "peer": true + }, + "node_modules/@react-spring/web": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", + "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/vinyl": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", + "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/@yeoman/types": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.11.1.tgz", + "integrity": "sha512-27CI5hHQAHfq8ohYILmLNzClbdzBJzu+ny9AzUVV6naJO0l4/+t+67QDKlwQvt+TW3oE5j74I/Mh4Kn14rsVXA==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^16.13.0 || >=18.12.0" + }, + "peerDependencies": { + "@types/node": ">=16.18.26", + "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0", + "mem-fs": "^3.0.0 || ^4.0.0-beta.1" + }, + "peerDependenciesMeta": { + "@yeoman/adapter": { + "optional": true + }, + "mem-fs": { + "optional": true + } + } + }, + "node_modules/first-chunk-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-5.0.0.tgz", + "integrity": "sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "license": "MIT", + "peer": true + }, + "node_modules/jsdom/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/mem-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.4.tgz", + "integrity": "sha512-NlRHmUiEcxDHI7FeDlrrTZP5YFvnoS74wEf5OrQ7NAg83B2Rv3oF+FWr961I0rVdxkKbZMjq2BcV7VFWGFPkog==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": ">=18", + "@types/vinyl": "^2.0.12", + "vinyl": "^3.0.1", + "vinyl-file": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/preact": { + "version": "10.29.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", + "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/react-ace": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-10.1.0.tgz", + "integrity": "sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ace-builds": "^1.4.14", + "diff-match-patch": "^1.0.5", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/strip-bom-buf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-3.0.1.tgz", + "integrity": "sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-utf8": "^0.2.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-bom-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-5.0.0.tgz", + "integrity": "sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "first-chunk-stream": "^5.0.0", + "strip-bom-buf": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vinyl-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-5.0.0.tgz", + "integrity": "sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/vinyl": "^2.0.7", + "strip-bom-buf": "^3.0.1", + "strip-bom-stream": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/whatwg-url/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } } } } From b66c104fde4bb6096f0e9fd42ff13ef92aa10576 Mon Sep 17 00:00:00 2001 From: Mafi Date: Mon, 18 May 2026 23:43:06 +1000 Subject: [PATCH 09/48] fix(sqllab): execute prequeries on streaming connection to fix PostgreSQL CSV export (#40194) Co-authored-by: Matt Fitzgerald Co-authored-by: Claude Sonnet 4.6 --- .../chart/data/streaming_export_command.py | 11 +- .../sql_lab/streaming_export_command.py | 8 +- superset/commands/streaming_export/base.py | 24 ++- superset/models/core.py | 32 ++-- .../chart/streaming_export_command_test.py | 42 ++++- .../sql_lab/streaming_export_command_test.py | 39 +++++ tests/unit_tests/models/core_test.py | 152 ++++++++++++++++-- 7 files changed, 266 insertions(+), 42 deletions(-) diff --git a/superset/commands/chart/data/streaming_export_command.py b/superset/commands/chart/data/streaming_export_command.py index 7dec6bc1d41..6c0dbbd09b4 100644 --- a/superset/commands/chart/data/streaming_export_command.py +++ b/superset/commands/chart/data/streaming_export_command.py @@ -55,20 +55,23 @@ class StreamingCSVExportCommand(BaseStreamingCSVExportCommand): """Validate permissions and query context.""" self._query_context.raise_for_access() - def _get_sql_and_database(self) -> tuple[str, Any]: + def _get_sql_and_database(self) -> tuple[str, Any, str | None, str | None]: """ - Get the SQL query and database for chart export. + Get the SQL query, database, catalog, and schema for chart export. Returns: - Tuple of (sql_query, database_object) + Tuple of (sql_query, database_object, catalog, schema) """ # Get datasource and generate SQL query # Note: datasource should already be attached to a session from query_context datasource = self._query_context.datasource query_obj = self._query_context.queries[0] sql_query = datasource.get_query_str(query_obj.to_dict()) + database = getattr(datasource, "database", None) + catalog = getattr(datasource, "catalog", None) + schema = getattr(datasource, "schema", None) - return sql_query, getattr(datasource, "database", None) + return sql_query, database, catalog, schema def _get_row_limit(self) -> int | None: """ diff --git a/superset/commands/sql_lab/streaming_export_command.py b/superset/commands/sql_lab/streaming_export_command.py index 6b6585ac442..17685355a1f 100644 --- a/superset/commands/sql_lab/streaming_export_command.py +++ b/superset/commands/sql_lab/streaming_export_command.py @@ -87,12 +87,12 @@ class StreamingSqlResultExportCommand(BaseStreamingCSVExportCommand): status=403, ) from ex - def _get_sql_and_database(self) -> tuple[str, Any]: + def _get_sql_and_database(self) -> tuple[str, Any, str | None, str | None]: """ - Get the SQL query and database for SQL Lab export. + Get the SQL query, database, catalog, and schema for SQL Lab export. Returns: - Tuple of (sql_query, database_object) + Tuple of (sql_query, database_object, catalog, schema) """ assert self._query is not None @@ -103,7 +103,7 @@ class StreamingSqlResultExportCommand(BaseStreamingCSVExportCommand): # Get the SQL query sql = select_sql or executed_sql - return sql, database + return sql, database, self._query.catalog, self._query.schema def _get_row_limit(self) -> int | None: """ diff --git a/superset/commands/streaming_export/base.py b/superset/commands/streaming_export/base.py index 1393cf2b193..39b7d233c34 100644 --- a/superset/commands/streaming_export/base.py +++ b/superset/commands/streaming_export/base.py @@ -79,12 +79,12 @@ class BaseStreamingCSVExportCommand(BaseCommand): self._current_app = app._get_current_object() @abstractmethod - def _get_sql_and_database(self) -> tuple[str, Any]: + def _get_sql_and_database(self) -> tuple[str, Any, str | None, str | None]: """ - Get the SQL query and database for execution. + Get the SQL query, database, catalog, and schema for execution. Returns: - Tuple of (sql_query, database_object) + Tuple of (sql_query, database_object, catalog, schema) """ @abstractmethod @@ -150,7 +150,12 @@ class BaseStreamingCSVExportCommand(BaseCommand): yield remaining_data, row_count, data_bytes def _execute_query_and_stream( - self, sql: str, database: Any, limit: int | None + self, + sql: str, + database: Any, + limit: int | None, + catalog: str | None = None, + schema: str | None = None, ) -> Generator[str, None, None]: """Execute query with streaming and yield CSV chunks.""" start_time = time.time() @@ -160,8 +165,9 @@ class BaseStreamingCSVExportCommand(BaseCommand): # Merge database to prevent DetachedInstanceError merged_database = session.merge(database) - # Execute query with streaming - with merged_database.get_sqla_engine() as engine: + with merged_database.get_sqla_engine( + catalog=catalog, schema=schema + ) as engine: with engine.connect() as connection: result_proxy = connection.execution_options( stream_results=True @@ -209,7 +215,7 @@ class BaseStreamingCSVExportCommand(BaseCommand): """ # Load all needed data while session is still active # to avoid DetachedInstanceError - sql, database = self._get_sql_and_database() + sql, database, catalog, schema = self._get_sql_and_database() limit = self._get_row_limit() # Capture flask.g attributes to preserve request-scoped data # when the streaming generator runs in a new app context. @@ -222,7 +228,9 @@ class BaseStreamingCSVExportCommand(BaseCommand): with self._current_app.app_context(): with preserve_g_context(captured_g): try: - yield from self._execute_query_and_stream(sql, database, limit) + yield from self._execute_query_and_stream( + sql, database, limit, catalog, schema + ) except Exception as e: logger.error("Error in streaming CSV generator: %s", e) import traceback diff --git a/superset/models/core.py b/superset/models/core.py index 612ad6aaf37..1f99630ab3d 100755 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -468,13 +468,34 @@ class Database(CoreDatabase, AuditMixinNullable, ImportExportMixin): # pylint: engine_context_manager = app.config["ENGINE_CONTEXT_MANAGER"] with engine_context_manager(self, catalog, schema): with check_for_oauth2(self): - yield self._get_sqla_engine( + engine = self._get_sqla_engine( catalog=catalog, schema=schema, nullpool=nullpool, source=source, sqlalchemy_uri=sqlalchemy_uri, ) + prequeries = self.db_engine_spec.get_prequeries( + database=self, + catalog=catalog, + schema=schema, + ) + if prequeries: + # SQLAlchemy connect event: runs prequeries on every new + # DBAPI connection (e.g. SET search_path for PostgreSQL). + def run_prequeries( + dbapi_connection: Any, + connection_record: Any, # pylint: disable=unused-argument + ) -> None: + cursor = dbapi_connection.cursor() + try: + for prequery in prequeries: + cursor.execute(prequery) + finally: + cursor.close() + + sqla.event.listen(engine, "connect", run_prequeries) + yield engine def _get_sqla_engine( # pylint: disable=too-many-locals # noqa: C901 self, @@ -583,15 +604,6 @@ class Database(CoreDatabase, AuditMixinNullable, ImportExportMixin): # pylint: ) as engine: with check_for_oauth2(self): with closing(engine.raw_connection()) as conn: - # pre-session queries are used to set the selected catalog/schema - for prequery in self.db_engine_spec.get_prequeries( - database=self, - catalog=catalog, - schema=schema, - ): - cursor = conn.cursor() - cursor.execute(prequery) - yield conn def get_default_catalog(self) -> str | None: diff --git a/tests/unit_tests/commands/chart/streaming_export_command_test.py b/tests/unit_tests/commands/chart/streaming_export_command_test.py index 6096eaf5d7c..fc12da53322 100644 --- a/tests/unit_tests/commands/chart/streaming_export_command_test.py +++ b/tests/unit_tests/commands/chart/streaming_export_command_test.py @@ -25,7 +25,10 @@ from superset.commands.chart.data.streaming_export_command import ( def _setup_chart_mocks( - mocker: MockerFixture, sql: str = "SELECT * FROM test" + mocker: MockerFixture, + sql: str = "SELECT * FROM test", + catalog: str | None = None, + schema: str | None = None, ) -> tuple[MockerFixture, MockerFixture, MockerFixture]: """Set up common mocks for chart streaming export tests.""" mock_db = mocker.patch("superset.commands.streaming_export.base.db") @@ -36,6 +39,8 @@ def _setup_chart_mocks( datasource = mocker.MagicMock() datasource.get_query_str.return_value = sql datasource.database = mocker.MagicMock() + datasource.catalog = catalog + datasource.schema = schema query_context.datasource = datasource query_context.queries = [mocker.MagicMock()] mock_session.merge.return_value = datasource.database @@ -256,3 +261,38 @@ def test_empty_result_set(mocker: MockerFixture) -> None: lines = [line.strip() for line in csv_data.strip().split("\n")] assert len(lines) == 1 assert lines[0] == "col1,col2" + + +def test_catalog_and_schema_passed_to_engine(mocker: MockerFixture) -> None: + """Test that catalog and schema are forwarded to get_sqla_engine. + + Prequeries (e.g. SET search_path for PostgreSQL) are now run automatically + via a connect event listener registered inside get_sqla_engine, not by the + streaming command itself. + """ + mock_db, query_context, datasource = _setup_chart_mocks( + mocker, catalog="my_catalog", schema="my_schema" + ) + + mock_result = mocker.MagicMock() + mock_result.keys.return_value = ["col1"] + mock_result.fetchmany.side_effect = [[("val",)], []] + + mock_connection = mocker.MagicMock() + mock_connection.execution_options.return_value.execute.return_value = mock_result + mock_connection.__enter__.return_value = mock_connection + mock_connection.__exit__.return_value = None + + mock_engine = mocker.MagicMock() + mock_engine.connect.return_value = mock_connection + datasource.database.get_sqla_engine.return_value.__enter__.return_value = ( + mock_engine + ) + + command = StreamingCSVExportCommand(query_context) + list(command.run()()) + + datasource.database.get_sqla_engine.assert_called_once_with( + catalog="my_catalog", + schema="my_schema", + ) diff --git a/tests/unit_tests/commands/sql_lab/streaming_export_command_test.py b/tests/unit_tests/commands/sql_lab/streaming_export_command_test.py index 5c7d4ac2d48..d0d881b20a2 100644 --- a/tests/unit_tests/commands/sql_lab/streaming_export_command_test.py +++ b/tests/unit_tests/commands/sql_lab/streaming_export_command_test.py @@ -55,6 +55,8 @@ def mock_query(): query.select_sql = None query.executed_sql = "SELECT * FROM test_table" query.limiting_factor = LimitingFactor.NOT_LIMITED + query.catalog = None + query.schema = "public" query.database = MagicMock() query.database.db_engine_spec = MagicMock() query.database.db_engine_spec.engine = "postgresql" @@ -538,3 +540,40 @@ def test_null_values_handling(mocker, mock_query): assert "1,,100" in csv_data assert "2,test," in csv_data assert ",," in csv_data + + +def test_catalog_and_schema_passed_to_engine(mocker, mock_query, mock_result_proxy): + """Test that catalog and schema are forwarded to get_sqla_engine. + + Prequeries (e.g. SET search_path for PostgreSQL) are now run automatically + via a connect event listener registered inside get_sqla_engine, not by the + streaming command itself. + """ + mock_query.select_sql = "SELECT * FROM test" + mock_query.catalog = "my_catalog" + mock_query.schema = "my_schema" + + mock_db, mock_session = _setup_sqllab_mocks(mocker, mock_query) + + mock_connection = MagicMock() + mock_connection.execution_options.return_value.execute.return_value = ( + mock_result_proxy + ) + mock_connection.__enter__.return_value = mock_connection + mock_connection.__exit__.return_value = None + + mock_engine = MagicMock() + mock_engine.connect.return_value = mock_connection + mock_query.database.get_sqla_engine.return_value.__enter__.return_value = ( + mock_engine + ) + + command = StreamingSqlResultExportCommand("test_client_123") + command.validate() + + list(command.run()()) + + mock_query.database.get_sqla_engine.assert_called_once_with( + catalog="my_catalog", + schema="my_schema", + ) diff --git a/tests/unit_tests/models/core_test.py b/tests/unit_tests/models/core_test.py index 23d62218700..31df840e445 100644 --- a/tests/unit_tests/models/core_test.py +++ b/tests/unit_tests/models/core_test.py @@ -17,6 +17,7 @@ # pylint: disable=import-outside-toplevel from datetime import datetime +from typing import Any, Callable import pytest from flask import current_app @@ -261,21 +262,6 @@ def test_table_column_database() -> None: assert TableColumn(database=database).database is database -def test_get_prequeries(mocker: MockerFixture) -> None: - """ - Tests for ``get_prequeries``. - """ - mocker.patch.object(Database, "get_sqla_engine") - db_engine_spec = mocker.patch.object(Database, "db_engine_spec") - db_engine_spec.get_prequeries.return_value = ["set a=1", "set b=2"] - - database = Database(database_name="db") - with database.get_raw_connection() as conn: - conn.cursor().execute.assert_has_calls( - [mocker.call("set a=1"), mocker.call("set b=2")] - ) - - def test_catalog_cache() -> None: """ Test the catalog cache. @@ -634,6 +620,142 @@ def test_get_sqla_engine_user_impersonation_email(mocker: MockerFixture) -> None ) +def test_get_sqla_engine_registers_prequery_event_listener( + app_context: None, + mocker: MockerFixture, +) -> None: + """ + Test that get_sqla_engine registers a connect event listener for prequeries. + + Engines returned by get_sqla_engine must automatically execute prequeries + (e.g. SET search_path) on every new connection, so that callers don't need + to remember to call get_prequeries() themselves. + """ + + mock_engine = mocker.MagicMock() + mocker.patch.object(Database, "_get_sqla_engine", return_value=mock_engine) + db_engine_spec = mocker.patch.object(Database, "db_engine_spec") + db_engine_spec.get_prequeries.return_value = ['SET search_path = "my_schema"'] + event_listen = mocker.patch("superset.models.core.sqla.event.listen") + + database = Database(database_name="my_db", sqlalchemy_uri="postgresql://") + with database.get_sqla_engine(catalog="my_catalog", schema="my_schema"): + pass + + db_engine_spec.get_prequeries.assert_called_once_with( + database=database, + catalog="my_catalog", + schema="my_schema", + ) + event_listen.assert_called_once_with(mock_engine, "connect", mocker.ANY) + + # Call the captured closure directly to verify cursor create → execute → close. + captured_fn = event_listen.call_args[0][2] + mock_dbapi_conn = mocker.MagicMock() + mock_cursor = mocker.MagicMock() + mock_dbapi_conn.cursor.return_value = mock_cursor + captured_fn(mock_dbapi_conn, None) + mock_cursor.execute.assert_called_once_with('SET search_path = "my_schema"') + mock_cursor.close.assert_called_once() + + +def test_get_sqla_engine_prequery_cursor_closed_on_exception( + app_context: None, + mocker: MockerFixture, +) -> None: + """ + Test that the cursor is always closed even when a prequery raises. + """ + mock_engine = mocker.MagicMock() + mocker.patch.object(Database, "_get_sqla_engine", return_value=mock_engine) + db_engine_spec = mocker.patch.object(Database, "db_engine_spec") + db_engine_spec.get_prequeries.return_value = ['SET search_path = "bad_schema"'] + event_listen = mocker.patch("superset.models.core.sqla.event.listen") + + database = Database(database_name="my_db", sqlalchemy_uri="postgresql://") + with database.get_sqla_engine(catalog=None, schema="bad_schema"): + pass + + captured_fn = event_listen.call_args[0][2] + mock_dbapi_conn = mocker.MagicMock() + mock_cursor = mocker.MagicMock() + mock_cursor.execute.side_effect = Exception("invalid schema") + mock_dbapi_conn.cursor.return_value = mock_cursor + + with pytest.raises(Exception, match="invalid schema"): + captured_fn(mock_dbapi_conn, None) + + mock_cursor.close.assert_called_once() + + +def test_get_sqla_engine_no_prequeries_no_event_listener( + app_context: None, + mocker: MockerFixture, +) -> None: + """ + Test that get_sqla_engine does not register an event listener when there + are no prequeries. + """ + mock_engine = mocker.MagicMock() + mocker.patch.object(Database, "_get_sqla_engine", return_value=mock_engine) + db_engine_spec = mocker.patch.object(Database, "db_engine_spec") + db_engine_spec.get_prequeries.return_value = [] + event_listen = mocker.patch("superset.models.core.sqla.event.listen") + + database = Database(database_name="my_db", sqlalchemy_uri="postgresql://") + with database.get_sqla_engine(catalog=None, schema=None): + pass + + event_listen.assert_not_called() + + +def test_get_raw_connection_executes_prequeries_exactly_once( + app_context: None, + mocker: MockerFixture, +) -> None: + """ + Test that get_raw_connection() runs prequeries exactly once through the + connect event listener registered by get_sqla_engine(). + + Previously get_raw_connection() had its own manual prequery loop AND + called get_sqla_engine() (which registers the listener), so prequeries + ran twice. After removing the manual loop the listener is the sole + execution point — this test proves exactly-once semantics. + """ + mock_engine = mocker.MagicMock() + mocker.patch.object(Database, "_get_sqla_engine", return_value=mock_engine) + db_engine_spec = mocker.patch.object(Database, "db_engine_spec") + prequery = 'SET search_path = "my_schema"' + db_engine_spec.get_prequeries.return_value = [prequery] + + # Capture the closure registered via sqla.event.listen. + captured_listeners: list[Callable[..., None]] = [] + original_listen = mocker.patch("superset.models.core.sqla.event.listen") + original_listen.side_effect = lambda engine, event, fn: captured_listeners.append( + fn + ) + + # Simulate SQLAlchemy firing the "connect" event when raw_connection() is called. + mock_dbapi_conn = mocker.MagicMock() + mock_cursor = mocker.MagicMock() + mock_dbapi_conn.cursor.return_value = mock_cursor + + def raw_connection_side_effect() -> Any: + for listener in captured_listeners: + listener(mock_dbapi_conn, None) + return mock_dbapi_conn + + mock_engine.raw_connection.side_effect = raw_connection_side_effect + + database = Database(database_name="my_db", sqlalchemy_uri="postgresql://") + with database.get_raw_connection(schema="my_schema"): + pass + + # Exactly one prequery, exactly once — not twice, not zero. + mock_cursor.execute.assert_called_once_with(prequery) + mock_cursor.close.assert_called_once() + + def test_is_oauth2_enabled() -> None: """ Test the `is_oauth2_enabled` method. From 453f49ce3304cdb827c0b292d8db0a310540143d Mon Sep 17 00:00:00 2001 From: Evan Rusackas Date: Mon, 18 May 2026 07:20:37 -0700 Subject: [PATCH 10/48] test(api): regression test for Admin empty dashboard/chart list (#25890) (#40202) Co-authored-by: Claude Code --- .../integration_tests/dashboards/api_tests.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/integration_tests/dashboards/api_tests.py b/tests/integration_tests/dashboards/api_tests.py index 724185a9698..d3f2ed68c0e 100644 --- a/tests/integration_tests/dashboards/api_tests.py +++ b/tests/integration_tests/dashboards/api_tests.py @@ -760,6 +760,54 @@ class TestDashboardApi(ApiOwnersTestCaseMixin, InsertChartMixin, SupersetTestCas db.session.delete(dashboard) db.session.commit() + def test_get_dashboards_admin_sees_existing_dashboards(self): + """Regression for #25890: GET /api/v1/dashboard/ as an Admin user should + return existing dashboards, not an empty list. The original report + showed an Admin getting {"count": 0, "ids": []} despite dashboards + existing in the database.""" + admin = self.get_user("admin") + dashboard = self.insert_dashboard( + "regression_25890_dashboard", "regression-25890", [admin.id] + ) + try: + self.login(ADMIN_USERNAME) + rv = self.client.get("api/v1/dashboard/") + assert rv.status_code == 200 + data = json.loads(rv.data.decode("utf-8")) + assert data["count"] >= 1, ( + f"Admin received empty dashboard list despite " + f"{dashboard.dashboard_title!r} existing; see issue #25890" + ) + titles = [d["dashboard_title"] for d in data["result"]] + assert dashboard.dashboard_title in titles, ( + f"Admin list missing the inserted dashboard. Got titles: {titles}" + ) + finally: + db.session.delete(dashboard) + db.session.commit() + + def test_get_charts_admin_sees_existing_charts(self): + """Regression for #25890: GET /api/v1/chart/ as an Admin user should + return existing charts, not an empty list.""" + admin = self.get_user("admin") + chart = self.insert_chart("regression_25890_chart", [admin.id], 1, params="{}") + try: + self.login(ADMIN_USERNAME) + rv = self.client.get("api/v1/chart/") + assert rv.status_code == 200 + data = json.loads(rv.data.decode("utf-8")) + assert data["count"] >= 1, ( + f"Admin received empty chart list despite " + f"{chart.slice_name!r} existing; see issue #25890" + ) + names = [c["slice_name"] for c in data["result"]] + assert chart.slice_name in names, ( + f"Admin list missing the inserted chart. Got slice_names: {names}" + ) + finally: + db.session.delete(chart) + db.session.commit() + def test_get_dashboards_filter(self): """ Dashboard API: Test get dashboards filter From 53d5c41a72c8b0cd0969e369a49a53ffd234495a Mon Sep 17 00:00:00 2001 From: Evan Rusackas Date: Mon, 18 May 2026 07:20:51 -0700 Subject: [PATCH 11/48] test(security): regression test for session cookie after logout (#24713) (#40201) Co-authored-by: Claude Code --- tests/integration_tests/security/api_tests.py | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/integration_tests/security/api_tests.py b/tests/integration_tests/security/api_tests.py index 24e9acc2b69..7512507cf18 100644 --- a/tests/integration_tests/security/api_tests.py +++ b/tests/integration_tests/security/api_tests.py @@ -30,6 +30,7 @@ from superset.utils import json from tests.conftest import with_config from tests.integration_tests.base_tests import SupersetTestCase from tests.integration_tests.constants import ADMIN_USERNAME, GAMMA_USERNAME +from tests.integration_tests.test_app import app from tests.integration_tests.fixtures.birth_names_dashboard import ( load_birth_names_dashboard_with_slices, # noqa: F401 load_birth_names_data, # noqa: F401 @@ -402,3 +403,42 @@ class TestSecurityRolesApi(SupersetTestCase): assert sorted(role2_api["user_ids"]) == role2_expected["user_ids"] assert sorted(role2_api["permission_ids"]) == role2_expected["permission_ids"] assert role2_api["group_ids"] == role2_expected["group_ids"] + + +class TestLogoutSessionInvalidation(SupersetTestCase): + """Regression for #24713: a session cookie captured pre-logout must not grant + access after the user logs out. The original report describes copying the + session cookie out, calling /logout/, and successfully reusing the cookie in + a second browser to bypass authentication.""" + + def test_session_cookie_invalidated_after_logout(self): + self.login(ADMIN_USERNAME) + + resp_authed = self.client.get("api/v1/dashboard/", follow_redirects=False) + assert resp_authed.status_code == 200, ( + f"Login did not yield an authenticated session " + f"(got {resp_authed.status_code})" + ) + + # Werkzeug 2.3+ exposes the test client's cookies on `_cookies` as a + # mapping keyed by (domain, path, key). Snapshot the session cookie + # value — this is what a malicious actor would copy out of a browser. + captured = None + for cookie in self.client._cookies.values(): + if cookie.key == "session": + captured = cookie.value + break + assert captured, "expected a session cookie after login" + + self.client.get("/logout/", follow_redirects=True) + + # Replay the captured cookie in a fresh client (simulates importing + # the cookie into a second browser). + replay_client = app.test_client() + replay_client.set_cookie("session", captured, domain="localhost") + + resp_replay = replay_client.get("api/v1/dashboard/", follow_redirects=False) + assert resp_replay.status_code != 200, ( + f"Captured session cookie was still accepted after logout " + f"(status={resp_replay.status_code}); see issue #24713" + ) From 34281f54a6e74b0bf9bcc2f7328aa3556b962024 Mon Sep 17 00:00:00 2001 From: Evan Rusackas Date: Mon, 18 May 2026 07:21:04 -0700 Subject: [PATCH 12/48] test(prophet): pin yhat_lower can be negative for negative series (#21734) (#40141) Co-authored-by: Claude Code --- .../pandas_postprocessing/test_prophet.py | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/tests/unit_tests/pandas_postprocessing/test_prophet.py b/tests/unit_tests/pandas_postprocessing/test_prophet.py index c21dbb0d82b..7dacaeff9de 100644 --- a/tests/unit_tests/pandas_postprocessing/test_prophet.py +++ b/tests/unit_tests/pandas_postprocessing/test_prophet.py @@ -184,3 +184,120 @@ def test_prophet_incorrect_time_grain(): periods=10, confidence_interval=0.8, ) + + +def test_prophet_uncertainty_lower_bound_can_be_negative_for_negative_series(): + """ + Regression for #21734: when the input series contains negative values, + the forecast's lower confidence bound (``__yhat_lower``) must be allowed + to go below zero. The original bug claimed Superset clipped the lower + bound at 0, hiding the natural shape of the uncertainty interval for + series like temperatures or signed deltas. + + Superset's wrapper passes through Prophet's output unchanged (no + clipping in ``superset/utils/pandas_postprocessing/prophet.py``); this + test pins that contract end-to-end. If a future refactor introduces + a ``max(0, lower)`` clamp, this test fails immediately. + """ + if find_spec("prophet") is None: + pytest.skip("prophet not installed") + + # All-negative monthly series — any reasonable forecast must predict + # negative values (and therefore negative uncertainty bounds) too. + negative_df = pd.DataFrame( + { + DTTM_ALIAS: [datetime(2020, m, 1) for m in range(1, 13)] + + [datetime(2021, m, 1) for m in range(1, 13)], + "temperature": [ + -5.0, + -7.0, + -3.0, + 1.0, + 8.0, + 14.0, + 17.0, + 16.0, + 11.0, + 5.0, + -1.0, + -4.0, + -6.0, + -8.0, + -2.0, + 2.0, + 9.0, + 15.0, + 18.0, + 17.0, + 12.0, + 6.0, + 0.0, + -3.0, + ], + } + ) + + result = prophet( + df=negative_df, + time_grain="P1M", + periods=3, + confidence_interval=0.9, + ) + + assert "temperature__yhat_lower" in result.columns + # Restrict to the forecast horizon (the last `periods` rows). The full + # output also contains historical fitted points, which can be negative + # for in-sample data even if a future-only clamp were introduced — so + # asserting on the whole frame would let a future-only clamp slip past. + forecast_periods = 3 + forecast_lower = result["temperature__yhat_lower"].iloc[-forecast_periods:] + assert (forecast_lower < 0).any(), ( + "Forecast (future) lower bound was non-negative everywhere despite " + "a series with negative actuals — suggests an unexpected clamp at " + "zero was reintroduced (regression of #21734)." + ) + + +def test_prophet_does_not_clamp_yhat_below_zero_for_negative_actuals(): + """ + Companion to the lower-bound test above: the central forecast + (``__yhat``) must also be allowed to go negative. + A bug that clamps the central forecast at zero would force the lower + bound non-negative as a side effect, masking the wider issue. + """ + if find_spec("prophet") is None: + pytest.skip("prophet not installed") + + negative_df = pd.DataFrame( + { + DTTM_ALIAS: [datetime(2020, m, 1) for m in range(1, 13)], + "balance": [ + -100.0, + -110.0, + -95.0, + -120.0, + -130.0, + -125.0, + -140.0, + -135.0, + -150.0, + -145.0, + -160.0, + -155.0, + ], + } + ) + + result = prophet( + df=negative_df, + time_grain="P1M", + periods=2, + confidence_interval=0.8, + ) + + # Restrict to the forecast horizon — see lower-bound test above for the + # rationale. A future-only clamp on `__yhat` could leave historical + # in-sample fitted points negative and pass an unrestricted assertion. + forecast_periods = 2 + forecast_yhat = result["balance__yhat"].iloc[-forecast_periods:] + assert (forecast_yhat < 0).any() From 70419e9d8f81477026eba57fb1fc32e7abbc0e65 Mon Sep 17 00:00:00 2001 From: SkinnyPigeon Date: Mon, 18 May 2026 16:22:02 +0200 Subject: [PATCH 13/48] feat: Allow specific mcp tools to be disabled (#39835) --- docs/admin_docs/configuration/mcp-server.mdx | 27 +++ superset/mcp_service/app.py | 129 ++++++++++-- superset/mcp_service/mcp_config.py | 14 ++ .../unit_tests/mcp_service/test_mcp_config.py | 52 +++-- .../mcp_service/test_mcp_tool_registration.py | 189 ++++++++++++++++++ 5 files changed, 379 insertions(+), 32 deletions(-) diff --git a/docs/admin_docs/configuration/mcp-server.mdx b/docs/admin_docs/configuration/mcp-server.mdx index df299acaf8d..1279b03f85a 100644 --- a/docs/admin_docs/configuration/mcp-server.mdx +++ b/docs/admin_docs/configuration/mcp-server.mdx @@ -502,6 +502,7 @@ All MCP settings go in `superset_config.py`. Defaults are defined in `superset/m | `MCP_DEBUG` | `False` | Enable debug logging | | `MCP_DEV_USERNAME` | -- | Superset username for development mode (no auth) | | `MCP_RBAC_ENABLED` | `True` | Enforce Superset's role-based access control on MCP tool calls. When `True`, each tool checks that the authenticated user has the required FAB permission before executing. Disable only for testing or trusted-network deployments. | +| `MCP_DISABLED_TOOLS` | `set()` | Set of tool names to remove from the MCP server at startup. Disabled tools are never advertised to AI clients during tool discovery. Useful when a custom extension tool should replace a built-in Superset tool. See [Disabling built-in tools](#disabling-built-in-tools). | ### Authentication @@ -825,6 +826,32 @@ while True: page += 1 ``` +## Disabling built-in tools + +If you have deployed a custom tool via a Superset extension that supersedes one of the built-in Superset tools, you can suppress the built-in version so AI clients only discover your replacement. Disabled tools are removed from the server at startup and are never advertised during tool discovery. + +Set `MCP_DISABLED_TOOLS` in your `superset_config.py` to a set of tool names: + +```python +# superset_config.py + +# Disable one tool +MCP_DISABLED_TOOLS = {"execute_sql"} + +# Disable multiple tools +MCP_DISABLED_TOOLS = {"execute_sql", "health_check"} +``` + +Tool names match the function name used in the `@tool` decorator (e.g., `execute_sql`, `list_charts`, `health_check`). Extension-prefixed tools can also be disabled using their full prefixed name: + +```python +MCP_DISABLED_TOOLS = {"extensions.myorg.myextension.some_tool"} +``` + +:::note +Specifying a tool name that does not exist logs a warning at startup and is otherwise ignored — it will not prevent the server from starting. +::: + ## Security Best Practices - **Use TLS** for all production MCP endpoints -- place the server behind a reverse proxy with HTTPS diff --git a/superset/mcp_service/app.py b/superset/mcp_service/app.py index 7ab6a7a774b..0a68d168a07 100644 --- a/superset/mcp_service/app.py +++ b/superset/mcp_service/app.py @@ -30,18 +30,68 @@ from fastmcp.server.middleware import Middleware logger = logging.getLogger(__name__) +# --------------------------------------------------------------------------- +# Prose snippets that reference get_instance_info. +# These are included in the generated instructions only when that tool is +# enabled; each snippet is a plain string constant so they can be read +# independently of the filtering logic in get_default_instructions(). +# --------------------------------------------------------------------------- +_SNIPPET_FEATURE_AVAILABILITY = ( + "Feature Availability:\n" + "- Call get_instance_info to discover accessible menus for the current user.\n" + "- Do NOT assume features exist; always check get_instance_info first.\n" + "\n" +) +_SNIPPET_INSTANCE_INFO_ROLE_BULLET = ( + "- get_instance_info returns current_user.roles" + ' (e.g., ["Admin"], ["Alpha"], ["Viewer"]).\n' +) +_SNIPPET_ACCESSIBLE_MENUS_BULLET = ( + "- If you are unsure about a user's capabilities," + " check their accessible_menus in\n" + " feature_availability from get_instance_info.\n" +) +_SNIPPET_UNSURE_GUIDANCE = ( + "\nIf you are unsure which tool to use, start with get_instance_info\n" + "or use the quickstart prompt for an interactive guide.\n" +) +_SNIPPET_CONNECT_GUIDANCE = ( + "\nWhen you first connect, call get_instance_info to learn the user's identity.\n" + "Greet them by their first name (from current_user) and offer to help.\n" +) -def get_default_instructions(branding: str = "Apache Superset") -> str: + +def get_default_instructions( + branding: str = "Apache Superset", + disabled_tools: set[str] | None = None, +) -> str: """Get default instructions with configurable branding. + Tool bullet-point lines for any tool name in ``disabled_tools`` are + omitted so that LLM clients are never told to call a tool that has been + suppressed via ``MCP_DISABLED_TOOLS``. + Args: branding: Product name to use in instructions (e.g., "ACME Analytics", "Apache Superset") + disabled_tools: Set of tool names to omit from the tool listing. + When ``None`` (default) all tools are included. Returns: Formatted instructions string with branding applied """ - return f""" + _disabled = disabled_tools or set() + + # Prose sections that reference get_instance_info are omitted when that + # tool is disabled so the LLM is never directed to call a removed tool. + _show = "get_instance_info" not in _disabled + _feature_availability = _SNIPPET_FEATURE_AVAILABILITY if _show else "" + _instance_info_role_bullet = _SNIPPET_INSTANCE_INFO_ROLE_BULLET if _show else "" + _accessible_menus_bullet = _SNIPPET_ACCESSIBLE_MENUS_BULLET if _show else "" + _unsure_guidance = _SNIPPET_UNSURE_GUIDANCE if _show else "" + _connect_guidance = _SNIPPET_CONNECT_GUIDANCE if _show else "" + + instructions = f""" You are connected to the {branding} MCP (Model Context Protocol) service. This service provides programmatic access to {branding} dashboards, charts, datasets, SQL Lab, and instance metadata via a comprehensive set of tools. @@ -302,13 +352,8 @@ Input format: - Tool request parameters accept structured objects (dicts/JSON) - FastMCP 3.1+ handles Pydantic BaseModel parameters natively -Feature Availability: -- Call get_instance_info to discover accessible menus for the current user. -- Do NOT assume features exist; always check get_instance_info first. - -Permission Awareness: -- get_instance_info returns current_user.roles (e.g., ["Admin"], ["Alpha"], ["Viewer"]). -- ALWAYS check the user's roles BEFORE suggesting write operations (creating datasets, +{_feature_availability}Permission Awareness: +{_instance_info_role_bullet}- ALWAYS check the user's roles BEFORE suggesting write operations (creating datasets, charts, dashboards, or running SQL). - Do NOT disclose dashboard access lists, dashboard owners, chart owners, dataset owners, workspace admins, or other users' names, usernames, email addresses, @@ -332,15 +377,38 @@ Permission Awareness: 1. Explain that they may not have access to the requested resources 2. Suggest they ask a workspace admin to grant them access or share content with them 3. Offer to help with what they CAN do (e.g., viewing dashboards they have access to) -- If you are unsure about a user's capabilities, check their accessible_menus in - feature_availability from get_instance_info. +{_accessible_menus_bullet}{_unsure_guidance}{_connect_guidance}""" + if not _disabled: + return instructions -If you are unsure which tool to use, start with get_instance_info -or use the quickstart prompt for an interactive guide. - -When you first connect, call get_instance_info to learn the user's identity. -Greet them by their first name (from current_user) and offer to help. -""" + # Strip any line that mentions a disabled tool — this covers both the + # "- tool_name: ..." bullet entries and all prose/workflow references + # (request wrapper examples, workflow steps, CRITICAL RULES, etc.). + # Tool names are specific enough (e.g. execute_sql, generate_chart) that + # false positives are not a practical concern. + # + # Bullet continuation lines (indented lines belonging to a disabled bullet) + # are also dropped via the skip_continuation flag. + filtered_lines = [] + skip_continuation = False + for line in instructions.splitlines(keepends=True): + stripped = line.lstrip() + if stripped.startswith("- "): + tool_part = stripped[2:].split(":")[0].strip() + if tool_part in _disabled: + skip_continuation = True + continue + skip_continuation = False + elif skip_continuation and stripped and not stripped.startswith("- "): + # Indented continuation line of the previous disabled bullet — skip + continue + else: + skip_continuation = False + # Drop any prose line that names a disabled tool + if any(tool in line for tool in _disabled): + continue + filtered_lines.append(line) + return "".join(filtered_lines) # For backwards compatibility, keep DEFAULT_INSTRUCTIONS pointing to default branding @@ -569,6 +637,25 @@ from superset.mcp_service.system.tool import ( # noqa: F401, E402 ) +def _remove_disabled_tools(disabled_tools: set[str]) -> None: + """Remove tools listed in MCP_DISABLED_TOOLS from the global MCP instance. + + Disabled tools are removed before the server starts serving requests so they + are never advertised to AI clients during tool discovery. Users configure + this via MCP_DISABLED_TOOLS in superset_config.py. + """ + for tool_name in disabled_tools: + try: + mcp.local_provider.remove_tool(tool_name) + logger.info("Disabled MCP tool: %s (MCP_DISABLED_TOOLS)", tool_name) + except KeyError: + logger.warning( + "MCP_DISABLED_TOOLS: tool %r not found — " + "check the tool name is correct", + tool_name, + ) + + def init_fastmcp_server( name: str | None = None, instructions: str | None = None, @@ -608,8 +695,14 @@ def init_fastmcp_server( # Apply branding defaults if not explicitly provided if name is None: name = default_name + + # Remove disabled tools BEFORE generating instructions so that the + # instructions never advertise tools that clients cannot actually call. + disabled_tools: set[str] = flask_app.config.get("MCP_DISABLED_TOOLS", set()) + _remove_disabled_tools(disabled_tools) + if instructions is None: - instructions = get_default_instructions(branding) + instructions = get_default_instructions(branding, disabled_tools) # Configure the global mcp instance with provided settings. # Tools are already registered on this instance via @tool decorator imports above. diff --git a/superset/mcp_service/mcp_config.py b/superset/mcp_service/mcp_config.py index 65fdeba095d..d12b44bbc87 100644 --- a/superset/mcp_service/mcp_config.py +++ b/superset/mcp_service/mcp_config.py @@ -56,6 +56,19 @@ MCP_DEBUG = False # against the FAB security_manager before execution. MCP_RBAC_ENABLED = True +# MCP Disabled Tools - a set of tool names to remove from the MCP server at +# startup. Disabled tools are silently omitted from tool discovery, so AI +# clients never see them. Use this when a Superset-provided tool conflicts with +# a custom tool added via an extension and you want to suppress the built-in +# version. +# +# Example: +# MCP_DISABLED_TOOLS = {"execute_sql", "health_check"} +# +# Extension-prefixed tools can also be disabled using their full name: +# MCP_DISABLED_TOOLS = {"extensions.myorg.myext.some_tool"} +MCP_DISABLED_TOOLS: set[str] = set() + # MCP JWT Debug Errors - controls server-side JWT debug logging. # When False (default), uses the default JWTVerifier with minimal logging. # When True, uses DetailedJWTVerifier with tiered logging: @@ -402,6 +415,7 @@ def get_mcp_config(app_config: Dict[str, Any] | None = None) -> Dict[str, Any]: "MCP_SERVICE_PORT": MCP_SERVICE_PORT, "MCP_DEBUG": MCP_DEBUG, "MCP_RBAC_ENABLED": MCP_RBAC_ENABLED, + "MCP_DISABLED_TOOLS": set(MCP_DISABLED_TOOLS), **MCP_SESSION_CONFIG, **MCP_CSRF_CONFIG, } diff --git a/tests/unit_tests/mcp_service/test_mcp_config.py b/tests/unit_tests/mcp_service/test_mcp_config.py index 074ce23b541..7cc6d2809d6 100644 --- a/tests/unit_tests/mcp_service/test_mcp_config.py +++ b/tests/unit_tests/mcp_service/test_mcp_config.py @@ -105,11 +105,22 @@ def test_get_default_instructions_forbid_disclosing_other_user_access_or_roles() assert "direct them to their workspace admin" in instructions +def _mock_flask_config(app_name: str) -> MagicMock: + """Return a Flask app mock whose config.get() returns correct types per key.""" + mock = MagicMock() + mock.config.get.side_effect = lambda key, default=None: ( + app_name + if key == "APP_NAME" + else set() + if key == "MCP_DISABLED_TOOLS" + else default + ) + return mock + + def test_init_fastmcp_server_with_default_app_name(): """Test that default APP_NAME produces Superset branding.""" - # Mock Flask app config with default APP_NAME - mock_flask_app = MagicMock() - mock_flask_app.config.get.return_value = "Superset" + mock_flask_app = _mock_flask_config("Superset") # Patch at the import location to avoid actual Flask app creation with patch.dict( @@ -127,9 +138,7 @@ def test_init_fastmcp_server_with_default_app_name(): def test_init_fastmcp_server_with_custom_app_name(): """Test that custom APP_NAME produces branded instructions.""" custom_app_name = "ACME Analytics" - # Mock Flask app config with custom APP_NAME - mock_flask_app = MagicMock() - mock_flask_app.config.get.return_value = custom_app_name + mock_flask_app = _mock_flask_config(custom_app_name) # Patch at the import location to avoid actual Flask app creation with patch.dict( @@ -149,10 +158,7 @@ def test_init_fastmcp_server_derives_server_name_from_app_name(): """Test that server name is derived from APP_NAME.""" custom_app_name = "DataViz Platform" expected_server_name = f"{custom_app_name} MCP Server" - - # Mock Flask app config - mock_flask_app = MagicMock() - mock_flask_app.config.get.return_value = custom_app_name + mock_flask_app = _mock_flask_config(custom_app_name) # Patch at the import location to avoid actual Flask app creation with patch.dict( @@ -168,8 +174,7 @@ def test_init_fastmcp_server_derives_server_name_from_app_name(): def test_init_fastmcp_server_applies_auth_to_global_instance(): """Test that auth is applied to the global mcp instance, not a new one.""" - mock_flask_app = MagicMock() - mock_flask_app.config.get.return_value = "Superset" + mock_flask_app = _mock_flask_config("Superset") mock_auth = MagicMock() with patch.dict( @@ -187,8 +192,7 @@ def test_init_fastmcp_server_applies_auth_to_global_instance(): def test_init_fastmcp_server_applies_middleware_to_global_instance(): """Test that middleware is added to the global mcp instance.""" - mock_flask_app = MagicMock() - mock_flask_app.config.get.return_value = "Superset" + mock_flask_app = _mock_flask_config("Superset") mock_mw = MagicMock() with patch.dict( @@ -200,3 +204,23 @@ def test_init_fastmcp_server_applies_middleware_to_global_instance(): # Middleware should be added via add_middleware mock_mcp.add_middleware.assert_called_once_with(mock_mw) + + +def test_get_mcp_config_includes_mcp_disabled_tools_key() -> None: + """get_mcp_config must include MCP_DISABLED_TOOLS in its defaults dict so the + key is available in flask_app.config for the standalone server startup path.""" + from superset.mcp_service.mcp_config import get_mcp_config + + config = get_mcp_config() + assert "MCP_DISABLED_TOOLS" in config + assert config["MCP_DISABLED_TOOLS"] == set() + + +def test_get_mcp_config_respects_app_config_override() -> None: + """When app_config provides MCP_DISABLED_TOOLS, it takes precedence over the + module-level default.""" + from superset.mcp_service.mcp_config import get_mcp_config + + custom = {"execute_sql", "health_check"} + config = get_mcp_config({"MCP_DISABLED_TOOLS": custom}) + assert config["MCP_DISABLED_TOOLS"] == custom diff --git a/tests/unit_tests/mcp_service/test_mcp_tool_registration.py b/tests/unit_tests/mcp_service/test_mcp_tool_registration.py index 9307a671659..00a94fa78e9 100644 --- a/tests/unit_tests/mcp_service/test_mcp_tool_registration.py +++ b/tests/unit_tests/mcp_service/test_mcp_tool_registration.py @@ -18,6 +18,10 @@ """Test MCP app imports and tool/prompt registration.""" import asyncio +import logging +from unittest.mock import MagicMock, patch + +from superset.mcp_service.app import get_default_instructions, init_fastmcp_server, mcp def _run(coro): @@ -95,3 +99,188 @@ def test_mcp_packages_discoverable_by_setuptools(): f"MCP sub-packages missing __init__.py (will be excluded from " f"setuptools distributions): {missing}" ) + + +# --------------------------------------------------------------------------- +# MCP_DISABLED_TOOLS tests +# --------------------------------------------------------------------------- + + +def _make_flask_app_mock(disabled_tools: set[str]) -> MagicMock: + """Return a minimal Flask app mock with MCP_DISABLED_TOOLS configured.""" + flask_app = MagicMock() + flask_app.config.get.side_effect = lambda key, default=None: ( + disabled_tools if key == "MCP_DISABLED_TOOLS" else default + ) + return flask_app + + +def test_disabled_tools_are_removed_from_mcp_server() -> None: + """Tools listed in MCP_DISABLED_TOOLS are removed before the server starts.""" + + flask_app = _make_flask_app_mock({"health_check", "list_charts"}) + + with ( + patch( + "superset.mcp_service.flask_singleton.app", + flask_app, + ), + patch.object(mcp.local_provider, "remove_tool") as mock_remove, + ): + init_fastmcp_server() + + removed = {call.args[0] for call in mock_remove.call_args_list} + assert "health_check" in removed + assert "list_charts" in removed + + +def test_unknown_disabled_tool_logs_warning_not_raises(caplog) -> None: + """An unknown tool name in MCP_DISABLED_TOOLS logs a warning and does not crash.""" + + flask_app = _make_flask_app_mock({"nonexistent_tool_xyz"}) + + with ( + patch( + "superset.mcp_service.flask_singleton.app", + flask_app, + ), + patch.object( + mcp.local_provider, + "remove_tool", + side_effect=KeyError("nonexistent_tool_xyz"), + ), + caplog.at_level(logging.WARNING, logger="superset.mcp_service.app"), + ): + # Must not raise + init_fastmcp_server() + + assert "nonexistent_tool_xyz" in caplog.text + assert "MCP_DISABLED_TOOLS" in caplog.text + + +def test_empty_disabled_tools_removes_nothing() -> None: + """An empty MCP_DISABLED_TOOLS set leaves all tools registered.""" + + flask_app = _make_flask_app_mock(set()) + + with ( + patch( + "superset.mcp_service.flask_singleton.app", + flask_app, + ), + patch.object(mcp.local_provider, "remove_tool") as mock_remove, + ): + init_fastmcp_server() + + mock_remove.assert_not_called() + + +def test_disabled_tools_read_from_flask_app_config() -> None: + """MCP_DISABLED_TOOLS is read from flask_app.config, matching the standard + Superset pattern where users set overrides in superset_config.py, which + create_app() loads into Flask config before any command runs.""" + from superset.mcp_service.app import init_fastmcp_server, mcp + + flask_app = _make_flask_app_mock({"health_check"}) + + with ( + patch( + "superset.mcp_service.flask_singleton.app", + flask_app, + ), + patch.object(mcp.local_provider, "remove_tool") as mock_remove, + ): + init_fastmcp_server() + + removed = {call.args[0] for call in mock_remove.call_args_list} + assert "health_check" in removed + + +# --------------------------------------------------------------------------- +# get_default_instructions disabled_tools filtering tests +# --------------------------------------------------------------------------- + + +def test_disabled_tools_absent_from_instructions() -> None: + """Tools in disabled_tools must not appear as bullet lines in instructions.""" + instructions = get_default_instructions( + disabled_tools={"execute_sql", "health_check"} + ) + + # The bullet-point entries for disabled tools must be gone + assert "- execute_sql:" not in instructions + assert "- health_check:" not in instructions + # Non-disabled tools must still be present + assert "- list_charts:" in instructions + assert "- list_dashboards:" in instructions + + +def test_disabling_get_instance_info_removes_all_prose_references() -> None: + """Disabling get_instance_info must remove ALL prose references to it, + not only the bullet-point entry in the Available tools section.""" + instructions = get_default_instructions(disabled_tools={"get_instance_info"}) + + # Bullet entry must be gone + assert "- get_instance_info:" not in instructions + # Prose directives that instruct the LLM to call the tool must also be gone + assert "start with get_instance_info" not in instructions + assert "call get_instance_info" not in instructions + assert "check their accessible_menus in" not in instructions + assert "Feature Availability" not in instructions + # Instructions for other tools must be unaffected + assert "- list_charts:" in instructions + assert "- execute_sql:" in instructions + + +def test_disabling_execute_sql_removes_all_prose_references() -> None: + """Disabling execute_sql must remove all workflow and example lines that + mention it, not only the bullet-point entry.""" + instructions = get_default_instructions(disabled_tools={"execute_sql"}) + + # Bullet entry must be gone + assert "- execute_sql:" not in instructions + # Workflow steps and request wrapper examples must also be gone + assert "execute_sql(" not in instructions + assert "execute_sql" not in instructions + # Instructions for unrelated tools must be unaffected + assert "- list_charts:" in instructions + assert "- get_instance_info:" in instructions + + +def test_no_disabled_tools_returns_full_instructions() -> None: + """Passing no disabled_tools (or empty set) returns the full instructions.""" + full = get_default_instructions() + also_full = get_default_instructions(disabled_tools=set()) + + assert "- execute_sql:" in full + assert "- health_check:" in full + assert full == also_full + + +def test_instructions_generated_after_disabled_tools_removed() -> None: + """init_fastmcp_server generates instructions AFTER removing disabled tools, + so the instructions never advertise tools that clients cannot call.""" + flask_app = _make_flask_app_mock({"execute_sql"}) + + captured: list[str] = [] + + def fake_get_instructions( + branding: str = "Apache Superset", + disabled_tools: set[str] | None = None, + ) -> str: + captured.append(str(disabled_tools)) + return f"instructions for {branding}" + + with ( + patch("superset.mcp_service.flask_singleton.app", flask_app), + patch.object(mcp.local_provider, "remove_tool"), + patch( + "superset.mcp_service.app.get_default_instructions", + fake_get_instructions, + ), + ): + init_fastmcp_server() + + # get_default_instructions must have been called with the disabled set + assert len(captured) == 1 + assert "execute_sql" in captured[0] From 6e5dfa0dd4915f054ee32d1b114e2855a34b0941 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 22:14:27 +0700 Subject: [PATCH 14/48] chore(deps): bump baseline-browser-mapping from 2.10.29 to 2.10.30 in /docs (#40211) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package.json | 2 +- docs/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/package.json b/docs/package.json index 9ee86444a6f..33af0c3e126 100644 --- a/docs/package.json +++ b/docs/package.json @@ -72,7 +72,7 @@ "@superset-ui/core": "^0.20.4", "@swc/core": "^1.15.33", "antd": "^6.4.3", - "baseline-browser-mapping": "^2.10.29", + "baseline-browser-mapping": "^2.10.30", "caniuse-lite": "^1.0.30001793", "docusaurus-plugin-openapi-docs": "^5.0.2", "docusaurus-theme-openapi-docs": "^5.0.2", diff --git a/docs/yarn.lock b/docs/yarn.lock index 3ff2813b2a3..6ce160604f6 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -5810,10 +5810,10 @@ base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -baseline-browser-mapping@^2.10.29, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19: - version "2.10.29" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz#47bdc13027af28d341f367a4f35a07ce872e27b4" - integrity sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ== +baseline-browser-mapping@^2.10.30, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19: + version "2.10.30" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.30.tgz#58915c74388b05f3b3504026194ea9fa98f6e6b6" + integrity sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg== batch@0.6.1: version "0.6.1" From 38546d7a3d8eaa201233460644a245c93dbcf65d Mon Sep 17 00:00:00 2001 From: Evan Rusackas Date: Mon, 18 May 2026 08:18:37 -0700 Subject: [PATCH 15/48] =?UTF-8?q?chore(deps):=20coordinated=20bump=20ag-gr?= =?UTF-8?q?id-community=20+=20ag-grid-react=2035.2.1=E2=86=9235.3.0=20(#40?= =?UTF-8?q?205)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Claude --- superset-frontend/package-lock.json | 651 ++++++++---------- superset-frontend/package.json | 4 +- .../packages/superset-ui-core/package.json | 4 +- 3 files changed, 305 insertions(+), 354 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index fedbebbb63f..0e397bee4fc 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -80,8 +80,8 @@ "@visx/scale": "^3.5.0", "@visx/tooltip": "^3.0.0", "@visx/xychart": "^3.5.1", - "ag-grid-community": "35.2.1", - "ag-grid-react": "35.2.1", + "ag-grid-community": "35.3.0", + "ag-grid-react": "35.3.0", "antd": "^5.26.0", "chrono-node": "^2.9.1", "classnames": "^2.2.5", @@ -344,7 +344,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", - "dev": true, "license": "MIT" }, "node_modules/@ant-design/colors": { @@ -2998,6 +2997,20 @@ "react-dom": ">=16.3.0" } }, + "node_modules/@deck.gl/widgets": { + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.11.tgz", + "integrity": "sha512-90HWlQPsiRyTPWR4aYfLwnYDrJdHG2mqCzRcyMUKewWBNQLu4upB//l4ewIkUeXXCzAprjjVeRnNb7wdYj2CXQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "preact": "^10.17.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@luma.gl/core": "~9.2.6" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -9437,6 +9450,84 @@ "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==", "license": "MIT" }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "license": "MIT", + "peer": true + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "license": "MIT", + "peer": true + }, + "node_modules/@react-spring/web": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", + "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@reduxjs/toolkit": { "version": "1.9.7", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", @@ -11496,7 +11587,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-4.0.0.tgz", "integrity": "sha512-+dGZ1X2KqtwXaabVjTGxy0a3VzYfvYsWaRcuO8vMhyclHSOpGSI1+5cmlqzzCwQ3+fv0EjkTc7I5aV9lo08dYw==", - "deprecated": "\u26a0\ufe0f The 'jest-playwright-preset' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", + "deprecated": "⚠️ The 'jest-playwright-preset' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", "dev": true, "license": "MIT", "dependencies": { @@ -12397,7 +12488,7 @@ "version": "1.15.33", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.33.tgz", "integrity": "sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -12441,7 +12532,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12458,7 +12548,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12475,7 +12564,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -12492,7 +12580,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12509,7 +12596,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12526,7 +12612,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12543,7 +12628,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12560,7 +12644,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12577,7 +12660,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12594,7 +12676,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12611,7 +12692,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12628,7 +12708,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -12642,7 +12721,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@swc/jest": { @@ -12687,7 +12766,7 @@ "version": "0.1.26", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.26.tgz", "integrity": "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -12697,7 +12776,6 @@ "version": "9.3.4", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", @@ -12717,7 +12795,6 @@ "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", @@ -12734,7 +12811,6 @@ "version": "6.9.1", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", @@ -12754,14 +12830,12 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, "license": "MIT" }, "node_modules/@testing-library/react": { "version": "14.3.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -12780,7 +12854,6 @@ "version": "12.8.3", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" @@ -12985,7 +13058,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { @@ -13300,6 +13372,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "license": "MIT", + "peer": true + }, "node_modules/@types/express": { "version": "4.17.25", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", @@ -13912,7 +13991,6 @@ "version": "5.5.11", "resolved": "https://registry.npmjs.org/@types/react-loadable/-/react-loadable-5.5.11.tgz", "integrity": "sha512-/tq2IJ853MoIFRBmqVOxnGsRRjER5TmEKzsZtaAkiXAWoDeKgR/QNOT1vd9k0p9h/F616X21cpNh3hu4RutzRQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/react": "*", @@ -13923,7 +14001,6 @@ "version": "4.41.40", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz", "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -13938,7 +14015,6 @@ "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" @@ -14020,7 +14096,6 @@ "version": "1.8.8", "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", - "dev": true, "license": "MIT", "dependencies": { "@types/react": "*" @@ -14134,7 +14209,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz", "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", - "dev": true, "license": "MIT" }, "node_modules/@types/stack-utils": { @@ -14157,14 +14231,12 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz", "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", - "dev": true, "license": "MIT" }, "node_modules/@types/tinycolor2": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", - "dev": true, "license": "MIT" }, "node_modules/@types/tough-cookie": { @@ -14185,7 +14257,6 @@ "version": "3.17.5", "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz", "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", - "dev": true, "license": "MIT", "dependencies": { "source-map": "^0.6.1" @@ -14195,7 +14266,6 @@ "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" @@ -14238,6 +14308,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/vinyl": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", + "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, "node_modules/@types/wait-on": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.4.tgz", @@ -14252,7 +14333,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -16171,6 +16251,29 @@ "node": "^16.13.0 || >=18.12.0" } }, + "node_modules/@yeoman/types": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.11.1.tgz", + "integrity": "sha512-27CI5hHQAHfq8ohYILmLNzClbdzBJzu+ny9AzUVV6naJO0l4/+t+67QDKlwQvt+TW3oE5j74I/Mh4Kn14rsVXA==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^16.13.0 || >=18.12.0" + }, + "peerDependencies": { + "@types/node": ">=16.18.26", + "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0", + "mem-fs": "^3.0.0 || ^4.0.0-beta.1" + }, + "peerDependenciesMeta": { + "@yeoman/adapter": { + "optional": true + }, + "mem-fs": { + "optional": true + } + } + }, "node_modules/@zarrita/storage": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@zarrita/storage/-/storage-0.2.0.tgz", @@ -16302,27 +16405,27 @@ "license": "MIT" }, "node_modules/ag-charts-types": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/ag-charts-types/-/ag-charts-types-13.2.1.tgz", - "integrity": "sha512-r7veb3QqJtIKlXmeUsLR4/oDPwmHxFI2tmbZra/203mdaz3uwQUrrgYNg628nrK+7L2YxXnwGc6L05tWjLLjNQ==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/ag-charts-types/-/ag-charts-types-13.3.0.tgz", + "integrity": "sha512-UMoAn908LC4ZIJSNfUckSBEFa79Mi1vFRA8qIRx+NusEuuFgXDioCZx4MxM7O3rDXlxTWH9DvQmcDjh7vyd89w==", "license": "MIT" }, "node_modules/ag-grid-community": { - "version": "35.2.1", - "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-35.2.1.tgz", - "integrity": "sha512-ycmGI+1EbUT7i3eg/Kgi1owwnkdHXRufo10Xm6cfSsVPM3TMpvlbLgi28KIPt9DGHZWHq9fOBn7nxMNdv1Yaow==", + "version": "35.3.0", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-35.3.0.tgz", + "integrity": "sha512-c9WQWB88J965IjBC/GPUX30aAZix10o6oYT86DWipcxgLZTIQlLSilJJEr1bno/245rPEAIMjhoU1gp9VIfURg==", "license": "MIT", "dependencies": { - "ag-charts-types": "13.2.1" + "ag-charts-types": "13.3.0" } }, "node_modules/ag-grid-react": { - "version": "35.2.1", - "resolved": "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-35.2.1.tgz", - "integrity": "sha512-UzdU15R6fyGJB+lBKEC458xacGoZged3Ra6Plqa7LvrJ/Mg0tWn1NH01UnuKyGEKPWMEAGvdXruOtOUywsPElA==", + "version": "35.3.0", + "resolved": "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-35.3.0.tgz", + "integrity": "sha512-3c6YEFGQGNZxEi1PdK0b+WhKkKRJ7KxuYzsG4UmISyax5/J7N93f8B1TZK1pq+AgzPhdk/++vjZe3KhFdF3tog==", "license": "MIT", "dependencies": { - "ag-grid-community": "35.2.1", + "ag-grid-community": "35.3.0", "prop-types": "^15.8.1" }, "peerDependencies": { @@ -16554,7 +16657,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -16610,7 +16712,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" @@ -20669,7 +20770,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, "license": "MIT" }, "node_modules/csscolorparser": { @@ -21299,7 +21399,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", @@ -21769,7 +21868,6 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, "license": "MIT" }, "node_modules/dom-align": { @@ -22412,7 +22510,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -23656,7 +23753,7 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz", "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==", - "deprecated": "\u26a0\ufe0f The 'expect-playwright' package is deprecated. The Playwright core assertions (via @playwright/test) now cover the same functionality. Please migrate to built-in expect. See https://playwright.dev/docs/test-assertions for migration.", + "deprecated": "⚠️ The 'expect-playwright' package is deprecated. The Playwright core assertions (via @playwright/test) now cover the same functionality. Please migrate to built-in expect. See https://playwright.dev/docs/test-assertions for migration.", "dev": true, "license": "MIT" }, @@ -24371,6 +24468,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/first-chunk-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-5.0.0.tgz", + "integrity": "sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -27158,7 +27268,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -27331,7 +27440,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -27999,6 +28107,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "license": "MIT", + "peer": true + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -30333,7 +30448,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.4.0.tgz", "integrity": "sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==", - "deprecated": "\u26a0\ufe0f The 'jest-process-manager' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", + "deprecated": "⚠️ The 'jest-process-manager' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details.", "dev": true, "license": "MIT", "dependencies": { @@ -31959,6 +32074,21 @@ } } }, + "node_modules/jsdom/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/jsdom/node_modules/css-tree": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -33621,7 +33751,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, "license": "MIT", "bin": { "lz-string": "bin/bin.js" @@ -34541,6 +34670,22 @@ "node": ">= 0.6" } }, + "node_modules/mem-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.4.tgz", + "integrity": "sha512-NlRHmUiEcxDHI7FeDlrrTZP5YFvnoS74wEf5OrQ7NAg83B2Rv3oF+FWr961I0rVdxkKbZMjq2BcV7VFWGFPkog==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": ">=18", + "@types/vinyl": "^2.0.12", + "vinyl": "^3.0.1", + "vinyl-file": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/memfs": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", @@ -36470,7 +36615,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -37887,7 +38031,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -39249,7 +39392,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.8" @@ -39912,6 +40054,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/preact": { + "version": "10.29.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", + "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -39984,7 +40137,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", @@ -39999,7 +40151,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -40012,7 +40163,6 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, "license": "MIT" }, "node_modules/pretty-ms": { @@ -41147,6 +41297,24 @@ "node": ">=0.10.0" } }, + "node_modules/react-ace": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-10.1.0.tgz", + "integrity": "sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ace-builds": "^1.4.14", + "diff-match-patch": "^1.0.5", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-arborist": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/react-arborist/-/react-arborist-3.6.1.tgz", @@ -42290,7 +42458,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, "license": "MIT", "dependencies": { "indent-string": "^4.0.0", @@ -42304,7 +42471,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, "license": "MIT", "dependencies": { "min-indent": "^1.0.0" @@ -44201,7 +44367,6 @@ "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 12" @@ -45036,6 +45201,39 @@ "node": ">=8" } }, + "node_modules/strip-bom-buf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-3.0.1.tgz", + "integrity": "sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-utf8": "^0.2.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-bom-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-5.0.0.tgz", + "integrity": "sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "first-chunk-stream": "^5.0.0", + "strip-bom-buf": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", @@ -46935,7 +47133,6 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -47939,6 +48136,25 @@ "node": ">=10.13.0" } }, + "node_modules/vinyl-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-5.0.0.tgz", + "integrity": "sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/vinyl": "^2.0.7", + "strip-bom-buf": "^3.0.1", + "strip-bom-stream": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", @@ -48915,6 +49131,21 @@ } } }, + "node_modules/whatwg-url/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/whatwg-url/node_modules/webidl-conversions": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", @@ -51706,8 +51937,8 @@ "@types/json-bigint": "^1.0.4", "@visx/responsive": "^3.12.0", "ace-builds": "^1.44.0", - "ag-grid-community": "35.2.1", - "ag-grid-react": "35.2.1", + "ag-grid-community": "35.3.0", + "ag-grid-react": "35.3.0", "brace": "^0.11.1", "classnames": "^2.5.1", "core-js": "^3.49.0", @@ -54843,286 +55074,6 @@ "version": "1.0.0", "extraneous": true, "license": "Apache-2.0" - }, - "node_modules/@deck.gl/widgets": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.11.tgz", - "integrity": "sha512-90HWlQPsiRyTPWR4aYfLwnYDrJdHG2mqCzRcyMUKewWBNQLu4upB//l4ewIkUeXXCzAprjjVeRnNb7wdYj2CXQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "preact": "^10.17.0" - }, - "peerDependencies": { - "@deck.gl/core": "~9.2.0", - "@luma.gl/core": "~9.2.6" - } - }, - "node_modules/@react-spring/animated": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", - "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", - "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", - "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-spring/shared": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", - "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/rafz": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", - "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-spring/web": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", - "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@types/expect": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", - "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/vinyl": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", - "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/expect": "^1.20.4", - "@types/node": "*" - } - }, - "node_modules/@yeoman/types": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.11.1.tgz", - "integrity": "sha512-27CI5hHQAHfq8ohYILmLNzClbdzBJzu+ny9AzUVV6naJO0l4/+t+67QDKlwQvt+TW3oE5j74I/Mh4Kn14rsVXA==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^16.13.0 || >=18.12.0" - }, - "peerDependencies": { - "@types/node": ">=16.18.26", - "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0", - "mem-fs": "^3.0.0 || ^4.0.0-beta.1" - }, - "peerDependenciesMeta": { - "@yeoman/adapter": { - "optional": true - }, - "mem-fs": { - "optional": true - } - } - }, - "node_modules/first-chunk-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-5.0.0.tgz", - "integrity": "sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "license": "MIT", - "peer": true - }, - "node_modules/jsdom/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/mem-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.4.tgz", - "integrity": "sha512-NlRHmUiEcxDHI7FeDlrrTZP5YFvnoS74wEf5OrQ7NAg83B2Rv3oF+FWr961I0rVdxkKbZMjq2BcV7VFWGFPkog==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": ">=18", - "@types/vinyl": "^2.0.12", - "vinyl": "^3.0.1", - "vinyl-file": "^5.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/preact": { - "version": "10.29.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", - "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/react-ace": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-10.1.0.tgz", - "integrity": "sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ace-builds": "^1.4.14", - "diff-match-patch": "^1.0.5", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/strip-bom-buf": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-3.0.1.tgz", - "integrity": "sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==", - "license": "MIT", - "peer": true, - "dependencies": { - "is-utf8": "^0.2.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-bom-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-5.0.0.tgz", - "integrity": "sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "first-chunk-stream": "^5.0.0", - "strip-bom-buf": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vinyl-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-5.0.0.tgz", - "integrity": "sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/vinyl": "^2.0.7", - "strip-bom-buf": "^3.0.1", - "strip-bom-stream": "^5.0.0", - "vinyl": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/whatwg-url/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } } } } diff --git a/superset-frontend/package.json b/superset-frontend/package.json index 3f352617594..c6e95ed3d6d 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -161,8 +161,8 @@ "@visx/scale": "^3.5.0", "@visx/tooltip": "^3.0.0", "@visx/xychart": "^3.5.1", - "ag-grid-community": "35.2.1", - "ag-grid-react": "35.2.1", + "ag-grid-community": "35.3.0", + "ag-grid-react": "35.3.0", "antd": "^5.26.0", "chrono-node": "^2.9.1", "classnames": "^2.2.5", diff --git a/superset-frontend/packages/superset-ui-core/package.json b/superset-frontend/packages/superset-ui-core/package.json index 161781090e5..76bc082721f 100644 --- a/superset-frontend/packages/superset-ui-core/package.json +++ b/superset-frontend/packages/superset-ui-core/package.json @@ -30,8 +30,8 @@ "@types/json-bigint": "^1.0.4", "@visx/responsive": "^3.12.0", "ace-builds": "^1.44.0", - "ag-grid-community": "35.2.1", - "ag-grid-react": "35.2.1", + "ag-grid-community": "35.3.0", + "ag-grid-react": "35.3.0", "brace": "^0.11.1", "classnames": "^2.5.1", "core-js": "^3.49.0", From d40a5cad5dc169a2e703f497d995bb6f76e89c4b Mon Sep 17 00:00:00 2001 From: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com> Date: Mon, 18 May 2026 13:07:54 -0300 Subject: [PATCH 16/48] fix(OAuth2): Re-query the OAuth2 token to avoid stale reference (#40071) --- superset/utils/oauth2.py | 24 ++++- tests/unit_tests/utils/oauth2_tests.py | 131 +++++++++++++++++++++++-- 2 files changed, 146 insertions(+), 9 deletions(-) diff --git a/superset/utils/oauth2.py b/superset/utils/oauth2.py index a2a2666e7c0..020f5397b3c 100644 --- a/superset/utils/oauth2.py +++ b/superset/utils/oauth2.py @@ -38,7 +38,7 @@ from superset.superset_typing import OAuth2ClientConfig, OAuth2State if TYPE_CHECKING: from superset.db_engine_specs.base import BaseEngineSpec - from superset.models.core import Database, DatabaseUserOAuth2Tokens + from superset.models.core import Database JWT_EXPIRATION = timedelta(minutes=5) @@ -116,7 +116,7 @@ def get_oauth2_access_token( return token.access_token if token.refresh_token: - return refresh_oauth2_token(config, database_id, user_id, db_engine_spec, token) + return refresh_oauth2_token(config, database_id, user_id, db_engine_spec) # since the access token is expired and there's no refresh token, delete the entry db.session.delete(token) @@ -129,8 +129,10 @@ def refresh_oauth2_token( database_id: int, user_id: int, db_engine_spec: type[BaseEngineSpec], - token: DatabaseUserOAuth2Tokens, ) -> str | None: + # pylint: disable=import-outside-toplevel + from superset.models.core import DatabaseUserOAuth2Tokens + # Use longer TTL for OAuth2 token refresh (may involve network calls) with DistributedLock( namespace="refresh_oauth2_token", @@ -138,6 +140,22 @@ def refresh_oauth2_token( user_id=user_id, database_id=database_id, ): + # Short circuit in case another request already deleted the token + token = ( + db.session.query(DatabaseUserOAuth2Tokens) + .filter_by(user_id=user_id, database_id=database_id) + .one_or_none() + ) + if token is None: + return None + + if token.access_token and datetime.now() < token.access_token_expiration: + return token.access_token + + if not token.refresh_token: + db.session.delete(token) + return None + try: token_response = db_engine_spec.get_oauth2_fresh_token( config, diff --git a/tests/unit_tests/utils/oauth2_tests.py b/tests/unit_tests/utils/oauth2_tests.py index c74b2f9570b..ac788ce66e5 100644 --- a/tests/unit_tests/utils/oauth2_tests.py +++ b/tests/unit_tests/utils/oauth2_tests.py @@ -131,10 +131,12 @@ def test_refresh_oauth2_token_deletes_token_on_oauth2_exception( "Token revoked" ) token = mocker.MagicMock() + token.access_token = None token.refresh_token = "refresh-token" # noqa: S105 + db.session.query().filter_by().one_or_none.return_value = token with pytest.raises(OAuth2ExceptionError): - refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec, token) + refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec) db.session.delete.assert_called_with(token) db.session.flush.assert_called_once() @@ -160,10 +162,12 @@ def test_refresh_oauth2_token_keeps_token_on_other_exception( db_engine_spec.oauth2_exception = OAuth2ExceptionError db_engine_spec.get_oauth2_fresh_token.side_effect = Exception("Network error") token = mocker.MagicMock() + token.access_token = None token.refresh_token = "refresh-token" # noqa: S105 + db.session.query().filter_by().one_or_none.return_value = token with pytest.raises(Exception, match="Network error"): - refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec, token) + refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec) db.session.delete.assert_not_called() @@ -176,16 +180,18 @@ def test_refresh_oauth2_token_no_access_token_in_response( This can happen when the refresh token was revoked. """ - mocker.patch("superset.utils.oauth2.db") + db = mocker.patch("superset.utils.oauth2.db") mocker.patch("superset.utils.oauth2.DistributedLock") db_engine_spec = mocker.MagicMock() db_engine_spec.get_oauth2_fresh_token.return_value = { "error": "invalid_grant", } token = mocker.MagicMock() + token.access_token = None token.refresh_token = "refresh-token" # noqa: S105 + db.session.query().filter_by().one_or_none.return_value = token - result = refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec, token) + result = refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec) assert result is None @@ -208,10 +214,12 @@ def test_refresh_oauth2_token_updates_refresh_token( "refresh_token": "new-refresh-token", } token = mocker.MagicMock() + token.access_token = None token.refresh_token = "old-refresh-token" # noqa: S105 + db.session.query().filter_by().one_or_none.return_value = token with freeze_time("2024-01-01"): - refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec, token) + refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec) assert token.access_token == "new-access-token" # noqa: S105 assert token.access_token_expiration == datetime(2024, 1, 1, 1) @@ -236,16 +244,127 @@ def test_refresh_oauth2_token_keeps_refresh_token( "expires_in": 3600, } token = mocker.MagicMock() + token.access_token = None token.refresh_token = "original-refresh-token" # noqa: S105 + db.session.query().filter_by().one_or_none.return_value = token with freeze_time("2024-01-01"): - refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec, token) + refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec) assert token.access_token == "new-access-token" # noqa: S105 assert token.refresh_token == "original-refresh-token" # noqa: S105 db.session.add.assert_called_with(token) +def test_refresh_oauth2_token_refreshes_when_access_token_expired_under_lock( + mocker: MockerFixture, +) -> None: + """ + Test that refresh_oauth2_token triggers a refresh when the access_token is expired. + + When the re-query under the lock returns a token whose access_token has expired + but a refresh_token is available, the function should call the token endpoint + and persist the new access_token. + """ + db = mocker.patch("superset.utils.oauth2.db") + mocker.patch("superset.utils.oauth2.DistributedLock") + db_engine_spec = mocker.MagicMock() + db_engine_spec.get_oauth2_fresh_token.return_value = { + "access_token": "new-access-token", + "expires_in": 3600, + } + token = mocker.MagicMock() + token.access_token = "expired-token" # noqa: S105 + token.access_token_expiration = datetime(2024, 1, 1) + token.refresh_token = "refresh-token" # noqa: S105 + db.session.query().filter_by().one_or_none.return_value = token + + with freeze_time("2024-01-02"): + result = refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec) + + assert result == "new-access-token" + db_engine_spec.get_oauth2_fresh_token.assert_called_once_with( + DUMMY_OAUTH2_CONFIG, "refresh-token" + ) + db.session.add.assert_called_with(token) + + +def test_refresh_oauth2_token_returns_existing_token_when_still_valid_under_lock( + mocker: MockerFixture, +) -> None: + """ + Test that refresh_oauth2_token returns the existing access_token if still valid. + + When concurrent requests are triggered and the first one refreshes the token and + releases the lock before the second one gets to `refresh_oauth2_token`, the second + request should pick up the already-refreshed access_token instead of refreshing + it again. + """ + db = mocker.patch("superset.utils.oauth2.db") + mocker.patch("superset.utils.oauth2.DistributedLock") + db_engine_spec = mocker.MagicMock() + token = mocker.MagicMock() + token.access_token = "fresh-access-token" # noqa: S105 + token.access_token_expiration = datetime(2024, 1, 2) + token.refresh_token = "refresh-token" # noqa: S105 + db.session.query().filter_by().one_or_none.return_value = token + + with freeze_time("2024-01-01"): + result = refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec) + + assert result == "fresh-access-token" + db_engine_spec.get_oauth2_fresh_token.assert_not_called() + db.session.delete.assert_not_called() + + +def test_refresh_oauth2_token_deletes_when_no_refresh_token_under_lock( + mocker: MockerFixture, +) -> None: + """ + Test that refresh_oauth2_token deletes the row when there's no refresh_token. + + When the token has expired and the re-query under the lock shows no refresh_token + is available, the row should be deleted and None returned so the caller can + trigger the OAuth2 dance. + """ + db = mocker.patch("superset.utils.oauth2.db") + mocker.patch("superset.utils.oauth2.DistributedLock") + db_engine_spec = mocker.MagicMock() + token = mocker.MagicMock() + token.access_token = "expired-token" # noqa: S105 + token.access_token_expiration = datetime(2024, 1, 1) + token.refresh_token = None + db.session.query().filter_by().one_or_none.return_value = token + + with freeze_time("2024-01-02"): + result = refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec) + + assert result is None + db.session.delete.assert_called_with(token) + db_engine_spec.get_oauth2_fresh_token.assert_not_called() + + +def test_refresh_oauth2_token_returns_none_when_row_deleted_under_lock( + mocker: MockerFixture, +) -> None: + """ + Test that refresh_oauth2_token returns None when the row is gone under the lock. + + When concurrent requests are triggered and the first one deletes the token row and + releases the lock before the second one gets to `refresh_oauth2_token`, the token + is queried again to avoid a stale reference. + """ + db = mocker.patch("superset.utils.oauth2.db") + mocker.patch("superset.utils.oauth2.DistributedLock") + db_engine_spec = mocker.MagicMock() + db.session.query().filter_by().one_or_none.return_value = None + + result = refresh_oauth2_token(DUMMY_OAUTH2_CONFIG, 1, 1, db_engine_spec) + + assert result is None + db_engine_spec.get_oauth2_fresh_token.assert_not_called() + + def test_generate_code_verifier_length() -> None: """ Test that generate_code_verifier produces a string of valid length (RFC 7636). From 47bc1a3b4bf8dc29ac916041113260afc07ca495 Mon Sep 17 00:00:00 2001 From: Richard Fogaca Nienkotter <63572350+richardfogaca@users.noreply.github.com> Date: Mon, 18 May 2026 13:46:58 -0300 Subject: [PATCH 17/48] fix(deckgl): render all MultiPolygon parts in Polygon chart (#40100) --- .../src/layers/Polygon/transformProps.test.ts | 66 +++++ .../src/layers/Polygon/transformProps.ts | 235 +++++++++++------- 2 files changed, 215 insertions(+), 86 deletions(-) diff --git a/superset-frontend/plugins/preset-chart-deckgl/src/layers/Polygon/transformProps.test.ts b/superset-frontend/plugins/preset-chart-deckgl/src/layers/Polygon/transformProps.test.ts index 4069a474eff..e9ab02f8299 100644 --- a/superset-frontend/plugins/preset-chart-deckgl/src/layers/Polygon/transformProps.test.ts +++ b/superset-frontend/plugins/preset-chart-deckgl/src/layers/Polygon/transformProps.test.ts @@ -369,6 +369,72 @@ describe('Polygon transformProps', () => { ]); }); + test('should render every polygon part when boundary column contains GeoJSON MultiPolygon Geometry format', () => { + const geojsonMultiPolygonProps = { + ...mockChartProps, + rawFormData: { + ...mockChartProps.rawFormData, + metric: 'population', + }, + queriesData: [ + { + data: [ + { + geom: JSON.stringify({ + type: 'MultiPolygon', + coordinates: [ + [ + [ + [-122.4, 37.8], + [-122.3, 37.8], + [-122.3, 37.9], + [-122.4, 37.9], + [-122.4, 37.8], + ], + ], + [ + [ + [-121.4, 36.8], + [-121.3, 36.8], + [-121.3, 36.9], + [-121.4, 36.9], + [-121.4, 36.8], + ], + ], + ], + }), + population: 50000, + }, + ], + }, + ], + }; + + const result = transformProps(geojsonMultiPolygonProps as ChartProps); + + const features = result.payload.data.features as PolygonFeature[]; + expect(features).toHaveLength(2); + expect(features.map(feature => feature.polygon)).toEqual([ + [ + [-122.4, 37.8], + [-122.3, 37.8], + [-122.3, 37.9], + [-122.4, 37.9], + [-122.4, 37.8], + ], + [ + [-121.4, 36.8], + [-121.3, 36.8], + [-121.3, 36.9], + [-121.4, 36.9], + [-121.4, 36.8], + ], + ]); + expect(features.map(feature => feature.metrics?.population)).toEqual([ + 50000, 50000, + ]); + }); + test('should render polygons when boundary column contains JSON with nested geometry', () => { // Real-world format: {"type":"Polygon","geometry":{"type":"Polygon","coordinates":[...]}} const nonStandardProps = { diff --git a/superset-frontend/plugins/preset-chart-deckgl/src/layers/Polygon/transformProps.ts b/superset-frontend/plugins/preset-chart-deckgl/src/layers/Polygon/transformProps.ts index 5a9f71b2a53..25344f7cf73 100644 --- a/superset-frontend/plugins/preset-chart-deckgl/src/layers/Polygon/transformProps.ts +++ b/superset-frontend/plugins/preset-chart-deckgl/src/layers/Polygon/transformProps.ts @@ -41,6 +41,60 @@ interface PolygonFeature { metrics?: Record; } +type PolygonCoordinates = number[][]; + +function isPlainRecord(value: unknown): value is Record { + return typeof value === 'object' && value !== null && !Array.isArray(value); +} + +function getOwnRecordValue( + record: DataRecord, + key: string | undefined, +): string | number | null | undefined { + if (!key || !Object.prototype.hasOwnProperty.call(record, key)) { + return undefined; + } + + return record[key]; +} + +function getGeoJsonGeometry(value: unknown): Record | null { + if (!isPlainRecord(value)) { + return null; + } + + if (value.coordinates) { + return value; + } + + return isPlainRecord(value.geometry) ? value.geometry : null; +} + +function getPolygonCoordinateParts( + value: unknown, +): PolygonCoordinates[] | null { + if (Array.isArray(value)) { + return [value as PolygonCoordinates]; + } + + const geometry = getGeoJsonGeometry(value); + if (!geometry?.coordinates || !Array.isArray(geometry.coordinates)) { + return null; + } + + if (geometry.type === 'MultiPolygon') { + return geometry.coordinates.flatMap(polygon => + Array.isArray(polygon) + ? [(polygon[0] || polygon) as PolygonCoordinates] + : [], + ); + } + + return [ + (geometry.coordinates[0] || geometry.coordinates) as PolygonCoordinates, + ]; +} + function processPolygonData( records: DataRecord[], formData: DeckPolygonFormData, @@ -83,98 +137,107 @@ function processPolygonData( const excludeKeys = new Set([line_column, ...(js_columns || [])]); - return records - .map(record => { - let feature: PolygonFeature = { - extraProps: {}, - metrics: {}, - }; + return records.flatMap(record => { + let feature: PolygonFeature = { + extraProps: {}, + metrics: {}, + }; - feature = addJsColumnsToExtraProps(feature, record, js_columns); - const updatedFeature = addPropertiesToFeature( - feature as unknown as Record, - record, - excludeKeys, - ); - feature = updatedFeature as unknown as PolygonFeature; + feature = addJsColumnsToExtraProps(feature, record, js_columns); + const updatedFeature = addPropertiesToFeature( + feature as unknown as Record, + record, + excludeKeys, + ); + feature = updatedFeature as unknown as PolygonFeature; - const rawPolygonData = record[line_column]; - if (!rawPolygonData) { - return null; + const rawPolygonData = getOwnRecordValue(record, line_column); + if (!rawPolygonData) { + return []; + } + + try { + let polygonCoordParts: PolygonCoordinates[]; + + switch (line_type) { + case 'json': { + const parsed = + typeof rawPolygonData === 'string' + ? JSON.parse(rawPolygonData) + : rawPolygonData; + const parsedPolygonCoordParts = getPolygonCoordinateParts(parsed); + + if (!parsedPolygonCoordParts) { + return []; + } + + polygonCoordParts = parsedPolygonCoordParts; + break; + } + case 'geohash': { + const polygonCoords: PolygonCoordinates = []; + const decoded = decode_bbox(String(rawPolygonData)); + if (decoded) { + polygonCoords.push([decoded[1], decoded[0]]); // SW (minLon, minLat) + polygonCoords.push([decoded[1], decoded[2]]); // NW (minLon, maxLat) + polygonCoords.push([decoded[3], decoded[2]]); // NE (maxLon, maxLat) + polygonCoords.push([decoded[3], decoded[0]]); // SE (maxLon, minLat) + polygonCoords.push([decoded[1], decoded[0]]); // SW (close polygon) + } + polygonCoordParts = [polygonCoords]; + break; + } + case 'zipcode': + default: { + polygonCoordParts = [ + Array.isArray(rawPolygonData) + ? (rawPolygonData as PolygonCoordinates) + : [], + ]; + break; + } } - try { - let polygonCoords: number[][]; - - switch (line_type) { - case 'json': { - const parsed = - typeof rawPolygonData === 'string' - ? JSON.parse(rawPolygonData) - : rawPolygonData; - - if (parsed.coordinates) { - polygonCoords = parsed.coordinates[0] || parsed.coordinates; - } else if (parsed.geometry?.coordinates) { - // Non-standard format with nested geometry - polygonCoords = - parsed.geometry.coordinates[0] || parsed.geometry.coordinates; - } else if (Array.isArray(parsed)) { - polygonCoords = parsed; - } else { - return null; - } - break; - } - case 'geohash': - polygonCoords = []; - const decoded = decode_bbox(String(rawPolygonData)); - if (decoded) { - polygonCoords.push([decoded[1], decoded[0]]); // SW (minLon, minLat) - polygonCoords.push([decoded[1], decoded[2]]); // NW (minLon, maxLat) - polygonCoords.push([decoded[3], decoded[2]]); // NE (maxLon, maxLat) - polygonCoords.push([decoded[3], decoded[0]]); // SE (maxLon, minLat) - polygonCoords.push([decoded[1], decoded[0]]); // SW (close polygon) - } - break; - case 'zipcode': - default: { - polygonCoords = Array.isArray(rawPolygonData) ? rawPolygonData : []; - break; - } - } - - if (reverse_long_lat && polygonCoords.length > 0) { - polygonCoords = polygonCoords.map(coord => [coord[1], coord[0]]); - } - - feature.polygon = polygonCoords; - - if (fixedElevationValue !== undefined) { - feature.elevation = fixedElevationValue; - } else if (elevationLabel && record[elevationLabel] != null) { - const elevationValue = parseMetricValue(record[elevationLabel]); - if (elevationValue !== undefined) { - feature.elevation = elevationValue; - } - } - - if (metricLabel && record[metricLabel] != null) { - const metricValue = record[metricLabel]; - if ( - typeof metricValue === 'string' || - typeof metricValue === 'number' - ) { - feature.metrics![metricLabel] = metricValue; - } - } - } catch { - return null; + if (reverse_long_lat) { + polygonCoordParts = polygonCoordParts.map(polygonCoords => + polygonCoords.map(coord => [coord[1], coord[0]]), + ); } - return feature; - }) - .filter((feature): feature is PolygonFeature => feature !== null); + if (fixedElevationValue !== undefined) { + feature.elevation = fixedElevationValue; + } else { + const rawElevationValue = getOwnRecordValue(record, elevationLabel); + const elevationValue = parseMetricValue(rawElevationValue); + if (elevationValue !== undefined) { + feature.elevation = elevationValue; + } + } + + if (metricLabel) { + const metricValue = getOwnRecordValue(record, metricLabel); + if ( + typeof metricValue === 'string' || + typeof metricValue === 'number' + ) { + feature.metrics![metricLabel] = metricValue; + } + } + + return polygonCoordParts.map(polygonCoords => ({ + ...feature, + extraProps: { ...feature.extraProps }, + metrics: { ...feature.metrics }, + polygon: polygonCoords, + })); + } catch (error) { + if (error instanceof SyntaxError || error instanceof TypeError) { + return []; + } + + throw error; + } + }); } export default function transformProps(chartProps: ChartProps) { From 054aeb3baed147c5dfb68335bd84ac4bc3d6324a Mon Sep 17 00:00:00 2001 From: Jean Massucatto Date: Mon, 18 May 2026 13:51:06 -0300 Subject: [PATCH 18/48] fix(explore): prevent unnecessary scrollbars during chart rendering (#39291) --- .../src/explore/components/ExploreChartPanel/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/explore/components/ExploreChartPanel/index.tsx b/superset-frontend/src/explore/components/ExploreChartPanel/index.tsx index 697e5ef419d..55a3b7647cf 100644 --- a/superset-frontend/src/explore/components/ExploreChartPanel/index.tsx +++ b/superset-frontend/src/explore/components/ExploreChartPanel/index.tsx @@ -307,7 +307,7 @@ const ExploreChartPanel = ({ css={css` min-height: 0; flex: 1; - overflow: auto; + overflow: hidden; `} ref={chartPanelRef} > From 5393fdfabfd32eb7eb32ce5f45cec4c894ce4bb1 Mon Sep 17 00:00:00 2001 From: jesperct Date: Mon, 18 May 2026 13:52:48 -0300 Subject: [PATCH 19/48] fix(echarts): suppress phantom x-axis label at axis edge when no time grain (#39972) --- .../src/MixedTimeseries/transformProps.ts | 3 ++- .../src/Timeseries/transformProps.ts | 3 ++- .../test/Timeseries/transformProps.test.ts | 26 ++++++++++++++++++- .../test/Timeseries/transformers.test.ts | 8 +++++- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts index 33df597f923..9b6c6d65bbf 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts @@ -589,7 +589,8 @@ export default function transformProps( ? getXAxisFormatter(xAxisTimeFormat, timeGrainSqla) : String; - const showMaxLabel = xAxisType === AxisType.Time && xAxisLabelRotation === 0; + const showMaxLabel = + xAxisType === AxisType.Time && xAxisLabelRotation === 0 && !!timeGrainSqla; const deduplicatedFormatter = showMaxLabel ? (() => { let lastLabel: string | undefined; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts index 8bf0909489a..1086c5f6a8c 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts @@ -861,7 +861,8 @@ export default function transformProps( // boundary that formats identically to the last data-point tick (e.g. // "2005" appears twice with Year grain). Wrap the formatter to suppress // consecutive duplicate labels. - const showMaxLabel = xAxisType === AxisType.Time && xAxisLabelRotation === 0; + const showMaxLabel = + xAxisType === AxisType.Time && xAxisLabelRotation === 0 && !!timeGrainSqla; const deduplicatedFormatter = showMaxLabel ? (() => { let lastLabel: string | undefined; diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts index a43610f3348..78434f33a40 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts @@ -1444,7 +1444,7 @@ test('x-axis formatter deduplicates consecutive identical labels for coarse time const chartProps = createTestChartProps({ formData: { granularity_sqla: 'ds', - time_grain_sqla: TimeGranularity.YEAR, + timeGrainSqla: TimeGranularity.YEAR, xAxisTimeFormat: '%Y', }, queriesData: [ @@ -1473,6 +1473,30 @@ test('x-axis formatter deduplicates consecutive identical labels for coarse time expect(label4).toBe(''); }); +test('x-axis does not force showMaxLabel when no time grain is set', () => { + const data = [ + { __timestamp: Date.UTC(2003, 0, 6), sales: 100 }, + { __timestamp: Date.UTC(2004, 5, 15), sales: 200 }, + { __timestamp: Date.UTC(2005, 4, 31), sales: 300 }, + ]; + + const chartProps = createTestChartProps({ + formData: { + granularity_sqla: 'ds', + timeGrainSqla: undefined, + }, + queriesData: [ + createTestQueryData(data, { + colnames: ['__timestamp', 'sales'], + coltypes: [GenericDataType.Temporal, GenericDataType.Numeric], + }), + ], + }); + + const xAxisResult = transformProps(chartProps).echartOptions.xAxis as any; + expect(xAxisResult.axisLabel.showMaxLabel).not.toBe(true); +}); + test('numeric x coltype routes through the number formatter (not the time formatter)', () => { // Regression guard for echarts-timeseries-epoch-x-axis-labels investigation. // When the query reports a Numeric x-axis coltype (including epoch-ms-like diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformers.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformers.test.ts index 54da9c14ea0..19aa1d4a0d6 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformers.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformers.test.ts @@ -16,7 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -import { CategoricalColorScale, ChartProps } from '@superset-ui/core'; +import { + CategoricalColorScale, + ChartProps, + TimeGranularity, +} from '@superset-ui/core'; import { GenericDataType } from '@apache-superset/core/common'; import { supersetTheme } from '@apache-superset/core/theme'; import type { SeriesOption } from 'echarts'; @@ -235,6 +239,7 @@ function buildTimeseriesChartProps( colorScheme: 'bnbColors', datasource: '3__table', granularity_sqla: 'ds', + timeGrainSqla: TimeGranularity.MONTH, metric: 'sum__num', viz_type: 'my_viz', ...overrides, @@ -263,6 +268,7 @@ test('should configure time axis labels to show max label for last month visibil colorScheme: 'bnbColors', datasource: '3__table', granularity_sqla: 'ds', + timeGrainSqla: TimeGranularity.MONTH, metric: 'sum__num', viz_type: 'my_viz', }; From 00d3a7dd1ef078eef948111af8f60ade7707b01c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 10:28:13 -0700 Subject: [PATCH 20/48] chore(deps-dev): bump oxlint from 1.63.0 to 1.64.0 in /superset-frontend (#40160) Signed-off-by: dependabot[bot] Co-authored-by: Claude --- superset-frontend/oxlint.json | 8 + superset-frontend/package-lock.json | 160 +++++++++--------- superset-frontend/package.json | 18 +- .../AsyncAceEditor/AsyncAceEditor.test.tsx | 4 +- .../src/components/TableCollection/index.tsx | 2 +- .../src/DataTable/DataTable.tsx | 8 +- .../gridComponents/Markdown/Markdown.test.tsx | 1 - .../ChartList/ChartList.listview.test.tsx | 2 +- 8 files changed, 103 insertions(+), 100 deletions(-) diff --git a/superset-frontend/oxlint.json b/superset-frontend/oxlint.json index d2fe2bfb5ac..abf361d9517 100644 --- a/superset-frontend/oxlint.json +++ b/superset-frontend/oxlint.json @@ -269,6 +269,14 @@ } ] }, + "overrides": [ + { + "files": ["plugins/plugin-chart-table/src/TableChart.tsx", "plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.tsx"], + "rules": { + "jsx-a11y/no-redundant-roles": "off" + } + } + ], "ignorePatterns": [ "packages/generator-superset/**/*", "cypress-base/**", diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 0e397bee4fc..9f5359e0287 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -269,7 +269,7 @@ "lightningcss": "^1.32.0", "mini-css-extract-plugin": "^2.10.2", "open-cli": "^9.0.0", - "oxlint": "^1.63.0", + "oxlint": "^1.65.0", "po2json": "^0.4.5", "prettier": "3.8.3", "prettier-plugin-packagejson": "^3.0.2", @@ -8643,9 +8643,9 @@ "license": "MIT" }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.63.0.tgz", - "integrity": "sha512-A9xLtQt7i0OA1PoB/meog6kikXI9CdwEp7ZwQqmgnpKn3G3b1orvTDy8CQ6T7w1HvDrgWGB78PkFKcWgibcTCg==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.65.0.tgz", + "integrity": "sha512-jDVaGNURT5pEA9qcabh6WusIoBNybOMMDPCx+EFt+gxo6rVvoUf0+73Xy5x81+ZrxU+ewk5uRBYifjy5pgkcnA==", "cpu": [ "arm" ], @@ -8660,9 +8660,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.63.0.tgz", - "integrity": "sha512-SQo+ZMvdR9l3CxZp5W5gFNxSiDxclY6lOzzNpKYLF8asESpm3Pwumx0gER5T7aHLF1/2BAAtLD3DiDkdgy4V1A==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.65.0.tgz", + "integrity": "sha512-v0z80IWNA7c9RhUydq9YprBxCVZrQ6Ixls2tdxUC1F/1FFqSfa7xTX+EJf0mj6+BKRg2zWXqWfcbJUnETlLlIw==", "cpu": [ "arm64" ], @@ -8677,9 +8677,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.63.0.tgz", - "integrity": "sha512-6W82XjJDTmMnjg30427l0dufpnyLoq7wEukKdM6/g2VIybRVuQiBVh43EA4b+UxZ3+tLcKm+Or/pXGNgLCEU8g==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.65.0.tgz", + "integrity": "sha512-pL/mG/5gMzBwp1gdc5+Cwi87F9j3XRnPxHGyVj5Zd+dCEV5YkKt0L70PB3EGmEEHxgn4H+jnMS3xLuXs6mZW/Q==", "cpu": [ "arm64" ], @@ -8694,9 +8694,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.63.0.tgz", - "integrity": "sha512-CnWd/YCuVG5W1BYkjJEVbJG11o526O9qAwBEQM+nh8K19CRFUkFdROXCyYkGmroHEYQe4vgQ6+lh3550Lp35Xw==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.65.0.tgz", + "integrity": "sha512-jVTneaeuHtqTrKYnhrdH1buhnSorinvpy1sv43ayclfWx/e/DfdRWv+h1fopJcHQbYr5WMcZMmDvnfEBkPZ+1A==", "cpu": [ "x64" ], @@ -8711,9 +8711,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.63.0.tgz", - "integrity": "sha512-a4eZAqrmtajqcxfdAzC+l7g3PaE3V8hpAYqqeD3fTxLXOMFdK3eNTZrU80n4dDEVm0JXy1aL5PqvqWldBl6zYA==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.65.0.tgz", + "integrity": "sha512-8lJQ7B6RloYDUhwVdbSpwT2eKsCN5KP1Scn18ly1tytCuhXhbs0nkfKHT4jWWZBJqmynWuzd+78bF7wILrj6pw==", "cpu": [ "x64" ], @@ -8728,9 +8728,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.63.0.tgz", - "integrity": "sha512-tYUtU9TdbU3uXF5D62g5zXJ13iniFGhXQx5vp9cyEjGdbSAY3VdFBSaldYvyoDmgMZ0ZYuwQP1Y4t2Fhejwa0w==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.65.0.tgz", + "integrity": "sha512-EgmZY+DeWhLLEnNl70/49j3ltA8I6X9kxMfexupWi2Vwfp6RonGsBaHtGoedLolaU37ne7eDUgoxa3CFB95GZA==", "cpu": [ "arm" ], @@ -8745,9 +8745,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.63.0.tgz", - "integrity": "sha512-I5r3twFf776UZg9dmRo2xbrKt00tTkORXEVe0ctg4vdTkQvJAjiCHxnbAU2HL1AiJ9cqADA76MAliuilsAWnvg==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.65.0.tgz", + "integrity": "sha512-OJMWmAYRVBCPPxnYr3j5sXRwHPh1bAuMlTStGco1Z8q3HkvSH4h+A10E9MiRNYmLhUuli5a2P5wmfj8cagiF5Q==", "cpu": [ "arm" ], @@ -8762,9 +8762,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.63.0.tgz", - "integrity": "sha512-t7ltUkg6FFh4b564QyGir8xIj/QZbXu8FlcRkcyW9+ztr/mfRHlvUOFd95pJCXi9s/L5DrUeWWgpXRS+V+6igQ==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.65.0.tgz", + "integrity": "sha512-D8uNi50LsYKgS0vGARZDRx05TBZeSxAVdLGddSEqQLSU7xsiqdImHPEw55xq8sKA5rCc/4au/5uS7FQALWdLCg==", "cpu": [ "arm64" ], @@ -8779,9 +8779,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.63.0.tgz", - "integrity": "sha512-Q5mmZy/XWjuYFUuQyYjOvZ5U/JkKEwnpir6hGxhh6HcdP0V/BKxLo8dqkfF/t7r7AguB17dfS/8+go5AQDRR6g==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.65.0.tgz", + "integrity": "sha512-IpbA8QGbwFehQhO+YaHwmoI81f93xvywpspf8HrdPCWOIeKwYfM1dhVhO4YKfZewTRRQEPY/JFjTOXTgkwhKrA==", "cpu": [ "arm64" ], @@ -8796,9 +8796,9 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.63.0.tgz", - "integrity": "sha512-uBGtuZ0TzLB4x5wVa82HGNvYqY8buwDhyCnCP0R0gkk9szqVsP0MeTtD5HX7EsEuFIt+aYmYxuxeVxs3nTSwtQ==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.65.0.tgz", + "integrity": "sha512-ZSe8HgaZdgyHSv2+/pTG68z10+OarB18CkFKQOhRs3lmmP/p2vuigedK2e9d0ztoG2DU/duJzhxXBSjy/492HQ==", "cpu": [ "ppc64" ], @@ -8813,9 +8813,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.63.0.tgz", - "integrity": "sha512-h4s6FwxE+9MeA181o0dnDwHP32Y/bG8EiB/vrD6Ib+AMt6haigDc/0bUtI/sLmQDBMJnUfaCmtSSrEAqjtEVrA==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.65.0.tgz", + "integrity": "sha512-DcTERf++v6HyPHukKAr0JFTRqB+YeDEvqzRgNDMaz7jITPf+tlJIwRxodlAqoXMYhNVEZhXdQM5RAAYH8/oPuw==", "cpu": [ "riscv64" ], @@ -8830,9 +8830,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.63.0.tgz", - "integrity": "sha512-2EaNcCBR8Mcjl5ARtuN3BdEpVkX7KpjSjMGZ/mJMIeaXgTtdz5ytg2VwygMSStA/k0ixfvZFoZOfjDEcouV5vQ==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.65.0.tgz", + "integrity": "sha512-xjhMwuFJwRh40NOBzol4gM5gqAa0xPCJU+GQLM6BydV8TbfkIA7JeyCFNhyfbE9Q/5EWcKYTx62R0cRcjP7DAA==", "cpu": [ "riscv64" ], @@ -8847,9 +8847,9 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.63.0.tgz", - "integrity": "sha512-p4hlf/fd7TrYYl3QrWWD0GocqJefwMu3cHQhmi2FvEB/YOvFb5DZN3SMBaPi7B1TM5DeypkEtrVib674q1KKPg==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.65.0.tgz", + "integrity": "sha512-lrWSXb8JzboPWYBG6Kunt/eemvjo2oCFXktShsm3yMToY7HjzKLjxh7CljSvGnnZH9oohNFHOKc9xYpGKCPm6w==", "cpu": [ "s390x" ], @@ -8864,9 +8864,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.63.0.tgz", - "integrity": "sha512-Vgq9rkRVcPcjbcH+ihYTfpeR7vCXfqpd+z5ItTGc0yYUV59L5ceHYN1iV4H9bKGV7Rn5hkVc7x3mSvHegduENA==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.65.0.tgz", + "integrity": "sha512-A7xfghw250m4a1sPV+q44Mow2G5bhiC9FBvhAuIhJS6QovWnqzuL5AFQPEuwOB+PM4DhABkqxVa3Iwe3Y/nFlQ==", "cpu": [ "x64" ], @@ -8881,9 +8881,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.63.0.tgz", - "integrity": "sha512-3/Lkq/ncooA61rorrC+ZQed1Bc4VpGj+WnGsp58zmxKgvZ2vhreu+dcVyr3mX8NUpq7mfZ4gDDTou/yrF1Pd7A==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.65.0.tgz", + "integrity": "sha512-reqOun1+pWO3fW6cv7bsa8hHG0TN3t/82qPdaoJo90FwugXiMjKhZMChmH5Z01cFNRHmxN4+543Fy8478cM/iA==", "cpu": [ "x64" ], @@ -8898,9 +8898,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.63.0.tgz", - "integrity": "sha512-0/EdD/6hDkx5Mfd769PTjvEM8mZ/6Dfukp1dBCL/2PjlIVGEtYdNZyok6ChqYPsT9JcFnlQnUeQzO0/1L/oC9w==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.65.0.tgz", + "integrity": "sha512-KQpqOb/juDBO0xyloDkVDhOVxDUgAfZ2OAAVq99TJScJDzT319xry1QzB9LQohV9QGnA7p6m/XATZkMXc84lwA==", "cpu": [ "arm64" ], @@ -8915,9 +8915,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.63.0.tgz", - "integrity": "sha512-wb0CUkN8ngwPiRQBjD1Cj0LsHeNvm+Xt6YBHDMtj2DVQVD6Oj8Ri7g6BD+KICf6LaBqZlmzOvy6nF9E/8yyGOg==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.65.0.tgz", + "integrity": "sha512-xfqcOc3nJFeAd1kDY4T9d3XeJIhr00twaaW0kOAzGPyUHkruXtNJv6zz1Ra9fRtSek5VpW2Yoj5AcwPIlT0ZiQ==", "cpu": [ "arm64" ], @@ -8932,9 +8932,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.63.0.tgz", - "integrity": "sha512-BX5iq+ovdNlVYhSn5qPMUIT0uwAwt2lmEnCnzK+Gkhw4DovIvhGb96OFhV8yzQNUnQxn/xGkOR+X+BLrLDNm8w==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.65.0.tgz", + "integrity": "sha512-JV+pXm45p8sdgs3c7LOPAohW23optCNZETFOXUcjn6cS4PYZhEU/RI54Z5dHdMudab3nw7T48PZILthM+Q0COQ==", "cpu": [ "ia32" ], @@ -8949,9 +8949,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.63.0.tgz", - "integrity": "sha512-QeN/WELOfsXMeYwxvfgQrl6CbVftYUCZsGXHjXQd5Trccm8+i4gmtxaOui4xbJQaiDlviF8F3yLSBloQUeFsfA==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.65.0.tgz", + "integrity": "sha512-D7L/oBbskLss21bYrRbFuIs81AiSQV+wRzwck54dOkHIlq2qu1xjLz8u6jCqGH8Fltk8bB5DLBpVhE7v/fA8XQ==", "cpu": [ "x64" ], @@ -38476,9 +38476,9 @@ } }, "node_modules/oxlint": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.63.0.tgz", - "integrity": "sha512-9TGXetdjgIHOJ9OiReomP7nnrMkV9HxC1xM2ramJSLQpzxjsAJtQwa4wqkJN2f/uCrqZuJseFuSlWDdvcruveg==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.65.0.tgz", + "integrity": "sha512-ChUuE3Q7XnAbscvT4XLMsH7HFJmLgLVv9lu+RRgFL5wSXnDqUOzTp5IS8qWDBGd/ZDSzQ2tbX8fjAmijlGLC7A==", "dev": true, "license": "MIT", "bin": { @@ -38491,25 +38491,25 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.63.0", - "@oxlint/binding-android-arm64": "1.63.0", - "@oxlint/binding-darwin-arm64": "1.63.0", - "@oxlint/binding-darwin-x64": "1.63.0", - "@oxlint/binding-freebsd-x64": "1.63.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.63.0", - "@oxlint/binding-linux-arm-musleabihf": "1.63.0", - "@oxlint/binding-linux-arm64-gnu": "1.63.0", - "@oxlint/binding-linux-arm64-musl": "1.63.0", - "@oxlint/binding-linux-ppc64-gnu": "1.63.0", - "@oxlint/binding-linux-riscv64-gnu": "1.63.0", - "@oxlint/binding-linux-riscv64-musl": "1.63.0", - "@oxlint/binding-linux-s390x-gnu": "1.63.0", - "@oxlint/binding-linux-x64-gnu": "1.63.0", - "@oxlint/binding-linux-x64-musl": "1.63.0", - "@oxlint/binding-openharmony-arm64": "1.63.0", - "@oxlint/binding-win32-arm64-msvc": "1.63.0", - "@oxlint/binding-win32-ia32-msvc": "1.63.0", - "@oxlint/binding-win32-x64-msvc": "1.63.0" + "@oxlint/binding-android-arm-eabi": "1.65.0", + "@oxlint/binding-android-arm64": "1.65.0", + "@oxlint/binding-darwin-arm64": "1.65.0", + "@oxlint/binding-darwin-x64": "1.65.0", + "@oxlint/binding-freebsd-x64": "1.65.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.65.0", + "@oxlint/binding-linux-arm-musleabihf": "1.65.0", + "@oxlint/binding-linux-arm64-gnu": "1.65.0", + "@oxlint/binding-linux-arm64-musl": "1.65.0", + "@oxlint/binding-linux-ppc64-gnu": "1.65.0", + "@oxlint/binding-linux-riscv64-gnu": "1.65.0", + "@oxlint/binding-linux-riscv64-musl": "1.65.0", + "@oxlint/binding-linux-s390x-gnu": "1.65.0", + "@oxlint/binding-linux-x64-gnu": "1.65.0", + "@oxlint/binding-linux-x64-musl": "1.65.0", + "@oxlint/binding-openharmony-arm64": "1.65.0", + "@oxlint/binding-win32-arm64-msvc": "1.65.0", + "@oxlint/binding-win32-ia32-msvc": "1.65.0", + "@oxlint/binding-win32-x64-msvc": "1.65.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.22.1" diff --git a/superset-frontend/package.json b/superset-frontend/package.json index c6e95ed3d6d..5087d8f7669 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -109,20 +109,20 @@ "@emotion/cache": "^11.4.0", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", + "@fontsource/fira-code": "^5.2.7", "@fontsource/ibm-plex-mono": "^5.2.7", + "@fontsource/inter": "^5.2.8", "@googleapis/sheets": "^13.0.1", + "@great-expectations/jsonforms-antd-renderers": "^2.2.10", + "@jsonforms/core": "^3.7.0", + "@jsonforms/react": "^3.7.0", + "@jsonforms/vanilla-renderers": "^3.7.0", "@luma.gl/constants": "~9.2.5", "@luma.gl/core": "~9.2.5", "@luma.gl/engine": "~9.2.5", "@luma.gl/gltf": "~9.2.5", "@luma.gl/shadertools": "~9.2.5", "@luma.gl/webgl": "~9.2.5", - "@fontsource/fira-code": "^5.2.7", - "@fontsource/inter": "^5.2.8", - "@great-expectations/jsonforms-antd-renderers": "^2.2.10", - "@jsonforms/core": "^3.7.0", - "@jsonforms/react": "^3.7.0", - "@jsonforms/vanilla-renderers": "^3.7.0", "@reduxjs/toolkit": "^1.9.3", "@rjsf/antd": "^5.24.13", "@rjsf/core": "^5.24.13", @@ -140,16 +140,16 @@ "@superset-ui/legacy-plugin-chart-partition": "file:./plugins/legacy-plugin-chart-partition", "@superset-ui/legacy-plugin-chart-rose": "file:./plugins/legacy-plugin-chart-rose", "@superset-ui/legacy-plugin-chart-world-map": "file:./plugins/legacy-plugin-chart-world-map", - "@superset-ui/preset-chart-deckgl": "file:./plugins/preset-chart-deckgl", "@superset-ui/legacy-preset-chart-nvd3": "file:./plugins/legacy-preset-chart-nvd3", "@superset-ui/plugin-chart-ag-grid-table": "file:./plugins/plugin-chart-ag-grid-table", "@superset-ui/plugin-chart-cartodiagram": "file:./plugins/plugin-chart-cartodiagram", "@superset-ui/plugin-chart-echarts": "file:./plugins/plugin-chart-echarts", - "@superset-ui/plugin-chart-point-cluster-map": "file:./plugins/plugin-chart-point-cluster-map", "@superset-ui/plugin-chart-handlebars": "file:./plugins/plugin-chart-handlebars", "@superset-ui/plugin-chart-pivot-table": "file:./plugins/plugin-chart-pivot-table", + "@superset-ui/plugin-chart-point-cluster-map": "file:./plugins/plugin-chart-point-cluster-map", "@superset-ui/plugin-chart-table": "file:./plugins/plugin-chart-table", "@superset-ui/plugin-chart-word-cloud": "file:./plugins/plugin-chart-word-cloud", + "@superset-ui/preset-chart-deckgl": "file:./plugins/preset-chart-deckgl", "@superset-ui/switchboard": "file:./packages/superset-ui-switchboard", "@types/d3-format": "^3.0.1", "@types/d3-selection": "^3.0.11", @@ -350,7 +350,7 @@ "lightningcss": "^1.32.0", "mini-css-extract-plugin": "^2.10.2", "open-cli": "^9.0.0", - "oxlint": "^1.63.0", + "oxlint": "^1.65.0", "po2json": "^0.4.5", "prettier": "3.8.3", "prettier-plugin-packagejson": "^3.0.2", diff --git a/superset-frontend/packages/superset-ui-core/src/components/AsyncAceEditor/AsyncAceEditor.test.tsx b/superset-frontend/packages/superset-ui-core/src/components/AsyncAceEditor/AsyncAceEditor.test.tsx index 358cb263e05..0e41cf4dc35 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/AsyncAceEditor/AsyncAceEditor.test.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/AsyncAceEditor/AsyncAceEditor.test.tsx @@ -108,13 +108,13 @@ test('renders ConfigEditor', async () => { test('renders a custom placeholder', () => { const aceModules: AceModule[] = ['mode/css', 'theme/github']; const editorOptions: AsyncAceEditorOptions = { - placeholder: () =>

Custom placeholder

, + placeholder: () =>

Custom placeholder

, }; const Editor = AsyncAceEditor(aceModules, editorOptions); render(); - expect(screen.getByRole('paragraph')).toBeInTheDocument(); + expect(screen.getByText('Custom placeholder')).toBeInTheDocument(); }); test('registers afterExec event listener for command handling', async () => { diff --git a/superset-frontend/packages/superset-ui-core/src/components/TableCollection/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/TableCollection/index.tsx index bc6ec88ab65..b9e00f5940f 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/TableCollection/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/TableCollection/index.tsx @@ -307,7 +307,7 @@ function TableCollection({ components={{ header: { cell: (props: HTMLAttributes) => ( - + ), }, body: { diff --git a/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx b/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx index 495a1ae6d1d..0c9a1dff575 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx @@ -400,7 +400,7 @@ export default typedMemo(function DataTable({ prepareRow(row); const { key: rowKey, ...rowProps } = row.getRowProps(); return ( - + {row.cells.map(cell => cell.render('Cell', { key: cell.column.id }), )} @@ -421,11 +421,7 @@ export default typedMemo(function DataTable({ const { key: footerGroupKey, ...footerGroupProps } = footerGroup.getHeaderGroupProps(); return ( - + {footerGroup.headers.map(column => column.render('Footer', { key: column.id }), )} diff --git a/superset-frontend/src/dashboard/components/gridComponents/Markdown/Markdown.test.tsx b/superset-frontend/src/dashboard/components/gridComponents/Markdown/Markdown.test.tsx index 970c98131a1..dcae5eb5944 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Markdown/Markdown.test.tsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Markdown/Markdown.test.tsx @@ -41,7 +41,6 @@ jest.mock('src/core/editors', () => ({ onBlur?: (v: string) => void; }) => (