mirror of
https://github.com/apache/superset.git
synced 2026-05-05 07:54:17 +00:00
Compare commits
14 Commits
react18-ti
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d6188374b4 | ||
|
|
2edae162f0 | ||
|
|
e80207218b | ||
|
|
76955017eb | ||
|
|
5325b87e73 | ||
|
|
e76318633e | ||
|
|
c2725e86f3 | ||
|
|
2f605724e7 | ||
|
|
ebb02d0ecf | ||
|
|
319b8a1124 | ||
|
|
2be971ce77 | ||
|
|
812f4ae080 | ||
|
|
af8d15fdfc | ||
|
|
673634f7af |
@@ -67,12 +67,12 @@
|
||||
"@storybook/preview-api": "^8.6.18",
|
||||
"@storybook/theming": "^8.6.15",
|
||||
"@superset-ui/core": "^0.20.4",
|
||||
"@swc/core": "^1.15.32",
|
||||
"@swc/core": "^1.15.33",
|
||||
"antd": "^6.3.7",
|
||||
"baseline-browser-mapping": "^2.10.24",
|
||||
"baseline-browser-mapping": "^2.10.27",
|
||||
"caniuse-lite": "^1.0.30001791",
|
||||
"docusaurus-plugin-openapi-docs": "^5.0.1",
|
||||
"docusaurus-theme-openapi-docs": "^5.0.1",
|
||||
"docusaurus-plugin-openapi-docs": "^5.0.2",
|
||||
"docusaurus-theme-openapi-docs": "^5.0.2",
|
||||
"js-yaml": "^4.1.1",
|
||||
"js-yaml-loader": "^1.2.2",
|
||||
"json-bigint": "^1.0.0",
|
||||
@@ -103,7 +103,7 @@
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-prettier": "^5.5.5",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"globals": "^17.5.0",
|
||||
"globals": "^17.6.0",
|
||||
"prettier": "^3.8.3",
|
||||
"typescript": "~6.0.3",
|
||||
"typescript-eslint": "^8.59.1",
|
||||
|
||||
167
docs/yarn.lock
167
docs/yarn.lock
@@ -4239,86 +4239,86 @@
|
||||
dependencies:
|
||||
apg-lite "^1.0.4"
|
||||
|
||||
"@swc/core-darwin-arm64@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.32.tgz#3592714588fdbb8b7a869f81ff96c7236fcf1c09"
|
||||
integrity sha512-/YWMvJDPu+AAwuUsM2G+DNQ/7zhodURGzdQyewEqcvgklAdDHs3LwQmLLnyn6SJl8DT8UOxkbzK+D1PmPeelRg==
|
||||
"@swc/core-darwin-arm64@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.33.tgz#d84134fb80417d41128739f0b9014542e3ed9dd3"
|
||||
integrity sha512-N+L0uXhuO7FIfzqwgxmzv0zIpV0qEp8wPX3QQs2p4atjMoywup2JTeDlXPw+z9pWJGCae3JjM+tZ6myclI+2gA==
|
||||
|
||||
"@swc/core-darwin-x64@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.32.tgz#965044b632933146e319862ea7e4b717eb9f83dd"
|
||||
integrity sha512-KOTXJXdAhWL+hZ77MYP3z+4pcMFaQhQ74yqyN1uz093q0YnbxpqMtYpPISbYvMHzVRNNx5kN+9RZAXEaadhWVA==
|
||||
"@swc/core-darwin-x64@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.33.tgz#0badb9834071f1c6005986571d4a96359c1d7cd0"
|
||||
integrity sha512-/Il4QHSOhV4FekbsDtkrNmKbsX26oSysvgrRswa/RYOHXAkwXDbB4jaeKq6PsJLSPkzJ2KzQ061gtBnk0vNHfA==
|
||||
|
||||
"@swc/core-linux-arm-gnueabihf@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.32.tgz#70e70ad6ad961055f4a9be9e4947e455c18239e6"
|
||||
integrity sha512-oOoxLweljlc0A4X8ybsgxV7cVaYTwBOg2iMDJcFR3Sr48C+lsv9VzSmqdK/IVIXF4W4GjLc3VqTAdSMXlfVLuQ==
|
||||
"@swc/core-linux-arm-gnueabihf@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.33.tgz#b7577a825b59d98b6a9a5c991d842046efe1c34a"
|
||||
integrity sha512-C64hBnBxq4viOPQ8hlx+2lJ23bzZBGnjw7ryALmS+0Q3zHmwO8lw1/DArLENw4Q18/0w5wdEO1k3m1wWNtKGqQ==
|
||||
|
||||
"@swc/core-linux-arm64-gnu@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.32.tgz#7b82e2cc5995e8f919e29f6ce702285f5f1c3ad1"
|
||||
integrity sha512-oDzEkdl6D6BAWdMtU5KGO7y3HR5fJcvByNLyEk9+ugj8nP5Ovb7P4kBcStBXc4MPExFGQryehiINMlmY8HlclA==
|
||||
"@swc/core-linux-arm64-gnu@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.33.tgz#304c48321494a18c67b2913c273b08674ee70d8c"
|
||||
integrity sha512-TRJfnJbX3jqpxRDRoieMzRiCBS5jOmXNb3iQXmcgjFEHKLnAgK1RZRU8Cq1MsPqO4jAJp/ld1G4O3fXuxv85uw==
|
||||
|
||||
"@swc/core-linux-arm64-musl@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.32.tgz#16c581b9f859b0175a8bab5cbf694bef7dbf95b8"
|
||||
integrity sha512-omcqjoZP/b8D8PuczVoRwJieC6ibj7qIxTftNYokz4/aSmKFHvsd7nIFfPk5ZvtzncbH4AY7+Dkr/Lp2gWxYeA==
|
||||
"@swc/core-linux-arm64-musl@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.33.tgz#d116cbc04ccb4f4ee810da6bca79d4423605dbcd"
|
||||
integrity sha512-il7tYM+CpUNzieQbwAjFT1P8zqAhmGWNAGhQZBnxurXZ0aNn+5nqYFTEUKNZl7QibtT0uQXzTZrNGHCIj6Y1Og==
|
||||
|
||||
"@swc/core-linux-ppc64-gnu@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.32.tgz#420f7744dae327c8e4917c87ced5c1b3e0a38f96"
|
||||
integrity sha512-KGkTMyz/Tbn3PBNu0AVZ4GTDFKnICrYcTiNPZq8DrvK42pnFsf3GNDrIG9E5AtQlTmC0YigkWKmu0eMcfTrmgA==
|
||||
"@swc/core-linux-ppc64-gnu@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.33.tgz#f5354dba36db9414305bab344c817d57b8b457c2"
|
||||
integrity sha512-ZtNBwN0Z7CFj9Il0FcPaKdjgP7URyKu/3RfH46vq+0paOBqLj4NYldD6Qo//Duif/7IOtAraUfDOmp0PLAufog==
|
||||
|
||||
"@swc/core-linux-s390x-gnu@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.32.tgz#9b563a3a73c544f29454e53894bfe533b9a27ffe"
|
||||
integrity sha512-G3Aa4tVS/3OGZBkoNIwUF9F6RAy+Osb4GOlo62SinLmDiErz/ykmM7KH0wkz6l9kM8jJq1HyAM6atJTUEbBk7g==
|
||||
"@swc/core-linux-s390x-gnu@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.33.tgz#016df9f4c9d7fd65b85ca9c558c5aec341f06da0"
|
||||
integrity sha512-De1IyajoOmhOYYjw/lx66bKlyDpHZTueqwpDrWgf5O7T6d1ODeJJO9/OqMBmrBQc5C+dNnlmIufHsp4QVCWufA==
|
||||
|
||||
"@swc/core-linux-x64-gnu@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.32.tgz#615c7bcc1890379dffcc74b6780e2277e65f4b61"
|
||||
integrity sha512-ERsjfGcj6CBmj3vJnGDO8m8rTvw6RqMcWo1dogOtNx3/+/0+NNpJiXDobJrr1GwInI/BHAEkvSFIH6d2LqPcUQ==
|
||||
"@swc/core-linux-x64-gnu@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.33.tgz#49f36558ede072e71999aa37f123367daed2a662"
|
||||
integrity sha512-mGTH0YxmUN+x6vRN/I6NOk5X0ogNktkwPnJ94IMvR7QjhRDwL0O8RXEDhyUM0YtwWrryBOqaJQBX4zruxEPRGw==
|
||||
|
||||
"@swc/core-linux-x64-musl@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.32.tgz#038604d25bdebb1d1ad780d827a44654fa4b5bdd"
|
||||
integrity sha512-N4Ggahe/8SUbTX50P6EdhbW9YWcgbZVb52R4cq6MK+zsoMjRq7rGvV5ztA05QnbaCYqMYx8rTY7KAIA3Crdo4Q==
|
||||
"@swc/core-linux-x64-musl@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.33.tgz#b096665f5cfeee2612325f301da5c1590b10d8f3"
|
||||
integrity sha512-hj628ZkSEJf6zMf5VMbYrG2O6QqyTIp2qwY6VlCjvIa9lAEZ5c2lfPblCLVGYubTeLJDxadLB/CxqQYOQABeEQ==
|
||||
|
||||
"@swc/core-win32-arm64-msvc@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.32.tgz#c82006e6ef92a998e96d2160b1657f5334af4d54"
|
||||
integrity sha512-01yN0o9jvo8xBTP12aPK2wW8b41jmOlGbDDlAnoynotc4pO6xA0zby9f1z6j++qXDpGBttLySq1omgVrlQKYcw==
|
||||
"@swc/core-win32-arm64-msvc@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.33.tgz#f3101263a0dbaa173ec47638c9719d0b89838bd2"
|
||||
integrity sha512-GV2oohtN2/5+KSccl86VULu3aT+LrISC8uzgSq0FRnikpD+Zwc+sBlXmoKQ+Db6jI57ITUOIB8jRkdGMABC29g==
|
||||
|
||||
"@swc/core-win32-ia32-msvc@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.32.tgz#e2ae1c95bd6599322bc6e9a82685b7537a193f7b"
|
||||
integrity sha512-fLagI9XZYNpTcmlqAcp3KBtmj7E19WCmYD80Jxj1Kn5tGNa7yxNLd3NNdWxuZGUPl5iC0/KqZru7g08gF6Fsrw==
|
||||
"@swc/core-win32-ia32-msvc@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.33.tgz#eb981ef5613d42c9220559bdb0c8bc58cf6c3eb9"
|
||||
integrity sha512-gtyvzSNR8DHKfFEA2uqb8Ld1myqi6uEg2jyeUq3ikn5ytYs7H8RpZYC8mdy4NXr8hfcdJfCLXPlYaqqfBXpoEQ==
|
||||
|
||||
"@swc/core-win32-x64-msvc@1.15.32":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.32.tgz#2535c791821054072a511dee0d13e5de9c5cd29b"
|
||||
integrity sha512-gbc2bQ/T2CiR+w0OvcVKwLOFAcPZBvmWmolbwpg1E8UrpeC03DGtyMUApOHNXNYWA3SHFrYXCQtosrcMza1YFg==
|
||||
"@swc/core-win32-x64-msvc@1.15.33":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.33.tgz#a2fed9956933027ceb368857bac4bb4ee203d47c"
|
||||
integrity sha512-d6fRqQSkJI+kmMEBWaDQ7TMl8+YjLYbwRUPZQ9DY0ORBJeTzOrG0twvfvlZ2xgw6jA0ScQKgfBm4vHLSLl5Hqg==
|
||||
|
||||
"@swc/core@^1.15.32", "@swc/core@^1.7.39":
|
||||
version "1.15.32"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.32.tgz#2333d66f4b8e7c4fded087ead13c135ff84ab9d6"
|
||||
integrity sha512-/eWL0n43D64QWEUHLtTE+jDqjkJhyidjkDhv6f0uJohOUAhywxQ9wXYp845DNNds0JpCdI4Uo0a9bl+vbXf+ew==
|
||||
"@swc/core@^1.15.33", "@swc/core@^1.7.39":
|
||||
version "1.15.33"
|
||||
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.33.tgz#2a6571c8aca961925f14beae52b3f43c18370fc6"
|
||||
integrity sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ==
|
||||
dependencies:
|
||||
"@swc/counter" "^0.1.3"
|
||||
"@swc/types" "^0.1.26"
|
||||
optionalDependencies:
|
||||
"@swc/core-darwin-arm64" "1.15.32"
|
||||
"@swc/core-darwin-x64" "1.15.32"
|
||||
"@swc/core-linux-arm-gnueabihf" "1.15.32"
|
||||
"@swc/core-linux-arm64-gnu" "1.15.32"
|
||||
"@swc/core-linux-arm64-musl" "1.15.32"
|
||||
"@swc/core-linux-ppc64-gnu" "1.15.32"
|
||||
"@swc/core-linux-s390x-gnu" "1.15.32"
|
||||
"@swc/core-linux-x64-gnu" "1.15.32"
|
||||
"@swc/core-linux-x64-musl" "1.15.32"
|
||||
"@swc/core-win32-arm64-msvc" "1.15.32"
|
||||
"@swc/core-win32-ia32-msvc" "1.15.32"
|
||||
"@swc/core-win32-x64-msvc" "1.15.32"
|
||||
"@swc/core-darwin-arm64" "1.15.33"
|
||||
"@swc/core-darwin-x64" "1.15.33"
|
||||
"@swc/core-linux-arm-gnueabihf" "1.15.33"
|
||||
"@swc/core-linux-arm64-gnu" "1.15.33"
|
||||
"@swc/core-linux-arm64-musl" "1.15.33"
|
||||
"@swc/core-linux-ppc64-gnu" "1.15.33"
|
||||
"@swc/core-linux-s390x-gnu" "1.15.33"
|
||||
"@swc/core-linux-x64-gnu" "1.15.33"
|
||||
"@swc/core-linux-x64-musl" "1.15.33"
|
||||
"@swc/core-win32-arm64-msvc" "1.15.33"
|
||||
"@swc/core-win32-ia32-msvc" "1.15.33"
|
||||
"@swc/core-win32-x64-msvc" "1.15.33"
|
||||
|
||||
"@swc/counter@^0.1.3":
|
||||
version "0.1.3"
|
||||
@@ -5794,10 +5794,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.24, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19:
|
||||
version "2.10.24"
|
||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz#6dc320c7bf53859ec2bf55d54db6d2e5c078df16"
|
||||
integrity sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==
|
||||
baseline-browser-mapping@^2.10.27, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19:
|
||||
version "2.10.27"
|
||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz#fee941c2a0b42cdf83c6427e4c830b1d0bdab2c3"
|
||||
integrity sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==
|
||||
|
||||
batch@0.6.1:
|
||||
version "0.6.1"
|
||||
@@ -6062,12 +6062,7 @@ chalk@^4.0.0, chalk@^4.1.2:
|
||||
ansi-styles "^4.1.0"
|
||||
supports-color "^7.1.0"
|
||||
|
||||
chalk@^5.0.1, chalk@^5.2.0:
|
||||
version "5.6.0"
|
||||
resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz"
|
||||
integrity sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==
|
||||
|
||||
chalk@^5.6.2:
|
||||
chalk@^5.0.1, chalk@^5.2.0, chalk@^5.6.2:
|
||||
version "5.6.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea"
|
||||
integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==
|
||||
@@ -7305,10 +7300,10 @@ doctrine@^2.1.0:
|
||||
dependencies:
|
||||
esutils "^2.0.2"
|
||||
|
||||
docusaurus-plugin-openapi-docs@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-5.0.1.tgz#2fe62b58fc1af11e3d947edc2f0d60e04f1aa149"
|
||||
integrity sha512-OVfoDovRdiS78DQYWmr2BjuOF2A6kVmJ43mgkQaAEZxASyHbUft4zUIhvfa7gqema6KNL9pVKejDievZdZ3wGQ==
|
||||
docusaurus-plugin-openapi-docs@^5.0.2:
|
||||
version "5.0.2"
|
||||
resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-5.0.2.tgz#f00028621deb9179065fe7d6a541256692ef941b"
|
||||
integrity sha512-WCC2m6PpylXZfNga+ScelTG0a7jUGtbB9+AmbR9lUj93FPryTs8VHTMJ3fKtO0senJTWgOU3MDvZw0v+mE3ztA==
|
||||
dependencies:
|
||||
"@apidevtools/json-schema-ref-parser" "^15.3.3"
|
||||
"@redocly/openapi-core" "^2.25.2"
|
||||
@@ -7326,10 +7321,10 @@ docusaurus-plugin-openapi-docs@^5.0.1:
|
||||
swagger2openapi "^7.0.8"
|
||||
xml-formatter "^3.6.6"
|
||||
|
||||
docusaurus-theme-openapi-docs@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-5.0.1.tgz#a2c2c91346b6238f6d7862752cdb02611fb5396f"
|
||||
integrity sha512-bVeb7hOqog9LKVrJzYXdNJ7/0N22lk0VE22QK+naAn5GuAvYo41JmpXW9hqLIPkEp2UbexTHoPW9SYVdUsyvvw==
|
||||
docusaurus-theme-openapi-docs@^5.0.2:
|
||||
version "5.0.2"
|
||||
resolved "https://registry.yarnpkg.com/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-5.0.2.tgz#2ab6f6b04fc2e494e24971d31432a9187c84a2fe"
|
||||
integrity sha512-BD6WhbunR6kXqtoUUDlhxO4HlCNM2nYENGr/TbiTEknkgXYKQz+FEIhY4Hyz5GSLpuhPih0CDuNl7Xkfpcz0Yw==
|
||||
dependencies:
|
||||
"@hookform/error-message" "^2.0.1"
|
||||
"@reduxjs/toolkit" "^2.8.2"
|
||||
@@ -8474,10 +8469,10 @@ globals@^15.14.0:
|
||||
resolved "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz"
|
||||
integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==
|
||||
|
||||
globals@^17.5.0:
|
||||
version "17.5.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-17.5.0.tgz#a82c641d898f8dfbe0e81f66fdff7d0de43f88c6"
|
||||
integrity sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==
|
||||
globals@^17.6.0:
|
||||
version "17.6.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-17.6.0.tgz#0f0be018d5cca8690e6375ead1f65c4bb96191fc"
|
||||
integrity sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==
|
||||
|
||||
globalthis@^1.0.4:
|
||||
version "1.0.4"
|
||||
|
||||
@@ -29,7 +29,7 @@ maintainers:
|
||||
- name: craig-rueda
|
||||
email: craig@craigrueda.com
|
||||
url: https://github.com/craig-rueda
|
||||
version: 0.15.4 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details.
|
||||
version: 0.15.5 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details.
|
||||
dependencies:
|
||||
- name: postgresql
|
||||
version: 16.7.27
|
||||
|
||||
@@ -23,7 +23,7 @@ NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs
|
||||
|
||||
# superset
|
||||
|
||||

