diff --git a/docs/yarn.lock b/docs/yarn.lock index 6e16425eddc8..62d62e53ac93 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -9084,9 +9084,9 @@ lodash.uniq@^4.5.0: integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + version "4.17.23" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" + integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== longest-streak@^3.0.0: version "3.1.0" diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index de103f6e8282..b168effbd383 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -138,7 +138,7 @@ "yargs": "^17.7.2" }, "devDependencies": { - "@applitools/eyes-storybook": "^3.63.4", + "@applitools/eyes-storybook": "^3.63.8", "@babel/cli": "^7.28.6", "@babel/compat-data": "^7.28.4", "@babel/core": "^7.28.6", @@ -251,7 +251,7 @@ "jest-websocket-mock": "^2.5.0", "jsdom": "^27.4.0", "lerna": "^8.2.3", - "lightningcss": "^1.30.2", + "lightningcss": "^1.31.1", "mini-css-extract-plugin": "^2.10.0", "open-cli": "^8.0.0", "oxlint": "^1.41.0", @@ -459,24 +459,24 @@ "link": true }, "node_modules/@applitools/core": { - "version": "4.54.1", - "resolved": "https://registry.npmjs.org/@applitools/core/-/core-4.54.1.tgz", - "integrity": "sha512-A6GDeTc9UOLc/1RYMntmRS39gaX4RhltDHcS0hVEjm9QyJirVV+l4TQDkhfUhOBfBCezFZzOLX75iZwGJAqjzA==", + "version": "4.55.0", + "resolved": "https://registry.npmjs.org/@applitools/core/-/core-4.55.0.tgz", + "integrity": "sha512-BaTra6wFhUmpwrVUcVhaDQ4dRySxuGMmDq1OMXFPlFUc6JfTum8xawlOGReaXyi6sr0oVz50P6o6AFhjxUeFZA==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@applitools/core-base": "1.31.0", - "@applitools/dom-capture": "11.6.7", - "@applitools/dom-snapshot": "4.15.4", - "@applitools/driver": "1.24.3", - "@applitools/ec-client": "1.12.15", + "@applitools/core-base": "1.31.1", + "@applitools/dom-capture": "11.6.8", + "@applitools/dom-snapshot": "4.15.6", + "@applitools/driver": "1.25.0", + "@applitools/ec-client": "1.12.17", "@applitools/logger": "2.2.7", - "@applitools/nml-client": "1.11.13", + "@applitools/nml-client": "1.11.15", "@applitools/req": "1.8.7", - "@applitools/screenshoter": "3.12.10", + "@applitools/screenshoter": "3.12.12", "@applitools/snippets": "2.7.0", "@applitools/socket": "1.3.8", - "@applitools/spec-driver-webdriver": "1.5.3", + "@applitools/spec-driver-webdriver": "1.5.5", "@applitools/ufg-client": "1.18.3", "@applitools/utils": "1.14.1", "@types/ws": "8.5.5", @@ -498,9 +498,9 @@ } }, "node_modules/@applitools/core-base": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/@applitools/core-base/-/core-base-1.31.0.tgz", - "integrity": "sha512-7KBiOqstj8+CUTEhtc9sxUmxUtVdwgHiTeRZEO8Yi1L/0Y6/lriOMO6tEg/boKrLPrVaiIglbTEAMQbUe5vw0w==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/@applitools/core-base/-/core-base-1.31.1.tgz", + "integrity": "sha512-d785kA2kK0EUBgOwxscc9FggXaEyU6rFn4xPmNv4Qj73CUUGJKH1NvugKHEeWt58Ve9J2OrSWlG1e+VblbbRmw==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { @@ -533,9 +533,9 @@ } }, "node_modules/@applitools/dom-capture": { - "version": "11.6.7", - "resolved": "https://registry.npmjs.org/@applitools/dom-capture/-/dom-capture-11.6.7.tgz", - "integrity": "sha512-AeUWYKJmlmGSlWrH3fSFKmXSOpUz1gDfm25eFvBfxDLs4GjQaZ9bHph7t+85T5sX56dRIxi6s5Vhfyp9cuz6dQ==", + "version": "11.6.8", + "resolved": "https://registry.npmjs.org/@applitools/dom-capture/-/dom-capture-11.6.8.tgz", + "integrity": "sha512-pFZxRAREb5wHHVbytXin5UStzRLIu7NNfPUBFSwsFD96ftJwu/MMDoLF4v+svwrk9U60rf6tPhkigO4gKYB5Pw==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { @@ -557,9 +557,9 @@ } }, "node_modules/@applitools/dom-snapshot": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/@applitools/dom-snapshot/-/dom-snapshot-4.15.4.tgz", - "integrity": "sha512-n2IILyrUomrkZCELKCgRIJ6MsFoGH6W/0hCusPc3CM12uD3XwaEBA5XYQP2mt3B0IX1AXsjSk5QQtZ0DxjFLwg==", + "version": "4.15.6", + "resolved": "https://registry.npmjs.org/@applitools/dom-snapshot/-/dom-snapshot-4.15.6.tgz", + "integrity": "sha512-RiYbG6hjrw4hFwiW6nR83WPqdiJacisF++BaoKt8DDu8MWmNiDXalpTUauf2kpvPJYSRNhIvTVZMmSpsvGol7A==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { @@ -587,9 +587,9 @@ } }, "node_modules/@applitools/driver": { - "version": "1.24.3", - "resolved": "https://registry.npmjs.org/@applitools/driver/-/driver-1.24.3.tgz", - "integrity": "sha512-Xqx4imO7qW5Lr9iw6OwxMzFsdWaCKFfa0I+sTm6QRhpjkzfjWmGo58pheXn6rbw+IrmODt7aqS6HQ6mc8svijQ==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@applitools/driver/-/driver-1.25.0.tgz", + "integrity": "sha512-/C3Ogudte23am5+Udd0ATWpzPbuWNOCfH8LaFuzhH5qfdsl/m91E0O9Z6dU5drhxk2gsMD/CzdL+226v0FSCTg==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { @@ -603,18 +603,18 @@ } }, "node_modules/@applitools/ec-client": { - "version": "1.12.15", - "resolved": "https://registry.npmjs.org/@applitools/ec-client/-/ec-client-1.12.15.tgz", - "integrity": "sha512-jiY8z+LCx1Iw0f5SI47g1xXH3Cg5wvdRL3dIekodqQqVLctccL01xB9hk/HvHlxHHaxgsAw3QTJKu/TTl3yCVA==", + "version": "1.12.17", + "resolved": "https://registry.npmjs.org/@applitools/ec-client/-/ec-client-1.12.17.tgz", + "integrity": "sha512-yrCyS9MAgREMN8D4vLcQbVfNMGDWAp7wkwhtpJ+tQzPny3udmSR76vyrRDYDI68t23KcrX3agzK8LeLF+r9xPg==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@applitools/core-base": "1.31.0", - "@applitools/driver": "1.24.3", + "@applitools/core-base": "1.31.1", + "@applitools/driver": "1.25.0", "@applitools/logger": "2.2.7", "@applitools/req": "1.8.7", "@applitools/socket": "1.3.8", - "@applitools/spec-driver-webdriver": "1.5.3", + "@applitools/spec-driver-webdriver": "1.5.5", "@applitools/tunnel-client": "1.11.5", "@applitools/utils": "1.14.1", "abort-controller": "3.0.0", @@ -683,13 +683,13 @@ } }, "node_modules/@applitools/eyes": { - "version": "1.36.19", - "resolved": "https://registry.npmjs.org/@applitools/eyes/-/eyes-1.36.19.tgz", - "integrity": "sha512-DLYTvOhF+5+LRiU8Lv8nPIrFabG8mCnYS9E68VdC5mERlMF/JI881E6etlo2rtNMEPK967BJIj9qpU1SzZUlGw==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@applitools/eyes/-/eyes-1.38.0.tgz", + "integrity": "sha512-dKAT2hX1wRm1yFBnZIqWxnbDXNFEKHw8N3BTuEHRNhJQ6R/4nsLgbQMfz3B7b4RgL592ZwnpF052l2PQ0/EONw==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@applitools/core": "4.54.1", + "@applitools/core": "4.55.0", "@applitools/logger": "2.2.7", "@applitools/utils": "1.14.1", "chalk": "4.1.2", @@ -703,19 +703,19 @@ } }, "node_modules/@applitools/eyes-storybook": { - "version": "3.63.4", - "resolved": "https://registry.npmjs.org/@applitools/eyes-storybook/-/eyes-storybook-3.63.4.tgz", - "integrity": "sha512-z0hyIp0YU0VTjgQ8HBHt7jfwI1kIjpZF3DDLbr172qTkhvyibp9OJD0ZV2D0ES1KYTztGIeBs7ec/lGUTztZYA==", + "version": "3.63.8", + "resolved": "https://registry.npmjs.org/@applitools/eyes-storybook/-/eyes-storybook-3.63.8.tgz", + "integrity": "sha512-fyB1ECdm36acO8r1NQciGt4xJuelO+2j3kCw0cj6UzqQ1x+56G6IgxGUz8jPODkd2UuyIGdWp+Fi4f7ynxORHQ==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@applitools/core": "4.54.1", - "@applitools/driver": "1.24.3", - "@applitools/eyes": "1.36.19", + "@applitools/core": "4.55.0", + "@applitools/driver": "1.25.0", + "@applitools/eyes": "1.38.0", "@applitools/functional-commons": "1.6.0", "@applitools/logger": "2.2.7", "@applitools/monitoring-commons": "1.0.19", - "@applitools/spec-driver-puppeteer": "1.6.9", + "@applitools/spec-driver-puppeteer": "1.7.0", "@applitools/ufg-client": "1.18.3", "@applitools/utils": "1.14.1", "@inquirer/prompts": "7.0.1", @@ -828,9 +828,9 @@ } }, "node_modules/@applitools/nml-client": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/@applitools/nml-client/-/nml-client-1.11.13.tgz", - "integrity": "sha512-gjBHN845crqfKYSs2F5KEi+v4tGRx6nQvC7nSws2IhO4EqCVqS+p1B+39wDDOwRITwZMek9Nn+uc5F9MB+pVVQ==", + "version": "1.11.15", + "resolved": "https://registry.npmjs.org/@applitools/nml-client/-/nml-client-1.11.15.tgz", + "integrity": "sha512-6mgSmNPMgxwPP643dMsMGpp10q4dUM3Tc/1gQ0cous1b5D/dbwvQ83MaA6UdYmfsn9qw58+6lfN2wwRX8EY+qQ==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { @@ -842,7 +842,7 @@ "node": ">=12.13.0" }, "peerDependencies": { - "@applitools/core-base": "1.31.0" + "@applitools/core-base": "1.31.1" } }, "node_modules/@applitools/req": { @@ -892,9 +892,9 @@ } }, "node_modules/@applitools/screenshoter": { - "version": "3.12.10", - "resolved": "https://registry.npmjs.org/@applitools/screenshoter/-/screenshoter-3.12.10.tgz", - "integrity": "sha512-49kqoiunGB7nQiEgp/iu3fEz5xcah28fDcudu74dhUhjEkmWP8qh8+Y26Ea76UjmaDb0R7UNi4LvWlTrwa90Sw==", + "version": "3.12.12", + "resolved": "https://registry.npmjs.org/@applitools/screenshoter/-/screenshoter-3.12.12.tgz", + "integrity": "sha512-dqUrqNMzFTVs0JgqfKtxCIInuQjKGGslkUWrK0Ne0DhiWrlKkSnxib32pWFGboO1Ir02690lNxiQ9D6W9sb6BA==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { @@ -932,13 +932,13 @@ } }, "node_modules/@applitools/spec-driver-puppeteer": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@applitools/spec-driver-puppeteer/-/spec-driver-puppeteer-1.6.9.tgz", - "integrity": "sha512-DNJr6DEl+6uKN+9fKwclZ6QcdlNFjn6bCH4KbGy9b3CXfzHS/QicXaGMeVENa4ItosDOe3eSE8nrEq+w/p1rgQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@applitools/spec-driver-puppeteer/-/spec-driver-puppeteer-1.7.0.tgz", + "integrity": "sha512-gQLc6XLlbW5pYBAZ4EMBnkl9xzR9P7slVTjp9/m6ogcvob2NIa3us4zGQJLB9F9rEANtK6hLeQYUfkBZNPTF9g==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@applitools/driver": "1.24.3", + "@applitools/driver": "1.25.0", "@applitools/utils": "1.14.1" }, "engines": { @@ -949,13 +949,13 @@ } }, "node_modules/@applitools/spec-driver-webdriver": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@applitools/spec-driver-webdriver/-/spec-driver-webdriver-1.5.3.tgz", - "integrity": "sha512-Fi4YfdP6mjZE1UdVlNA8f5yZNxHrklZ1TKlogcsRR7QA0cxKz6hd32+f0/trFIgkv/eJcsTSudpNPftg6WgV1w==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@applitools/spec-driver-webdriver/-/spec-driver-webdriver-1.5.5.tgz", + "integrity": "sha512-OQJngJrzPOHHhnfWcvCsLWU+nVfZaQIvvyZLeFIgO9aArDrSmsSYO/lQSr8qRF0LX+oK8BXaqR13nS+NkZXdPQ==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@applitools/driver": "1.24.3", + "@applitools/driver": "1.25.0", "@applitools/utils": "1.14.1", "http-proxy-agent": "5.0.0", "https-proxy-agent": "5.0.1" @@ -42437,9 +42437,9 @@ } }, "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -42453,23 +42453,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", "cpu": [ "arm64" ], @@ -42488,9 +42488,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", "cpu": [ "arm64" ], @@ -42509,9 +42509,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", "cpu": [ "x64" ], @@ -42530,9 +42530,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", "cpu": [ "x64" ], @@ -42551,9 +42551,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", "cpu": [ "arm" ], @@ -42572,9 +42572,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", "cpu": [ "arm64" ], @@ -42593,9 +42593,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", "cpu": [ "arm64" ], @@ -42614,9 +42614,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", "cpu": [ "x64" ], @@ -42635,9 +42635,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", "cpu": [ "x64" ], @@ -42656,9 +42656,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", "cpu": [ "arm64" ], @@ -42677,9 +42677,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", "cpu": [ "x64" ], @@ -42844,9 +42844,9 @@ "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", - "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", "license": "MIT" }, "node_modules/lodash.camelcase": { @@ -47331,9 +47331,9 @@ } }, "node_modules/pino-std-serializers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", "dev": true, "license": "MIT" }, @@ -60621,7 +60621,7 @@ "license": "Apache-2.0", "dependencies": { "chalk": "^5.6.2", - "lodash-es": "^4.17.22", + "lodash-es": "^4.17.23", "yeoman-generator": "^7.5.1", "yosay": "^3.0.0" }, diff --git a/superset-frontend/package.json b/superset-frontend/package.json index 675fa438cb26..e8d6cf42229c 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -219,7 +219,7 @@ "yargs": "^17.7.2" }, "devDependencies": { - "@applitools/eyes-storybook": "^3.63.4", + "@applitools/eyes-storybook": "^3.63.8", "@babel/cli": "^7.28.6", "@babel/compat-data": "^7.28.4", "@babel/core": "^7.28.6", @@ -332,7 +332,7 @@ "jest-websocket-mock": "^2.5.0", "jsdom": "^27.4.0", "lerna": "^8.2.3", - "lightningcss": "^1.30.2", + "lightningcss": "^1.31.1", "mini-css-extract-plugin": "^2.10.0", "open-cli": "^8.0.0", "oxlint": "^1.41.0", diff --git a/superset-frontend/packages/generator-superset/package.json b/superset-frontend/packages/generator-superset/package.json index 6b6be6360273..2fba902989f6 100644 --- a/superset-frontend/packages/generator-superset/package.json +++ b/superset-frontend/packages/generator-superset/package.json @@ -29,7 +29,7 @@ }, "dependencies": { "chalk": "^5.6.2", - "lodash-es": "^4.17.22", + "lodash-es": "^4.17.23", "yeoman-generator": "^7.5.1", "yosay": "^3.0.0" }, diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 4d72be41d8af..4113a3e8fe55 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -717,9 +717,13 @@ def get_oauth2_token( "redirect_uri": config["redirect_uri"], "grant_type": "authorization_code", } - if config["request_content_type"] == "data": - return requests.post(uri, data=req_body, timeout=timeout).json() - return requests.post(uri, json=req_body, timeout=timeout).json() + response = ( + requests.post(uri, data=req_body, timeout=timeout) + if config["request_content_type"] == "data" + else requests.post(uri, json=req_body, timeout=timeout) + ) + response.raise_for_status() + return response.json() @classmethod def get_oauth2_fresh_token( @@ -738,9 +742,13 @@ def get_oauth2_fresh_token( "refresh_token": refresh_token, "grant_type": "refresh_token", } - if config["request_content_type"] == "data": - return requests.post(uri, data=req_body, timeout=timeout).json() - return requests.post(uri, json=req_body, timeout=timeout).json() + response = ( + requests.post(uri, data=req_body, timeout=timeout) + if config["request_content_type"] == "data" + else requests.post(uri, json=req_body, timeout=timeout) + ) + response.raise_for_status() + return response.json() @classmethod def get_allows_alias_in_select( diff --git a/superset/models/core.py b/superset/models/core.py index cb7bdf2d3527..d13c14b65ab6 100755 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -896,9 +896,7 @@ def get_all_table_names_in_schema( ) } except Exception as ex: - if self.is_oauth2_enabled() and self.db_engine_spec.needs_oauth2(ex): - self.start_oauth2_dance() - + self._handle_oauth2_error(ex) raise self.db_engine_spec.get_dbapi_mapped_exception(ex) from ex @cache_util.memoized_func( @@ -933,9 +931,7 @@ def get_all_view_names_in_schema( ) } except Exception as ex: - if self.is_oauth2_enabled() and self.db_engine_spec.needs_oauth2(ex): - self.start_oauth2_dance() - + self._handle_oauth2_error(ex) raise self.db_engine_spec.get_dbapi_mapped_exception(ex) from ex @cache_util.memoized_func( @@ -972,9 +968,7 @@ def get_all_materialized_view_names_in_schema( ) } except Exception as ex: - if self.is_oauth2_enabled() and self.db_engine_spec.needs_oauth2(ex): - self.start_oauth2_dance() - + self._handle_oauth2_error(ex) raise self.db_engine_spec.get_dbapi_mapped_exception(ex) from ex return set() @@ -1003,9 +997,7 @@ def get_all_schema_names(self, *, catalog: str | None = None) -> set[str]: with self.get_inspector(catalog=catalog) as inspector: return self.db_engine_spec.get_schema_names(inspector) except Exception as ex: - if self.is_oauth2_enabled() and self.db_engine_spec.needs_oauth2(ex): - self.start_oauth2_dance() - + self._handle_oauth2_error(ex) raise self.db_engine_spec.get_dbapi_mapped_exception(ex) from ex @cache_util.memoized_func( @@ -1022,9 +1014,7 @@ def get_all_catalog_names(self) -> set[str]: with self.get_inspector() as inspector: return self.db_engine_spec.get_catalog_names(self, inspector) except Exception as ex: - if self.is_oauth2_enabled() and self.db_engine_spec.needs_oauth2(ex): - self.start_oauth2_dance() - + self._handle_oauth2_error(ex) raise self.db_engine_spec.get_dbapi_mapped_exception(ex) from ex @property @@ -1261,6 +1251,10 @@ def get_oauth2_config(self) -> OAuth2ClientConfig | None: if oauth2_client_info := encrypted_extra.get("oauth2_client_info"): schema = OAuth2ClientConfigSchema() client_config = schema.load(oauth2_client_info) + if "request_content_type" not in oauth2_client_info: + client_config["request_content_type"] = ( + self.db_engine_spec.oauth2_token_request_type + ) return cast(OAuth2ClientConfig, client_config) return self.db_engine_spec.get_oauth2_config() @@ -1275,6 +1269,16 @@ def start_oauth2_dance(self) -> None: """ return self.db_engine_spec.start_oauth2_dance(self) + def _handle_oauth2_error(self, ex: Exception) -> None: + """ + Handle exceptions that may require OAuth2 authentication. + + If OAuth2 is enabled and the exception indicates that OAuth2 is needed, + starts the OAuth2 dance. + """ + if self.is_oauth2_enabled() and self.db_engine_spec.needs_oauth2(ex): + self.start_oauth2_dance() + def purge_oauth2_tokens(self) -> None: """ Delete all OAuth2 tokens associated with this database. diff --git a/superset/utils/oauth2.py b/superset/utils/oauth2.py index ebe1f4012eb4..cd1a2a14d9e5 100644 --- a/superset/utils/oauth2.py +++ b/superset/utils/oauth2.py @@ -189,7 +189,10 @@ class OAuth2ClientConfigSchema(Schema): scope = fields.String(required=True) redirect_uri = fields.String( required=False, - load_default=lambda: url_for("DatabaseRestApi.oauth2", _external=True), + load_default=lambda: app.config.get( + "DATABASE_OAUTH2_REDIRECT_URI", + url_for("DatabaseRestApi.oauth2", _external=True), + ), ) authorization_request_uri = fields.String(required=True) token_request_uri = fields.String(required=True) diff --git a/tests/unit_tests/models/core_test.py b/tests/unit_tests/models/core_test.py index 998a1033bb00..7d7aa96ea198 100644 --- a/tests/unit_tests/models/core_test.py +++ b/tests/unit_tests/models/core_test.py @@ -660,6 +660,34 @@ def test_get_oauth2_config(app_context: None) -> None: assert database.get_oauth2_config() is None + database.encrypted_extra = json.dumps(oauth2_client_info) + assert database.get_oauth2_config() == { + "id": "my_client_id", + "secret": "my_client_secret", + "authorization_request_uri": "https://abcd1234.snowflakecomputing.com/oauth/authorize", + "token_request_uri": "https://abcd1234.snowflakecomputing.com/oauth/token-request", + "scope": "refresh_token session:role:USERADMIN", + "redirect_uri": "http://example.com/api/v1/database/oauth2/", + "request_content_type": "data", # Default value from BaseEngineSpec + } + + +def test_get_oauth2_config_token_request_type_from_db_engine_specs( + mocker: MockerFixture, app_context: None +) -> None: + """ + Test that DB Engine Spec overrides for ``oauth2_token_request_type`` are respected. + """ + database = Database( + database_name="db", + sqlalchemy_uri="postgresql://user:password@host:5432/examples", + ) + mocker.patch.object( + database.db_engine_spec, + "oauth2_token_request_type", + "json", + ) + database.encrypted_extra = json.dumps(oauth2_client_info) assert database.get_oauth2_config() == { "id": "my_client_id", @@ -672,6 +700,59 @@ def test_get_oauth2_config(app_context: None) -> None: } +def test_get_oauth2_config_custom_token_request_type_extra(app_context: None) -> None: + """ + Test passing a custom ``token_request_type`` via ``encrypted_extra`` + takes precedence. + """ + database = Database( + database_name="db", + sqlalchemy_uri="postgresql://user:password@host:5432/examples", + ) + custom_oauth2_client_info = { + "oauth2_client_info": { + **oauth2_client_info["oauth2_client_info"], + "request_content_type": "json", + } + } + + database.encrypted_extra = json.dumps(custom_oauth2_client_info) + assert database.get_oauth2_config() == { + "id": "my_client_id", + "secret": "my_client_secret", + "authorization_request_uri": "https://abcd1234.snowflakecomputing.com/oauth/authorize", + "token_request_uri": "https://abcd1234.snowflakecomputing.com/oauth/token-request", + "scope": "refresh_token session:role:USERADMIN", + "redirect_uri": "http://example.com/api/v1/database/oauth2/", + "request_content_type": "json", + } + + +def test_get_oauth2_config_redirect_uri_from_config( + mocker: MockerFixture, + app_context: None, +) -> None: + """ + Test that ``DATABASE_OAUTH2_REDIRECT_URI`` config takes precedence over + url_for default. + """ + custom_redirect_uri = "https://custom.example.com/oauth/callback" + mocker.patch.dict( + "superset.utils.oauth2.app.config", + {"DATABASE_OAUTH2_REDIRECT_URI": custom_redirect_uri}, + ) + database = Database( + database_name="db", + sqlalchemy_uri="postgresql://user:password@host:5432/examples", + ) + database.encrypted_extra = json.dumps(oauth2_client_info) + + config = database.get_oauth2_config() + + assert config is not None + assert config["redirect_uri"] == custom_redirect_uri + + def test_raw_connection_oauth_engine(mocker: MockerFixture) -> None: """ Test that we can start OAuth2 from `raw_connection()` errors.