This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new cff854b06e3 chore(deps-dev): bump oxlint from 1.48.0 to 1.49.0 in
/superset-frontend (#38115)
cff854b06e3 is described below
commit cff854b06e3ec84c9332136ce30d7fffc70d3cdb
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
AuthorDate: Fri Feb 20 14:13:37 2026 -0800
chore(deps-dev): bump oxlint from 1.48.0 to 1.49.0 in /superset-frontend
(#38115)
Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot]
<49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: hainenber <[email protected]>
---
superset-frontend/package-lock.json | 166 ++++++++++-----------
superset-frontend/package.json | 2 +-
.../superset-core/src/ui/theme/utils/themeUtils.ts | 18 +--
.../plugins/legacy-plugin-chart-rose/src/Rose.ts | 2 +-
.../src/AgGridTable/components/CustomPopover.tsx | 20 +--
.../src/utils/agGridFilterConverter.ts | 82 +++++-----
.../test/Timeseries/transformProps.test.ts | 24 +--
.../plugin-chart-table/src/transformProps.ts | 45 +++---
.../DatasourceEditor/DatasourceEditor.tsx | 16 +-
.../ColumnSelectPopoverTrigger.tsx | 20 +--
.../controls/MetricControl/AdhocMetric.ts | 54 +++----
.../src/features/alerts/AlertReportModal.tsx | 28 ++--
.../src/features/databases/DatabaseModal/index.tsx | 12 +-
superset-frontend/src/pages/UserInfo/index.tsx | 8 +-
14 files changed, 250 insertions(+), 247 deletions(-)
diff --git a/superset-frontend/package-lock.json
b/superset-frontend/package-lock.json
index e6b6f27aa5f..7160c89c7c7 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -266,7 +266,7 @@
"lightningcss": "^1.31.1",
"mini-css-extract-plugin": "^2.10.0",
"open-cli": "^8.0.0",
- "oxlint": "^1.48.0",
+ "oxlint": "^1.49.0",
"po2json": "^0.4.5",
"prettier": "3.8.1",
"prettier-plugin-packagejson": "^3.0.0",
@@ -9039,9 +9039,9 @@
}
},
"node_modules/@oxlint/binding-android-arm-eabi": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.48.0.tgz",
- "integrity":
"sha512-1Pz/stJvveO9ZO7ll4ZoEY3f6j2FiUgBLBcCRCiW6ylId9L9UKs+gn3X28m3eTnoiFCkhKwmJJ+VO6vwsu7Qtg==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.49.0.tgz",
+ "integrity":
"sha512-2WPoh/2oK9r/i2R4o4J18AOrm3HVlWiHZ8TnuCaS4dX8m5ZzRmHW0I3eLxEurQLHWVruhQN7fHgZnah+ag5iQg==",
"cpu": [
"arm"
],
@@ -9056,9 +9056,9 @@
}
},
"node_modules/@oxlint/binding-android-arm64": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.48.0.tgz",
- "integrity":
"sha512-Zc42RWGE8huo6Ht0lXKjd0NH2lWNmimQHUmD0JFcvShLOuwN+RSEE/kRakc2/0LIgOUuU/R7PaDMCOdQlPgNUQ==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.49.0.tgz",
+ "integrity":
"sha512-YqJAGvNB11EzoKm1euVhZntb79alhMvWW/j12bYqdvVxn6xzEQWrEDCJg9BPo3A3tBCSUBKH7bVkAiCBqK/L1w==",
"cpu": [
"arm64"
],
@@ -9073,9 +9073,9 @@
}
},
"node_modules/@oxlint/binding-darwin-arm64": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.48.0.tgz",
- "integrity":
"sha512-jgZs563/4vaG5jH2RSt2TSh8A2jwsFdmhLXrElMdm3Mmto0HPf85FgInLSNi9HcwzQFvkYV8JofcoUg2GH1HTA==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.49.0.tgz",
+ "integrity":
"sha512-WFocCRlvVkMhChCJ2qpJfp1Gj/IjvyjuifH9Pex8m8yHonxxQa3d8DZYreuDQU3T4jvSY8rqhoRqnpc61Nlbxw==",
"cpu": [
"arm64"
],
@@ -9090,9 +9090,9 @@
}
},
"node_modules/@oxlint/binding-darwin-x64": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.48.0.tgz",
- "integrity":
"sha512-kvo87BujEUjCJREuWDC4aPh1WoXCRFFWE4C7uF6wuoMw2f6N2hypA/cHHcYn9DdL8R2RrgUZPefC8JExyeIMKA==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.49.0.tgz",
+ "integrity":
"sha512-BN0KniwvehbUfYztOMwEDkYoojGm/narf5oJf+/ap+6PnzMeWLezMaVARNIS0j3OdMkjHTEP8s3+GdPJ7WDywQ==",
"cpu": [
"x64"
],
@@ -9107,9 +9107,9 @@
}
},
"node_modules/@oxlint/binding-freebsd-x64": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.48.0.tgz",
- "integrity":
"sha512-eyzzPaHQKn0RIM+ueDfgfJF2RU//Wp4oaKs2JVoVYcM5HjbCL36+O0S3wO5Xe1NWpcZIG3cEHc/SuOCDRqZDSg==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.49.0.tgz",
+ "integrity":
"sha512-SnkAc/DPIY6joMCiP/+53Q+N2UOGMU6ULvbztpmvPJNF/jYPGhNbKtN982uj2Gs6fpbxYkmyj08QnpkD4fbHJA==",
"cpu": [
"x64"
],
@@ -9124,9 +9124,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm-gnueabihf": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.48.0.tgz",
- "integrity":
"sha512-p3kSloztK7GRO7FyO3u38UCjZxQTl92VaLDsMQAq0eGoiNmeeEF1KPeE4+Fr+LSkQhF8WvJKSuls6TwOlurdPA==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.49.0.tgz",
+ "integrity":
"sha512-6Z3EzRvpQVIpO7uFhdiGhdE8Mh3S2VWKLL9xuxVqD6fzPhyI3ugthpYXlCChXzO8FzcYIZ3t1+Kau+h2NY1hqA==",
"cpu": [
"arm"
],
@@ -9141,9 +9141,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm-musleabihf": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.48.0.tgz",
- "integrity":
"sha512-uWM+wiTqLW/V0ZmY/eyTWs8ykhIkzU+K2tz/8m35YepYEzohiUGRbnkpAFXj2ioXpQL+GUe5vmM3SLH6ozlfFw==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.49.0.tgz",
+ "integrity":
"sha512-wdjXaQYAL/L25732mLlngfst4Jdmi/HLPVHb3yfCoP5mE3lO/pFFrmOJpqWodgv29suWY74Ij+RmJ/YIG5VuzQ==",
"cpu": [
"arm"
],
@@ -9158,9 +9158,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm64-gnu": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.48.0.tgz",
- "integrity":
"sha512-OhQNPjs/OICaYqxYJjKKMaIY7p3nJ9IirXcFoHKD+CQE1BZFCeUUAknMzUeLclDCfudH9Vb/UgjFm8+ZM5puAg==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.49.0.tgz",
+ "integrity":
"sha512-oSHpm8zmSvAG1BWUumbDRSg7moJbnwoEXKAkwDf/xTQJOzvbUknq95NVQdw/AduZr5dePftalB8rzJNGBogUMg==",
"cpu": [
"arm64"
],
@@ -9175,9 +9175,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm64-musl": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.48.0.tgz",
- "integrity":
"sha512-adu5txuwGvQ4C4fjYHJD+vnY+OCwCixBzn7J3KF3iWlVHBBImcosSv+Ye+fbMMJui4HGjifNXzonjKm9pXmOiw==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.49.0.tgz",
+ "integrity":
"sha512-xeqkMOARgGBlEg9BQuPDf6ZW711X6BT5qjDyeM5XNowCJeTSdmMhpePJjTEiVbbr3t21sIlK8RE6X5bc04nWyQ==",
"cpu": [
"arm64"
],
@@ -9192,9 +9192,9 @@
}
},
"node_modules/@oxlint/binding-linux-ppc64-gnu": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.48.0.tgz",
- "integrity":
"sha512-inlQQRUnHCny/7b7wA6NjEoJSSZPNea4qnDhWyeqBYWx8ukf2kzNDSiamfhOw6bfAYPm/PVlkVRYaNXQbkLeTQ==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.49.0.tgz",
+ "integrity":
"sha512-uvcqRO6PnlJGbL7TeePhTK5+7/JXbxGbN+C6FVmfICDeeRomgQqrfVjf0lUrVpUU8ii8TSkIbNdft3M+oNlOsQ==",
"cpu": [
"ppc64"
],
@@ -9209,9 +9209,9 @@
}
},
"node_modules/@oxlint/binding-linux-riscv64-gnu": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.48.0.tgz",
- "integrity":
"sha512-YiJx6sW6bYebQDZRVWLKm/Drswx/hcjIgbLIhULSn0rRcBKc7d9V6mkqPjKDbhcxJgQD5Zi0yVccJiOdF40AWA==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.49.0.tgz",
+ "integrity":
"sha512-Dw1HkdXAwHNH+ZDserHP2RzXQmhHtpsYYI0hf8fuGAVCIVwvS6w1+InLxpPMY25P8ASRNiFN3hADtoh6lI+4lg==",
"cpu": [
"riscv64"
],
@@ -9226,9 +9226,9 @@
}
},
"node_modules/@oxlint/binding-linux-riscv64-musl": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.48.0.tgz",
- "integrity":
"sha512-zwSqxMgmb2ITamNfDv9Q9EKBc/4ZhCBP9gkg2hhcgR6sEVGPUDl1AKPC89CBKMxkmPUi3685C38EvqtZn5OtHw==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.49.0.tgz",
+ "integrity":
"sha512-EPlMYaA05tJ9km/0dI9K57iuMq3Tw+nHst7TNIegAJZrBPtsOtYaMFZEaWj02HA8FI5QvSnRHMt+CI+RIhXJBQ==",
"cpu": [
"riscv64"
],
@@ -9243,9 +9243,9 @@
}
},
"node_modules/@oxlint/binding-linux-s390x-gnu": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.48.0.tgz",
- "integrity":
"sha512-c/+2oUWAOsQB5JTem0rW8ODlZllF6pAtGSGXoLSvPTonKI1vAwaKhD9Qw1X36jRbcI3Etkpu/9z/RRjMba8vFQ==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.49.0.tgz",
+ "integrity":
"sha512-yZiQL9qEwse34aMbnMb5VqiAWfDY+fLFuoJbHOuzB1OaJZbN1MRF9Nk+W89PIpGr5DNPDipwjZb8+Q7wOywoUQ==",
"cpu": [
"s390x"
],
@@ -9260,9 +9260,9 @@
}
},
"node_modules/@oxlint/binding-linux-x64-gnu": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.48.0.tgz",
- "integrity":
"sha512-PhauDqeFW5DGed6QxCY5lXZYKSlcBdCXJnH03ZNU6QmDZ0BFM/zSy1oPT2MNb1Afx1G6yOOVk8ErjWsQ7c59ng==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.49.0.tgz",
+ "integrity":
"sha512-CcCDwMMXSchNkhdgvhVn3DLZ4EnBXAD8o8+gRzahg+IdSt/72y19xBgShJgadIRF0TsRcV/MhDUMwL5N/W54aQ==",
"cpu": [
"x64"
],
@@ -9277,9 +9277,9 @@
}
},
"node_modules/@oxlint/binding-linux-x64-musl": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.48.0.tgz",
- "integrity":
"sha512-6d7LIFFZGiavbHndhf1cK9kG9qmy2Dmr37sV9Ep7j3H+ciFdKSuOzdLh85mEUYMih+b+esMDlF5DU0WQRZPQjw==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.49.0.tgz",
+ "integrity":
"sha512-u3HfKV8BV6t6UCCbN0RRiyqcymhrnpunVmLFI8sEa5S/EBu+p/0bJ3D7LZ2KT6PsBbrB71SWq4DeFrskOVgIZg==",
"cpu": [
"x64"
],
@@ -9294,9 +9294,9 @@
}
},
"node_modules/@oxlint/binding-openharmony-arm64": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.48.0.tgz",
- "integrity":
"sha512-r+0KK9lK6vFp3tXAgDMOW32o12dxvKS3B9La1uYMGdWAMoSeu2RzG34KmzSpXu6MyLDl4aSVyZLFM8KGdEjwaw==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.49.0.tgz",
+ "integrity":
"sha512-dRDpH9fw+oeUMpM4br0taYCFpW6jQtOuEIec89rOgDA1YhqwmeRcx0XYeCv7U48p57qJ1XZHeMGM9LdItIjfzA==",
"cpu": [
"arm64"
],
@@ -9311,9 +9311,9 @@
}
},
"node_modules/@oxlint/binding-win32-arm64-msvc": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.48.0.tgz",
- "integrity":
"sha512-Nkw/MocyT3HSp0OJsKPXrcbxZqSPMTYnLLfsqsoiFKoL1ppVNL65MFa7vuTxJehPlBkjy+95gUgacZtuNMECrg==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.49.0.tgz",
+ "integrity":
"sha512-6rrKe/wL9tn0qnOy76i1/0f4Dc3dtQnibGlU4HqR/brVHlVjzLSoaH0gAFnLnznh9yQ6gcFTBFOPrcN/eKPDGA==",
"cpu": [
"arm64"
],
@@ -9328,9 +9328,9 @@
}
},
"node_modules/@oxlint/binding-win32-ia32-msvc": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.48.0.tgz",
- "integrity":
"sha512-reO1SpefvRmeZSP+WeyWkQd1ArxxDD1MyKgMUKuB8lNuUoxk9QEohYtKnsfsxJuFwMT0JTr7p9wZjouA85GzGQ==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.49.0.tgz",
+ "integrity":
"sha512-CXHLWAtLs2xG/aVy1OZiYJzrULlq0QkYpI6cd7VKMrab+qur4fXVE/B1Bp1m0h1qKTj5/FTGg6oU4qaXMjS/ug==",
"cpu": [
"ia32"
],
@@ -9345,9 +9345,9 @@
}
},
"node_modules/@oxlint/binding-win32-x64-msvc": {
- "version": "1.48.0",
- "resolved":
"https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.48.0.tgz",
- "integrity":
"sha512-T6zwhfcsrorqAybkOglZdPkTLlEwipbtdO1qjE+flbawvwOMsISoyiuaa7vM7zEyfq1hmDvMq1ndvkYFioranA==",
+ "version": "1.49.0",
+ "resolved":
"https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.49.0.tgz",
+ "integrity":
"sha512-VteIelt78kwzSglOozaQcs6BCS4Lk0j+QA+hGV0W8UeyaqQ3XpbZRhDU55NW1PPvCy1tg4VXsTlEaPovqto7nQ==",
"cpu": [
"x64"
],
@@ -39360,9 +39360,9 @@
}
},
"node_modules/oxlint": {
- "version": "1.48.0",
- "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.48.0.tgz",
- "integrity":
"sha512-m5vyVBgPtPhVCJc3xI//8je9lRc8bYuYB4R/1PH3VPGOjA4vjVhkHtyJukdEjYEjwrw4Qf1eIf+pP9xvfhfMow==",
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.49.0.tgz",
+ "integrity":
"sha512-YZffp0gM+63CJoRhHjtjRnwKtAgUnXM6j63YQ++aigji2NVvLGsUlrXo9gJUXZOdcbfShLYtA6RuTu8GZ4lzOQ==",
"dev": true,
"license": "MIT",
"bin": {
@@ -39375,28 +39375,28 @@
"url": "https://github.com/sponsors/Boshen"
},
"optionalDependencies": {
- "@oxlint/binding-android-arm-eabi": "1.48.0",
- "@oxlint/binding-android-arm64": "1.48.0",
- "@oxlint/binding-darwin-arm64": "1.48.0",
- "@oxlint/binding-darwin-x64": "1.48.0",
- "@oxlint/binding-freebsd-x64": "1.48.0",
- "@oxlint/binding-linux-arm-gnueabihf": "1.48.0",
- "@oxlint/binding-linux-arm-musleabihf": "1.48.0",
- "@oxlint/binding-linux-arm64-gnu": "1.48.0",
- "@oxlint/binding-linux-arm64-musl": "1.48.0",
- "@oxlint/binding-linux-ppc64-gnu": "1.48.0",
- "@oxlint/binding-linux-riscv64-gnu": "1.48.0",
- "@oxlint/binding-linux-riscv64-musl": "1.48.0",
- "@oxlint/binding-linux-s390x-gnu": "1.48.0",
- "@oxlint/binding-linux-x64-gnu": "1.48.0",
- "@oxlint/binding-linux-x64-musl": "1.48.0",
- "@oxlint/binding-openharmony-arm64": "1.48.0",
- "@oxlint/binding-win32-arm64-msvc": "1.48.0",
- "@oxlint/binding-win32-ia32-msvc": "1.48.0",
- "@oxlint/binding-win32-x64-msvc": "1.48.0"
- },
- "peerDependencies": {
- "oxlint-tsgolint": ">=0.12.2"
+ "@oxlint/binding-android-arm-eabi": "1.49.0",
+ "@oxlint/binding-android-arm64": "1.49.0",
+ "@oxlint/binding-darwin-arm64": "1.49.0",
+ "@oxlint/binding-darwin-x64": "1.49.0",
+ "@oxlint/binding-freebsd-x64": "1.49.0",
+ "@oxlint/binding-linux-arm-gnueabihf": "1.49.0",
+ "@oxlint/binding-linux-arm-musleabihf": "1.49.0",
+ "@oxlint/binding-linux-arm64-gnu": "1.49.0",
+ "@oxlint/binding-linux-arm64-musl": "1.49.0",
+ "@oxlint/binding-linux-ppc64-gnu": "1.49.0",
+ "@oxlint/binding-linux-riscv64-gnu": "1.49.0",
+ "@oxlint/binding-linux-riscv64-musl": "1.49.0",
+ "@oxlint/binding-linux-s390x-gnu": "1.49.0",
+ "@oxlint/binding-linux-x64-gnu": "1.49.0",
+ "@oxlint/binding-linux-x64-musl": "1.49.0",
+ "@oxlint/binding-openharmony-arm64": "1.49.0",
+ "@oxlint/binding-win32-arm64-msvc": "1.49.0",
+ "@oxlint/binding-win32-ia32-msvc": "1.49.0",
+ "@oxlint/binding-win32-x64-msvc": "1.49.0"
+ },
+ "peerDependencies": {
+ "oxlint-tsgolint": ">=0.14.1"
},
"peerDependenciesMeta": {
"oxlint-tsgolint": {
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index 965f6d347ab..17ddace909e 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -347,7 +347,7 @@
"lightningcss": "^1.31.1",
"mini-css-extract-plugin": "^2.10.0",
"open-cli": "^8.0.0",
- "oxlint": "^1.48.0",
+ "oxlint": "^1.49.0",
"po2json": "^0.4.5",
"prettier": "3.8.1",
"prettier-plugin-packagejson": "^3.0.0",
diff --git
a/superset-frontend/packages/superset-core/src/ui/theme/utils/themeUtils.ts
b/superset-frontend/packages/superset-core/src/ui/theme/utils/themeUtils.ts
index 041f9a72844..809e7f1a35c 100644
--- a/superset-frontend/packages/superset-core/src/ui/theme/utils/themeUtils.ts
+++ b/superset-frontend/packages/superset-core/src/ui/theme/utils/themeUtils.ts
@@ -47,6 +47,15 @@ export function getFontSize(theme: SupersetTheme, size?:
FontSizeKey): string {
return String(theme[key] || theme.fontSize);
}
+/**
+ * Check if the current theme is dark mode based on background color
+ * @param theme - Theme tokens from useTheme()
+ * @returns true if theme is dark, false if light
+ */
+export function isThemeDark(theme: SupersetTheme): boolean {
+ return tinycolor(theme.colorBgContainer).isDark();
+}
+
/**
* Get color variants for a given color type from theme tokens
* @param theme - Theme tokens from useTheme()
@@ -111,15 +120,6 @@ export function getColorVariants(
};
}
-/**
- * Check if the current theme is dark mode based on background color
- * @param theme - Theme tokens from useTheme()
- * @returns true if theme is dark, false if light
- */
-export function isThemeDark(theme: SupersetTheme): boolean {
- return tinycolor(theme.colorBgContainer).isDark();
-}
-
/**
* Check if a theme configuration results in a dark theme
* @param config - The theme configuration to check
diff --git a/superset-frontend/plugins/legacy-plugin-chart-rose/src/Rose.ts
b/superset-frontend/plugins/legacy-plugin-chart-rose/src/Rose.ts
index 4ead29792ce..c356ce9cf2b 100644
--- a/superset-frontend/plugins/legacy-plugin-chart-rose/src/Rose.ts
+++ b/superset-frontend/plugins/legacy-plugin-chart-rose/src/Rose.ts
@@ -17,7 +17,7 @@
* under the License.
*/
// @ts-nocheck
-/* eslint no-use-before-define: ["error", { "functions": false }] */
+/* oxlint-disable no-use-before-define: ["error", { "functions": false }] */
/* eslint-disable no-restricted-syntax */
/* eslint-disable react/sort-prop-types */
import d3 from 'd3';
diff --git
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTable/components/CustomPopover.tsx
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTable/components/CustomPopover.tsx
index 0fe0bc7474f..e630986bf69 100644
---
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTable/components/CustomPopover.tsx
+++
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTable/components/CustomPopover.tsx
@@ -36,6 +36,16 @@ const CustomPopover: React.FC<Props> = ({
const triggerRef = useRef<HTMLDivElement>(null);
const popoverRef = useRef<HTMLDivElement>(null);
+ const handleClickOutside = (event: MouseEvent) => {
+ if (
+ popoverRef.current &&
+ !popoverRef.current.contains(event.target as Node) &&
+ !triggerRef.current?.contains(event.target as Node)
+ ) {
+ onClose();
+ }
+ };
+
useEffect(() => {
const updatePosition = () => {
const rect = triggerRef.current?.getBoundingClientRect();
@@ -73,16 +83,6 @@ const CustomPopover: React.FC<Props> = ({
};
}, [isOpen]);
- const handleClickOutside = (event: MouseEvent) => {
- if (
- popoverRef.current &&
- !popoverRef.current.contains(event.target as Node) &&
- !triggerRef.current?.contains(event.target as Node)
- ) {
- onClose();
- }
- };
-
return (
<PopoverWrapper>
{cloneElement(children, { ref: triggerRef })}
diff --git
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/agGridFilterConverter.ts
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/agGridFilterConverter.ts
index 5fe226ef84d..6389f61ca8e 100644
---
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/agGridFilterConverter.ts
+++
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/agGridFilterConverter.ts
@@ -246,6 +246,47 @@ function formatValueForOperator(
return value;
}
+/**
+ * Format a date string to ISO format expected by Superset, preserving local
timezone
+ */
+export function formatDateForSuperset(dateStr: string): string {
+ // AG Grid typically provides dates in format: "YYYY-MM-DD HH:MM:SS"
+ // Superset expects: "YYYY-MM-DDTHH:MM:SS" in local timezone (not UTC)
+ const date = new Date(dateStr);
+ if (Number.isNaN(date.getTime())) {
+ return dateStr; // Return as-is if invalid
+ }
+
+ // Format date in local timezone, not UTC
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+ const seconds = String(date.getSeconds()).padStart(2, '0');
+
+ const formatted = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
+ return formatted;
+}
+
+/**
+ * Get the start of day (00:00:00) for a given date string
+ */
+export function getStartOfDay(dateStr: string): string {
+ const date = new Date(dateStr);
+ date.setHours(0, 0, 0, 0);
+ return formatDateForSuperset(date.toISOString());
+}
+
+/**
+ * Get the end of day (23:59:59) for a given date string
+ */
+export function getEndOfDay(dateStr: string): string {
+ const date = new Date(dateStr);
+ date.setHours(23, 59, 59, 999);
+ return formatDateForSuperset(date.toISOString());
+}
+
/**
* Convert a date filter to a WHERE clause
* @param columnName - Column name
@@ -418,47 +459,6 @@ function compoundFilterToWhereClause(
return result;
}
-/**
- * Format a date string to ISO format expected by Superset, preserving local
timezone
- */
-export function formatDateForSuperset(dateStr: string): string {
- // AG Grid typically provides dates in format: "YYYY-MM-DD HH:MM:SS"
- // Superset expects: "YYYY-MM-DDTHH:MM:SS" in local timezone (not UTC)
- const date = new Date(dateStr);
- if (Number.isNaN(date.getTime())) {
- return dateStr; // Return as-is if invalid
- }
-
- // Format date in local timezone, not UTC
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
- const hours = String(date.getHours()).padStart(2, '0');
- const minutes = String(date.getMinutes()).padStart(2, '0');
- const seconds = String(date.getSeconds()).padStart(2, '0');
-
- const formatted = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
- return formatted;
-}
-
-/**
- * Get the start of day (00:00:00) for a given date string
- */
-export function getStartOfDay(dateStr: string): string {
- const date = new Date(dateStr);
- date.setHours(0, 0, 0, 0);
- return formatDateForSuperset(date.toISOString());
-}
-
-/**
- * Get the end of day (23:59:59) for a given date string
- */
-export function getEndOfDay(dateStr: string): string {
- const date = new Date(dateStr);
- date.setHours(23, 59, 59, 999);
- return formatDateForSuperset(date.toISOString());
-}
-
// Converts date filters to TEMPORAL_RANGE format for Superset backend
function convertDateFilter(
columnName: string,
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 f8384bfbe78..2d5f4d9c2f0 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
@@ -89,6 +89,18 @@ function getYAxisFormatter(
return yAxis.axisLabel!.formatter!;
}
+const queriesData: ChartDataResponseResult[] = [
+ createTestQueryData(
+ createTestData(
+ [
+ { 'San Francisco': 1, 'New York': 2 },
+ { 'San Francisco': 3, 'New York': 4 },
+ ],
+ { intervalMs: 300000000 },
+ ),
+ ),
+];
+
/**
* Creates a properly typed EchartsTimeseriesChartProps for testing.
* Uses shared createEchartsTimeseriesTestChartProps with Timeseries defaults.
@@ -128,17 +140,7 @@ const formData: SqlaFormData = {
groupby: ['foo', 'bar'],
viz_type: 'my_viz',
};
-const queriesData: ChartDataResponseResult[] = [
- createTestQueryData(
- createTestData(
- [
- { 'San Francisco': 1, 'New York': 2 },
- { 'San Francisco': 3, 'New York': 4 },
- ],
- { intervalMs: 300000000 },
- ),
- ),
-];
+
describe('EchartsTimeseries transformProps', () => {
test('should transform chart props for viz', () => {
const chartProps = createTestChartProps({});
diff --git a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
index 358181e46de..08e832fce67 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
@@ -569,6 +569,29 @@ const transformProps = (
return { arrow, arrowColor, backgroundColor };
};
+ const nonCustomNorInheritShifts =
ensureIsArray(formData.time_compare).filter(
+ (shift: string) => shift !== 'custom' && shift !== 'inherit',
+ );
+ const customOrInheritShifts = ensureIsArray(formData.time_compare).filter(
+ (shift: string) => shift === 'custom' || shift === 'inherit',
+ );
+
+ let timeOffsets: string[] = [];
+
+ if (isUsingTimeComparison && !isEmpty(nonCustomNorInheritShifts)) {
+ timeOffsets = nonCustomNorInheritShifts;
+ }
+
+ // Shifts for custom or inherit time comparison
+ if (isUsingTimeComparison && !isEmpty(customOrInheritShifts)) {
+ if (customOrInheritShifts.includes('custom')) {
+ timeOffsets = timeOffsets.concat([formData.start_date_offset]);
+ }
+ if (customOrInheritShifts.includes('inherit')) {
+ timeOffsets = timeOffsets.concat(['inherit']);
+ }
+ }
+
const getBasicColorFormatter = memoizeOne(function getBasicColorFormatter(
originalData: DataRecord[] | undefined,
originalColumns: DataColumnMeta[],
@@ -653,28 +676,6 @@ const transformProps = (
const timeGrain = extractTimegrain(formData);
- const nonCustomNorInheritShifts =
ensureIsArray(formData.time_compare).filter(
- (shift: string) => shift !== 'custom' && shift !== 'inherit',
- );
- const customOrInheritShifts = ensureIsArray(formData.time_compare).filter(
- (shift: string) => shift === 'custom' || shift === 'inherit',
- );
-
- let timeOffsets: string[] = [];
-
- if (isUsingTimeComparison && !isEmpty(nonCustomNorInheritShifts)) {
- timeOffsets = nonCustomNorInheritShifts;
- }
-
- // Shifts for custom or inherit time comparison
- if (isUsingTimeComparison && !isEmpty(customOrInheritShifts)) {
- if (customOrInheritShifts.includes('custom')) {
- timeOffsets = timeOffsets.concat([formData.start_date_offset]);
- }
- if (customOrInheritShifts.includes('inherit')) {
- timeOffsets = timeOffsets.concat(['inherit']);
- }
- }
const comparisonSuffix = isUsingTimeComparison
? ensureIsArray(timeOffsets)[0]
: '';
diff --git
a/superset-frontend/src/components/Datasource/components/DatasourceEditor/DatasourceEditor.tsx
b/superset-frontend/src/components/Datasource/components/DatasourceEditor/DatasourceEditor.tsx
index 58c15ddcb28..f5592a2c645 100644
---
a/superset-frontend/src/components/Datasource/components/DatasourceEditor/DatasourceEditor.tsx
+++
b/superset-frontend/src/components/Datasource/components/DatasourceEditor/DatasourceEditor.tsx
@@ -497,6 +497,14 @@ function CollectionTabTitle({
);
}
+function FormContainer({ children }: FormContainerProps): JSX.Element {
+ return (
+ <Card padded style={{ backgroundColor: themeObject.theme.colorBgLayout }}>
+ {children}
+ </Card>
+ );
+}
+
function ColumnCollectionTable({
columns,
datasource,
@@ -766,14 +774,6 @@ function StackedField({ label, formElement }:
StackedFieldProps): JSX.Element {
);
}
-function FormContainer({ children }: FormContainerProps): JSX.Element {
- return (
- <Card padded style={{ backgroundColor: themeObject.theme.colorBgLayout }}>
- {children}
- </Card>
- );
-}
-
function OwnersSelector({
datasource,
onChange,
diff --git
a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx
b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx
index 5509eae785b..7a706967388 100644
---
a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx
+++
b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx
@@ -51,16 +51,6 @@ interface ColumnSelectPopoverTriggerProps {
selectedMetrics?: QueryFormMetric[];
}
-const ColumnSelectPopoverTriggerWrapper = (
- props: ColumnSelectPopoverTriggerProps,
-) => {
- const datasource = useSelector(
- (state: any) => state?.explore?.datasource || null,
- );
-
- return <ColumnSelectPopoverTriggerInner {...props} datasource={datasource}
/>;
-};
-
interface ColumnSelectPopoverTriggerInnerProps extends
ColumnSelectPopoverTriggerProps {
datasource?: any;
}
@@ -217,4 +207,14 @@ const ColumnSelectPopoverTriggerInner = ({
);
};
+const ColumnSelectPopoverTriggerWrapper = (
+ props: ColumnSelectPopoverTriggerProps,
+) => {
+ const datasource = useSelector(
+ (state: any) => state?.explore?.datasource || null,
+ );
+
+ return <ColumnSelectPopoverTriggerInner {...props} datasource={datasource}
/>;
+};
+
export default ColumnSelectPopoverTriggerWrapper;
diff --git
a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.ts
b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.ts
index 7bd04bd0f18..68c1d2875c8 100644
---
a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.ts
+++
b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.ts
@@ -87,33 +87,6 @@ function inferSqlExpressionAggregate(
return null;
}
-/**
- * Adapter function to create an AdhocMetric instance from a core AdhocMetric
type.
- * This bridges the type gap between @superset-ui/core's AdhocMetric and the
local class.
- */
-export function fromCoreAdhocMetric(metric: CoreAdhocMetric): AdhocMetric {
- return new AdhocMetric(metric as AdhocMetricInput);
-}
-
-/**
- * Type guard to check if an object can be used to construct an AdhocMetric.
- * Returns true for plain objects that have metric-like properties.
- */
-export function isDictionaryForAdhocMetric(
- value: unknown,
-): value is AdhocMetricInput {
- return (
- typeof value === 'object' &&
- value !== null &&
- !(value instanceof AdhocMetric) &&
- ('expressionType' in value ||
- 'column' in value ||
- 'aggregate' in value ||
- 'sqlExpression' in value ||
- 'metric_name' in value)
- );
-}
-
export default class AdhocMetric {
expressionType: string;
column?: ColumnType | null;
@@ -224,3 +197,30 @@ export default class AdhocMetric {
return inferSqlExpressionColumn(this as unknown as AdhocMetricInput);
}
}
+
+/**
+ * Type guard to check if an object can be used to construct an AdhocMetric.
+ * Returns true for plain objects that have metric-like properties.
+ */
+export function isDictionaryForAdhocMetric(
+ value: unknown,
+): value is AdhocMetricInput {
+ return (
+ typeof value === 'object' &&
+ value !== null &&
+ !(value instanceof AdhocMetric) &&
+ ('expressionType' in value ||
+ 'column' in value ||
+ 'aggregate' in value ||
+ 'sqlExpression' in value ||
+ 'metric_name' in value)
+ );
+}
+
+/**
+ * Adapter function to create an AdhocMetric instance from a core AdhocMetric
type.
+ * This bridges the type gap between @superset-ui/core's AdhocMetric and the
local class.
+ */
+export function fromCoreAdhocMetric(metric: CoreAdhocMetric): AdhocMetric {
+ return new AdhocMetric(metric as AdhocMetricInput);
+}
diff --git a/superset-frontend/src/features/alerts/AlertReportModal.tsx
b/superset-frontend/src/features/alerts/AlertReportModal.tsx
index fa25c7c75fd..39c15b18aed 100644
--- a/superset-frontend/src/features/alerts/AlertReportModal.tsx
+++ b/superset-frontend/src/features/alerts/AlertReportModal.tsx
@@ -610,6 +610,20 @@ const AlertReportModal:
FunctionComponent<AlertReportModalProps> = ({
const [emailSubject, setEmailSubject] = useState<string>('');
const [emailError, setEmailError] = useState(false);
+ const allowedNotificationMethodsCount = useMemo(
+ () =>
+ allowedNotificationMethods.reduce((accum: string[], setting: string) => {
+ if (
+ accum.some(nm => nm.includes('slack')) &&
+ setting.toLowerCase().includes('slack')
+ ) {
+ return accum;
+ }
+ return [...accum, setting.toLowerCase()];
+ }, []).length,
+ [allowedNotificationMethods],
+ );
+
const onNotificationAdd = () => {
setNotificationSettings([
...notificationSettings,
@@ -2013,20 +2027,6 @@ const AlertReportModal:
FunctionComponent<AlertReportModalProps> = ({
enforceValidation();
}, [validationStatus]);
- const allowedNotificationMethodsCount = useMemo(
- () =>
- allowedNotificationMethods.reduce((accum: string[], setting: string) => {
- if (
- accum.some(nm => nm.includes('slack')) &&
- setting.toLowerCase().includes('slack')
- ) {
- return accum;
- }
- return [...accum, setting.toLowerCase()];
- }, []).length,
- [allowedNotificationMethods],
- );
-
// Show/hide
if (isHidden && show) {
setIsHidden(false);
diff --git a/superset-frontend/src/features/databases/DatabaseModal/index.tsx
b/superset-frontend/src/features/databases/DatabaseModal/index.tsx
index bbb4dd6bf5c..7b0834077e5 100644
--- a/superset-frontend/src/features/databases/DatabaseModal/index.tsx
+++ b/superset-frontend/src/features/databases/DatabaseModal/index.tsx
@@ -712,6 +712,12 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps>
= ({
) ||
{};
+ const handleClearValidationErrors = useCallback(() => {
+ setValidationErrors(null);
+ setHasValidated(false);
+ clearError();
+ }, [setValidationErrors, setHasValidated, clearError]);
+
// Test Connection logic
const testConnection = () => {
handleClearValidationErrors();
@@ -773,12 +779,6 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps>
= ({
[],
);
- const handleClearValidationErrors = useCallback(() => {
- setValidationErrors(null);
- setHasValidated(false);
- clearError();
- }, [setValidationErrors, setHasValidated, clearError]);
-
const handleParametersChange = useCallback(
({ target }: { target: HTMLInputElement }) => {
onChange(ActionType.ParametersChange, {
diff --git a/superset-frontend/src/pages/UserInfo/index.tsx
b/superset-frontend/src/pages/UserInfo/index.tsx
index 8f1138a6d64..4c5bdea5fac 100644
--- a/superset-frontend/src/pages/UserInfo/index.tsx
+++ b/superset-frontend/src/pages/UserInfo/index.tsx
@@ -94,10 +94,6 @@ export function UserInfo({ user }: { user:
UserWithPermissionsAndRoles }) {
const { addDangerToast } = useToasts();
const [userDetails, setUserDetails] = useState(user);
- useEffect(() => {
- getUserDetails();
- }, []);
-
const getUserDetails = useCallback(() => {
SupersetClient.get({ endpoint: '/api/v1/me/' })
.then(({ json }) => {
@@ -113,6 +109,10 @@ export function UserInfo({ user }: { user:
UserWithPermissionsAndRoles }) {
});
}, [userDetails]);
+ useEffect(() => {
+ getUserDetails();
+ }, []);
+
const SubMenuButtons: SubMenuProps['buttons'] = [
{
name: (