|
||||

|
||||
|
||||
Apache Superset is a modern, enterprise-ready business intelligence web application
|
||||
|
||||
|
||||
@@ -844,6 +844,8 @@ postgresql:
|
||||
database: superset
|
||||
|
||||
image:
|
||||
registry: docker.io
|
||||
repository: bitnamilegacy/postgresql
|
||||
tag: "14.17.0-debian-12-r3"
|
||||
|
||||
## PostgreSQL Primary parameters
|
||||
@@ -918,6 +920,11 @@ redis:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
|
||||
image:
|
||||
registry: docker.io
|
||||
repository: bitnamilegacy/redis
|
||||
tag: 7.0.10-debian-11-r4
|
||||
|
||||
nodeSelector: {}
|
||||
|
||||
tolerations: []
|
||||
|
||||
@@ -95,7 +95,7 @@ dependencies = [
|
||||
"redis>=5.0.0, <6.0",
|
||||
"rison>=2.0.0, <3.0",
|
||||
"selenium>=4.14.0, <5.0",
|
||||
"shillelagh[gsheetsapi]>=1.4.3, <2.0",
|
||||
"shillelagh[gsheetsapi]>=1.4.4, <2.0",
|
||||
"sshtunnel>=0.4.0, <0.5",
|
||||
"simplejson>=3.15.0",
|
||||
"slack_sdk>=3.19.0, <4",
|
||||
@@ -149,7 +149,7 @@ fastmcp = ["fastmcp>=3.2.4,<4.0"]
|
||||
firebird = ["sqlalchemy-firebird>=0.7.0, <0.8"]
|
||||
firebolt = ["firebolt-sqlalchemy>=1.0.0, <2"]
|
||||
gevent = ["gevent>=23.9.1"]
|
||||
gsheets = ["shillelagh[gsheetsapi]>=1.4.3, <2"]
|
||||
gsheets = ["shillelagh[gsheetsapi]>=1.4.4, <2"]
|
||||
hana = ["hdbcli==2.4.162", "sqlalchemy_hana==0.4.0"]
|
||||
hive = [
|
||||
"pyhive[hive]>=0.6.5;python_version<'3.11'",
|
||||
@@ -181,7 +181,7 @@ trino = ["trino>=0.328.0"]
|
||||
prophet = ["prophet>=1.1.6, <2"]
|
||||
redshift = ["sqlalchemy-redshift>=0.8.1, <0.9"]
|
||||
risingwave = ["sqlalchemy-risingwave"]
|
||||
shillelagh = ["shillelagh[all]>=1.4.3, <2"]
|
||||
shillelagh = ["shillelagh[all]>=1.4.4, <2"]
|
||||
singlestore = ["sqlalchemy-singlestoredb>=1.1.1, <2"]
|
||||
snowflake = ["snowflake-sqlalchemy>=1.2.4, <2"]
|
||||
sqlite = ["syntaqlite>=0.1.0"]
|
||||
|
||||
@@ -381,7 +381,7 @@ selenium==4.32.0
|
||||
# via apache-superset (pyproject.toml)
|
||||
setuptools==80.9.0
|
||||
# via -r requirements/base.in
|
||||
shillelagh==1.4.3
|
||||
shillelagh==1.4.4
|
||||
# via apache-superset (pyproject.toml)
|
||||
simplejson==3.20.1
|
||||
# via apache-superset (pyproject.toml)
|
||||
|
||||
@@ -931,7 +931,7 @@ setuptools==80.9.0
|
||||
# pydata-google-auth
|
||||
# zope-event
|
||||
# zope-interface
|
||||
shillelagh==1.4.3
|
||||
shillelagh==1.4.4
|
||||
# via
|
||||
# -c requirements/base-constraint.txt
|
||||
# apache-superset
|
||||
|
||||
2
superset-frontend/package-lock.json
generated
2
superset-frontend/package-lock.json
generated
@@ -49388,7 +49388,7 @@
|
||||
"dependencies": {
|
||||
"chalk": "^5.6.2",
|
||||
"lodash-es": "^4.18.1",
|
||||
"yeoman-generator": "^8.2.2",
|
||||
"yeoman-generator": "^8.1.2",
|
||||
"yosay": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
"dependencies": {
|
||||
"chalk": "^5.6.2",
|
||||
"lodash-es": "^4.18.1",
|
||||
"yeoman-generator": "^8.2.2",
|
||||
"yeoman-generator": "^8.1.2",
|
||||
"yosay": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -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": "*",
|
||||
|
||||
28
superset-websocket/package-lock.json
generated
28
superset-websocket/package-lock.json
generated
@@ -27,10 +27,10 @@
|
||||
"@types/ws": "^8.18.1",
|
||||
"@typescript-eslint/eslint-plugin": "^8.58.0",
|
||||
"@typescript-eslint/parser": "^8.59.0",
|
||||
"eslint": "^10.2.1",
|
||||
"eslint": "^10.3.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-lodash": "^8.0.0",
|
||||
"globals": "^17.5.0",
|
||||
"globals": "^17.6.0",
|
||||
"jest": "^29.7.0",
|
||||
"prettier": "^3.8.3",
|
||||
"ts-jest": "^29.4.9",
|
||||
@@ -2794,9 +2794,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint": {
|
||||
"version": "10.2.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz",
|
||||
"integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==",
|
||||
"version": "10.3.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz",
|
||||
"integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -3402,9 +3402,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/globals": {
|
||||
"version": "17.5.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz",
|
||||
"integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==",
|
||||
"version": "17.6.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
|
||||
"integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -8578,9 +8578,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"eslint": {
|
||||
"version": "10.2.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz",
|
||||
"integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==",
|
||||
"version": "10.3.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz",
|
||||
"integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@eslint-community/eslint-utils": "^4.8.0",
|
||||
@@ -8991,9 +8991,9 @@
|
||||
}
|
||||
},
|
||||
"globals": {
|
||||
"version": "17.5.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz",
|
||||
"integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==",
|
||||
"version": "17.6.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
|
||||
"integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
|
||||
"dev": true
|
||||
},
|
||||
"graceful-fs": {
|
||||
|
||||
@@ -35,10 +35,10 @@
|
||||
"@types/ws": "^8.18.1",
|
||||
"@typescript-eslint/eslint-plugin": "^8.58.0",
|
||||
"@typescript-eslint/parser": "^8.59.0",
|
||||
"eslint": "^10.2.1",
|
||||
"eslint": "^10.3.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-lodash": "^8.0.0",
|
||||
"globals": "^17.5.0",
|
||||
"globals": "^17.6.0",
|
||||
"jest": "^29.7.0",
|
||||
"prettier": "^3.8.3",
|
||||
"ts-jest": "^29.4.9",
|
||||
|
||||
@@ -110,12 +110,13 @@ class DatetimeFormatDetector:
|
||||
else:
|
||||
full_table = table_name_quoted
|
||||
|
||||
# Build SQL query string with quoted identifiers
|
||||
# Build SQL query string with quoted identifiers.
|
||||
# The WHERE IS NOT NULL filter is intentionally omitted:
|
||||
# detect_datetime_format() already calls dropna(), and the
|
||||
# predicate forces engines like ClickHouse to scan the entire
|
||||
# table even with LIMIT, triggering max_rows_to_read errors.
|
||||
# S608: false positive - using dialect's identifier preparer
|
||||
sql = ( # noqa: S608
|
||||
f"SELECT {column_name_quoted} FROM {full_table} " # noqa: S608
|
||||
f"WHERE {column_name_quoted} IS NOT NULL" # noqa: S608
|
||||
)
|
||||
sql = f"SELECT {column_name_quoted} FROM {full_table}" # noqa: S608
|
||||
|
||||
# Apply database-specific LIMIT using apply_limit_to_sql
|
||||
# This handles different SQL dialects (LIMIT, TOP, FETCH FIRST, etc.)
|
||||
|
||||
@@ -135,7 +135,7 @@ class DatasetInfo(BaseModel):
|
||||
database_id: int | None = Field(None, description="Database ID")
|
||||
uuid: str | None = Field(None, description="Dataset UUID")
|
||||
schema_perm: str | None = Field(None, description="Schema permission string")
|
||||
url: str | None = Field(None, description="Dataset URL")
|
||||
url: str | None = Field(None, description="Explore view URL for this dataset")
|
||||
sql: str | None = Field(None, description="SQL for virtual datasets")
|
||||
main_dttm_col: str | None = Field(None, description="Main datetime column")
|
||||
offset: int | None = Field(None, description="Offset")
|
||||
@@ -707,8 +707,8 @@ def serialize_dataset_object(dataset: Any) -> DatasetInfo | None:
|
||||
else None,
|
||||
schema_perm=getattr(dataset, "schema_perm", None),
|
||||
url=(
|
||||
f"{get_superset_base_url()}/tablemodelview/edit/"
|
||||
f"{getattr(dataset, 'id', None)}"
|
||||
f"{get_superset_base_url()}/explore/"
|
||||
f"?datasource_type=table&datasource_id={getattr(dataset, 'id', None)}"
|
||||
if getattr(dataset, "id", None)
|
||||
else None
|
||||
),
|
||||
|
||||
@@ -488,6 +488,7 @@ def error_msg_from_exception(ex: Exception) -> str:
|
||||
|
||||
|
||||
def markdown(raw: str, markup_wrap: bool | None = False) -> str:
|
||||
"""Render Markdown to sanitized HTML."""
|
||||
safe_markdown_tags = {
|
||||
"h1",
|
||||
"h2",
|
||||
@@ -517,7 +518,7 @@ def markdown(raw: str, markup_wrap: bool | None = False) -> str:
|
||||
}
|
||||
safe_markdown_attrs = {
|
||||
"img": {"src", "alt", "title"},
|
||||
"a": {"href", "alt", "title"},
|
||||
"a": {"href", "alt", "title", "target"},
|
||||
}
|
||||
safe = md.markdown(
|
||||
raw or "",
|
||||
@@ -528,6 +529,7 @@ def markdown(raw: str, markup_wrap: bool | None = False) -> str:
|
||||
],
|
||||
)
|
||||
# pylint: disable=no-member
|
||||
# nh3 preserves supported link attributes and enforces a safe rel value.
|
||||
safe = nh3.clean(safe, tags=safe_markdown_tags, attributes=safe_markdown_attrs)
|
||||
if markup_wrap:
|
||||
safe = Markup(safe)
|
||||
|
||||
@@ -223,3 +223,60 @@ def test_detect_column_format_expression_column(
|
||||
|
||||
assert detected_format is None
|
||||
mock_dataset.database.get_df.assert_not_called()
|
||||
|
||||
|
||||
def test_detect_column_format_query_has_no_is_not_null(
|
||||
mock_dataset: MagicMock, mock_column: MagicMock
|
||||
) -> None:
|
||||
"""The sampling query must not include a WHERE IS NOT NULL predicate.
|
||||
|
||||
detect_datetime_format() already calls dropna(), so filtering NULLs
|
||||
in SQL is redundant. Worse, on engines like ClickHouse the predicate
|
||||
forces a full table scan even with LIMIT, triggering max_rows_to_read
|
||||
errors on large tables.
|
||||
"""
|
||||
sample_data = pd.DataFrame(
|
||||
{"date_column": ["2023-01-01", "2023-01-02", "2023-01-03"]}
|
||||
)
|
||||
mock_dataset.database.get_df.return_value = sample_data
|
||||
|
||||
captured_sql: list[str] = []
|
||||
original_get_df = mock_dataset.database.get_df
|
||||
|
||||
def capture_sql(sql: str, schema: str) -> pd.DataFrame:
|
||||
captured_sql.append(sql)
|
||||
return original_get_df.return_value
|
||||
|
||||
mock_dataset.database.get_df.side_effect = capture_sql
|
||||
|
||||
detector = DatetimeFormatDetector(sample_size=100)
|
||||
detector.detect_column_format(mock_dataset, mock_column)
|
||||
|
||||
assert len(captured_sql) == 1
|
||||
assert "IS NOT NULL" not in captured_sql[0], (
|
||||
f"Query should not contain IS NOT NULL predicate, got: {captured_sql[0]}"
|
||||
)
|
||||
|
||||
|
||||
def test_detect_column_format_with_leading_null_samples(
|
||||
mock_dataset: MagicMock, mock_column: MagicMock
|
||||
) -> None:
|
||||
"""Leading NULL values are ignored during format detection."""
|
||||
sample_data = pd.DataFrame(
|
||||
{
|
||||
"date_column": [
|
||||
None,
|
||||
None,
|
||||
"2023-01-01",
|
||||
"2023-01-02",
|
||||
"2023-01-03",
|
||||
]
|
||||
}
|
||||
)
|
||||
mock_dataset.database.get_df.return_value = sample_data
|
||||
|
||||
detector = DatetimeFormatDetector(sample_size=5)
|
||||
detected_format = detector.detect_column_format(mock_dataset, mock_column)
|
||||
|
||||
assert detected_format == "%Y-%m-%d"
|
||||
mock_dataset.database.get_df.assert_called_once()
|
||||
|
||||
@@ -84,7 +84,7 @@ def create_mock_dataset(
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = f"[{database_name}].[{schema}]"
|
||||
dataset.url = f"/tablemodelview/edit/{dataset_id}"
|
||||
dataset.url = f"/explore/?datasource_type=table&datasource_id={dataset_id}"
|
||||
dataset.database = MagicMock()
|
||||
dataset.database.database_name = database_name
|
||||
dataset.sql = None
|
||||
@@ -228,7 +228,7 @@ async def test_list_datasets_basic(mock_list, mcp_server):
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[main]"
|
||||
dataset.url = "/tablemodelview/edit/1"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=1"
|
||||
dataset.database = MagicMock()
|
||||
dataset.database.database_name = "examples"
|
||||
dataset.sql = None
|
||||
@@ -336,7 +336,7 @@ async def test_list_datasets_custom_uuid_columns(mock_list, mcp_server):
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[public]"
|
||||
dataset.url = "/tablemodelview/edit/1"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=1"
|
||||
dataset.database = MagicMock()
|
||||
dataset.database.database_name = "test_db"
|
||||
dataset.sql = None
|
||||
@@ -416,7 +416,7 @@ async def test_list_datasets_with_filters(mock_list, mcp_server):
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[main]"
|
||||
dataset.url = "/tablemodelview/edit/2"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=2"
|
||||
dataset.database = MagicMock()
|
||||
dataset.database.database_name = "examples"
|
||||
dataset.sql = None
|
||||
@@ -519,7 +519,7 @@ async def test_list_datasets_with_string_filters(mock_list, mcp_server):
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[main]"
|
||||
dataset.url = "/tablemodelview/edit/3"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=3"
|
||||
dataset.database = MagicMock()
|
||||
dataset.database.database_name = "examples"
|
||||
dataset.sql = None
|
||||
@@ -782,7 +782,7 @@ async def test_list_datasets_simple_basic(mock_list, mcp_server):
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[main]"
|
||||
dataset.url = "/tablemodelview/edit/1"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=1"
|
||||
dataset.database = MagicMock()
|
||||
dataset.database.database_name = "examples"
|
||||
dataset.sql = None
|
||||
@@ -879,7 +879,7 @@ async def test_list_datasets_simple_with_filters(mock_list, mcp_server):
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[main]"
|
||||
dataset.url = "/tablemodelview/edit/2"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=2"
|
||||
dataset.database = MagicMock()
|
||||
dataset.database.database_name = "examples"
|
||||
dataset.sql = None
|
||||
@@ -970,9 +970,13 @@ async def test_list_datasets_simple_api_error(mock_list, mcp_server):
|
||||
assert "API request failed" in str(excinfo.value)
|
||||
|
||||
|
||||
@patch(
|
||||
"superset.mcp_service.utils.url_utils.get_superset_base_url",
|
||||
return_value="http://test-superset",
|
||||
)
|
||||
@patch("superset.daos.dataset.DatasetDAO.find_by_id")
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_dataset_info_success(mock_info, mcp_server):
|
||||
async def test_get_dataset_info_success(mock_info, mock_base_url, mcp_server):
|
||||
dataset = MagicMock()
|
||||
dataset.id = 1
|
||||
dataset.table_name = "Test DatasetInfo"
|
||||
@@ -991,7 +995,7 @@ async def test_get_dataset_info_success(mock_info, mcp_server):
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[main]"
|
||||
dataset.url = "/tablemodelview/edit/1"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=1"
|
||||
dataset.database = MagicMock()
|
||||
dataset.database.database_name = "examples"
|
||||
dataset.sql = None
|
||||
@@ -1030,6 +1034,10 @@ async def test_get_dataset_info_success(mock_info, mcp_server):
|
||||
assert data["id"] == 1
|
||||
assert data["table_name"] == "Test DatasetInfo"
|
||||
assert data["database_name"] == "examples"
|
||||
assert (
|
||||
data["url"]
|
||||
== "http://test-superset/explore/?datasource_type=table&datasource_id=1"
|
||||
)
|
||||
# Check that columns and metrics are included
|
||||
assert len(data["columns"]) == 1
|
||||
assert len(data["metrics"]) == 1
|
||||
@@ -1130,7 +1138,7 @@ async def test_get_dataset_info_includes_columns_and_metrics(mock_info, mcp_serv
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[main]"
|
||||
dataset.url = "/tablemodelview/edit/10"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=10"
|
||||
dataset.sql = None
|
||||
dataset.main_dttm_col = None
|
||||
dataset.offset = 0
|
||||
@@ -1222,7 +1230,7 @@ async def test_list_datasets_includes_columns_and_metrics(mock_list, mcp_server)
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[main]"
|
||||
dataset.url = "/tablemodelview/edit/11"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=11"
|
||||
dataset.sql = None
|
||||
dataset.main_dttm_col = None
|
||||
dataset.offset = 0
|
||||
@@ -1298,7 +1306,7 @@ async def test_get_dataset_info_by_uuid(mock_find_object, mcp_server):
|
||||
dataset.is_virtual = False
|
||||
dataset.database_id = 1
|
||||
dataset.schema_perm = "[examples].[main]"
|
||||
dataset.url = "/tablemodelview/edit/1"
|
||||
dataset.url = "/explore/?datasource_type=table&datasource_id=1"
|
||||
dataset.database = MagicMock()
|
||||
dataset.database.database_name = "examples"
|
||||
dataset.sql = None
|
||||
|
||||
@@ -39,6 +39,7 @@ from superset.utils.core import (
|
||||
get_stacktrace,
|
||||
get_user_agent,
|
||||
is_test,
|
||||
markdown,
|
||||
merge_extra_filters,
|
||||
merge_extra_form_data,
|
||||
merge_request_params,
|
||||
@@ -1688,3 +1689,44 @@ def test_sanitize_url_blocks_dangerous():
|
||||
"""Test that dangerous URL schemes are blocked."""
|
||||
assert sanitize_url("javascript:alert('xss')") == ""
|
||||
assert sanitize_url("data:text/html,<script>alert(1)</script>") == ""
|
||||
|
||||
|
||||
def test_markdown_basic() -> None:
|
||||
result = markdown("**bold**")
|
||||
|
||||
assert "<strong>bold</strong>" in result
|
||||
|
||||
|
||||
def test_markdown_allows_target_blank_on_links() -> None:
|
||||
raw = '<a href="https://example.com" target="_blank">Click here</a>'
|
||||
result = markdown(raw)
|
||||
|
||||
assert 'href="https://example.com"' in result
|
||||
assert 'target="_blank"' in result
|
||||
assert 'rel="noopener noreferrer"' in result
|
||||
|
||||
|
||||
def test_markdown_replaces_custom_rel_with_safe_rel() -> None:
|
||||
raw = '<a href="https://example.com" rel="external">Click</a>'
|
||||
result = markdown(raw)
|
||||
|
||||
assert 'href="https://example.com"' in result
|
||||
assert ">Click</a>" in result
|
||||
assert 'rel="noopener noreferrer"' in result
|
||||
assert 'rel="external"' not in result
|
||||
|
||||
|
||||
def test_markdown_sanitizes_dangerous_content() -> None:
|
||||
raw = '<div><script>alert("xss")</script>Content</div>'
|
||||
result = markdown(raw)
|
||||
|
||||
assert "<script>" not in result
|
||||
assert "alert" not in result
|
||||
|
||||
|
||||
def test_markdown_with_markup_wrap() -> None:
|
||||
result = markdown("**bold**", markup_wrap=True)
|
||||
from markupsafe import Markup
|
||||
|
||||
assert isinstance(result, Markup)
|
||||
assert "<strong>bold</strong>" in str(result)
|
||||
|
||||
Reference in New Issue
Block a user