Compare commits

...

350 Commits

Author SHA1 Message Date
Evan
31aa3bd80a test: add docstring to SCARF_ANALYTICS frontend config test
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 11:05:08 -07:00
Superset Dev
a48d5fefaf fix(telemetry): make SCARF_ANALYTICS opt-out work at runtime
The Scarf telemetry pixel was gated only on `process.env.SCARF_ANALYTICS`,
which webpack inlines at build time. On the official Docker image and the
PyPI wheel the frontend is pre-built, so setting `SCARF_ANALYTICS=false`
at container runtime (Helm `extraEnv`, docker/.env, etc.) had no effect —
the documented opt-out simply didn't work for most deployments (#32110).

Expose `SCARF_ANALYTICS` as a backend config read from the environment and
ship it to the client via the bootstrap payload (`FRONTEND_CONF_KEYS`), then
have RightMenu pass it to `<TelemetryPixel enabled>`. The build-time
`process.env` check is kept as a short-circuit for source builds. Default is
unchanged (telemetry on unless explicitly disabled).

Docs (Kubernetes, Docker Compose, FAQ) updated to document the runtime
opt-out; the k8s page previously only covered opting out of image-pull
telemetry, not the pixel.

Fixes #32110

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-29 11:05:08 -07:00
Evan Rusackas
11a4a17dff fix(frontend): finish sentence-case conversion for time range buttons (#41488)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 10:19:54 -07:00
Evan Rusackas
16a3405e3c fix(i18n): skip unparseable catalogs when building translation index (#41465)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-29 10:11:20 -07:00
Evan Rusackas
07abda50c5 chore(ci): prune orphaned showtime labels in daily cleanup (#41464)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 10:10:42 -07:00
Evan Rusackas
725265502f perf(frontend): migrate lodash imports to lodash-es for tree-shaking (#41511) 2026-06-30 00:09:39 +07:00
yousoph
d42076d541 fix(tags): make favorite star toggle in Tags list view (#41460)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 10:08:36 -07:00
dependabot[bot]
7dcb98e4d2 chore(deps-dev): bump vite from 8.0.14 to 8.1.0 in /superset-embedded-sdk (#41507)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:07:56 -07:00
dependabot[bot]
28f6e1e023 chore(deps-dev): bump @types/node from 25.9.4 to 26.0.0 in /superset-websocket (#41514)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:07:43 -07:00
dependabot[bot]
a8045d7f65 chore(deps-dev): bump @swc/plugin-emotion from 14.13.0 to 14.14.0 in /superset-frontend (#41515)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:07:30 -07:00
Shaitan
f95ebed8ba fix: apply object access checks in tag bulk_create and update commands (#41457)
Signed-off-by: sha174n <shaitan@zx48.net>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 10:07:26 -07:00
dependabot[bot]
4338375267 chore(deps): bump nanoid from 5.1.14 to 5.1.15 in /superset-frontend (#41517)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:07:11 -07:00
dependabot[bot]
e236d831fd chore(deps): bump antd from 6.4.4 to 6.4.5 in /docs (#41518)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:06:57 -07:00
dependabot[bot]
e807e66a3e chore(deps-dev): bump timezone-mock from 1.4.2 to 1.4.3 in /superset-frontend (#41521)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:06:44 -07:00
dependabot[bot]
0370ac8607 chore(deps-dev): bump unzipper from 0.12.3 to 0.12.5 in /superset-frontend (#41523)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:06:29 -07:00
Evan Rusackas
5b17c5b2df chore(deps): stop Dependabot from opening Babel 8 major bumps (#41534) 2026-06-30 00:06:05 +07:00
dependabot[bot]
d2daf84fd9 chore(deps): bump uuid from 14.0.0 to 14.0.1 in /superset-frontend (#41524)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:05:52 -07:00
dependabot[bot]
7edae0817c chore(deps): bump zizmorcore/zizmor-action from 0.5.6 to 0.5.7 (#41519) 2026-06-29 23:54:21 +07:00
ʈᵃᵢ
a4d5b15955 fix(slack): support org-scoped tokens on Enterprise Grid via SLACK_TE… (#41473) 2026-06-29 09:46:25 -07:00
Kaushik Harsha
9dba4d090f fix(explore): hide inactive result tables in mixed chart view as table (#37777)
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 09:33:37 -07:00
Evan Rusackas
1b7b9ce948 fix(tags): remove unsatisfiable foreign keys from tagged_object.object_id (#41126)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-29 09:30:04 -07:00
Joe Li
7926c3a93a fix(sqllab): preserve query history after tab migration (#41403) 2026-06-29 09:15:19 -07:00
Joe Li
797e497f4b fix(dashboard): suppress favorite status error toast on 404 (#41402)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-29 09:15:00 -07:00
Joe Li
825b582815 fix(mixed-chart): preserve order_desc and series_limit_metric in buildQuery (#41401)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 09:14:35 -07:00
David
90fe1f5b7c fix(auth): redirect to login on failure to access dashboard permalink (#40769) 2026-06-28 17:49:25 -07:00
Abdul Rehman
a529945d3b fix(reports): commit permalink before Playwright navigation (#41051) 2026-06-28 17:48:44 -07:00
jesperct
0c12114ea9 fix(explore): stop metric edits from bleeding across metrics with duplicate optionNames (#41208)
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 17:46:13 -07:00
Hans Yu
6eb51105d0 refactor: update SQLAlchemy case() syntax to 2.0 (#40275) 2026-06-28 12:46:02 -07:00
Đỗ Trọng Hải
b2a2698898 chore: unify Node version (#41500) 2026-06-28 12:22:36 -07:00
dependabot[bot]
efed2b09aa chore(deps-dev): bump @types/node from 25.9.3 to 26.0.0 in /superset-frontend (#41451)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 12:15:29 -07:00
dependabot[bot]
c3a11e3170 chore(deps): bump sqlalchemy-utils from 0.42.0 to 0.42.1 (#41478)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
2026-06-28 12:15:14 -07:00
dependabot[bot]
98d61c5cf8 chore(deps-dev): bump duckdb from 1.5.3 to 1.5.4 (#41480)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
2026-06-28 12:14:59 -07:00
dependabot[bot]
7d5e01b6cf chore(deps-dev): update taospy requirement from >=2.7.21 to >=2.8.9 (#41481)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
2026-06-28 12:14:49 -07:00
qlimenoque
a70d055669 feat(helm): use env redis_driver, render additional deployment pod spec (#26040) 2026-06-27 22:44:14 -07:00
Evan Rusackas
670f25e5f4 chore(lint): convert explore controls, SqlLab, and misc components to function components (#39461)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude <claude@anthropic.com>
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
2026-06-27 22:41:53 -07:00
Evan Rusackas
7fc1113c31 fix(telemetry): use Scarf static pixel instead of gateway redirect (#41129)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-27 22:41:17 -07:00
dependabot[bot]
ccbd284245 chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 (#41447)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 12:21:53 +07:00
Evan Rusackas
d0268442f8 chore(ci): correct actions/cache pin comment to actual version v5.0.5 (#41482)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 11:41:55 +07:00
ʈᵃᵢ
25c9f3510a test(mcp): set embedded on update_dashboard test mock (#41495) 2026-06-28 11:19:01 +07:00
Đỗ Trọng Hải
b8fd2e9725 feat(websocket,embedded-sdk): replace Jest with modern Vitest (#38308)
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
2026-06-28 11:12:37 +07:00
Evan Rusackas
78dd400ca4 chore(ci): correct actions/cache version comment to match pinned SHA (#41483)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:56:33 +07:00
Evan Rusackas
7587d0778a chore(ci): correct actions/cache version comment to v5.0.5 (#41484)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:56:08 +07:00
Elizabeth Thompson
97cb002f46 fix(a11y): propagate tooltip string as aria-label on IconTooltip button (#41493) 2026-06-27 15:01:46 -07:00
Elizabeth Thompson
5ec0931840 fix(pandas_postprocessing): pass string operator names to GroupBy.agg to avoid FutureWarning (#41025) 2026-06-27 15:01:43 -07:00
Elizabeth Thompson
3eb9185521 fix(viz): use series_limit/series_limit_metric in query_obj dict (#41002)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 15:01:40 -07:00
Shaitan
cd8ac41d16 fix(datasource): validate expressions through the shared adhoc-expression checks (#41427)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 19:47:59 +01:00
Evan Rusackas
21999bb772 fix(i18n): repair corrupted Romanian catalog so it parses again (#41467)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-27 09:13:39 -04:00
innovark
0a18779280 fix(echarts): format mixed timeseries value labels by assigned axis (#40420)
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-27 01:27:41 -07:00
Krishna Chaitanya
a147079043 fix(bigquery): backslash-escape apostrophes in filter values (#38835)
BigQuery rejects filter values containing apostrophes (e.g. O'Brien): the
sqlalchemy-bigquery dialect renders string literals via repr(), which switches
to double-quote delimiters that BigQuery parses as identifiers, causing a
syntax error.

Monkey-patch the dialect's colspecs with a TypeDecorator whose literal_processor
emits single-quoted literals using backslash escaping ('O\'Brien'). Doubled
single quotes ('O''Brien') are NOT valid in BigQuery (parsed as concatenated
literals). Control characters are emitted as named escapes with a \xhh fallback,
since BigQuery forbids literal control chars in quoted strings. Follows the
existing Databricks dialect pattern.

Fixes #35857
2026-06-27 00:55:47 -07:00
Abdul Rehman
ebb32de625 fix(cachekey): use data_cache for chart query result invalidation (#40493) 2026-06-26 18:01:14 -07:00
Onur Taşhan
1280eaee18 fix(mcp): include embedded_uuid in get_dashboard_info response (#41195)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 18:00:10 -07:00
jesperct
15626a047c fix(sqllab): quote autocomplete table names that need it (#41199) 2026-06-26 17:58:05 -07:00
madhushreeag
dc64716c61 fix(echarts): bring annotations in front and prevent tooltip from covering annotation labels (#41174)
Co-authored-by: madhushree agarwal <madhushree_agarwal@apple.com>
2026-06-26 16:21:41 -07:00
Evan Rusackas
6f12dbf0e1 feat(api): log rejected related/distinct field access as security events (#41306)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-26 15:45:36 -07:00
Abdelghani Belgaid
022f66a694 fix(country-map): update Morocco GeoJSON boundaries (#41021) 2026-06-26 15:11:16 -07:00
Evan Rusackas
ac9bf26751 chore(deps): bump vulnerable transitive deps across lockfiles (#41307)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 14:45:56 -07:00
Luiz Otavio
834ccf2613 fix(chart): chart description not showing (#41453) 2026-06-26 12:38:30 -07:00
Joe Li
98d0ccd7a7 fix(reports): reliability fixes for alert/report execution (#41177)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 12:09:12 -07:00
Evan Rusackas
8aacb6f793 fix(async): derive async channel from guest token for embedded RLS queries (closes #31492) (#41397)
Co-authored-by: Devin AI <devin-ai-integration[bot]@users.noreply.github.com>
2026-06-26 12:09:06 -07:00
Evan Rusackas
eaaab61493 chore(ci): correct setup-python pin version comment to v6.2.0 (#41383)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 12:08:46 -07:00
Evan Rusackas
068a709c14 fix(config): expose build details (git SHA/build number) to admins only (#41301)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-26 12:08:04 -07:00
Evan Rusackas
71c8e2f69d fix(config): refuse to start with an empty SECRET_KEY (#41299)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-26 12:07:17 -07:00
Evan Rusackas
bfa6cfac85 fix(database): mask SSH tunnel credentials explicitly on read paths (#41293)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-26 12:07:02 -07:00
Evan Rusackas
c03cdade39 chore(deck.gl): remove leftover debug className from Legend (#41165)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-26 12:06:47 -07:00
Evan Rusackas
0efcbcdd81 test(security): regression coverage for #36130 FAB permission view templates (#41130)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 12:06:27 -07:00
Kasia
11d7f7fb87 fix: convert ALL CAPS button labels to sentence case (#40435) 2026-06-26 12:05:13 -07:00
Elizabeth Thompson
c87fdfc18f fix(i18n): defer plugin init and menu render until language pack is ready (#40729)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 11:48:18 -07:00
madhushreeag
667005638a fix(dropdown): clear search input after selection in all multi-select fields (#41074)
Co-authored-by: madhushree agarwal <madhushree_agarwal@apple.com>
2026-06-26 10:46:52 -07:00
Joe Li
f10315f8fc test(databases): migrate database modal Cypress tests to RTL (#41436)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 09:58:32 -07:00
Amin Ghadersohi
a5dbb394e5 fix(thumbnails): add deduplication to dashboard thumbnail Celery tasks (#38576)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 12:41:02 -04:00
Gabriel Torres Ruiz
f49db9e536 fix(dashboard): restore page scrolling (#41439) 2026-06-26 12:54:19 -03:00
dependabot[bot]
84e07df735 chore(deps): bump react-draggable from 4.6.0 to 4.7.0 in /superset-frontend (#41446)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-26 08:31:37 -07:00
dependabot[bot]
b8f3918bcf chore(deps-dev): bump react-resizable from 4.0.1 to 4.0.2 in /superset-frontend (#41448)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-26 08:31:23 -07:00
dependabot[bot]
ee43d8869f chore(deps): bump nanoid from 5.1.11 to 5.1.14 in /superset-frontend (#41450)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-26 08:31:11 -07:00
Evan Rusackas
01a0c66c79 fix(sunburst): make "Show Null Values" non-breaking and cover all layers (#41442)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-26 08:30:09 -07:00
Brett Smith
35365d639d fix(deckgl): render legend swatch as a coloured box, not an emoji glyph (#40784)
Signed-off-by: Brett Smith <brett@pukekos.co.nz>
Co-authored-by: Joe Li <joe@preset.io>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
Co-authored-by: Damian Pendrak <dpendrak@gmail.com>
2026-06-26 10:07:29 +02:00
Michael Gerber
7e17c70cba fix: Filter null child names in treeBuilder utility (#31477)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-25 22:03:45 -07:00
SkinnyPigeon
0d43c2c12c feat(reports): trigger alerts (#41336) 2026-06-25 22:01:39 -07:00
Evan Rusackas
7410ff73c0 ci: schedule a weekly Docker image rebuild against the latest release (#40426)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-25 17:15:31 -07:00
Debabrata Saha
f08f068240 fix(sqllab): replace native prompt with modal for tab rename (#41329)
Signed-off-by: debabsah <debasaha.uw@gmail.com>
2026-06-25 17:15:07 -07:00
Greg Neighbors
2b09b6bc1d feat(mcp): list_charts accepts dashboards filter (#40397)
Co-authored-by: gkneighb <26003+gkneighb@users.noreply.github.com>
Co-authored-by: Greg Neighbors <gregneighbors@Gregs-Air-2.lan>
2026-06-25 17:14:11 -07:00
Özgür YÜKSEL
d763255e15 chore(i18n): update Turkish translations messages.po (#39064)
Co-authored-by: Özgür YÜKSEL <o.yuksel@gardiyan.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-25 17:11:40 -07:00
Evan Rusackas
8fed514e79 fix(dashboard): keep pasted filter values outside the loaded page (#41136)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-25 15:33:57 -07:00
Evan Rusackas
c94bc7178f fix(world-map): rely on built-in highlightOnHover to reset hover highlight (#41158)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-25 15:33:46 -07:00
Evan Rusackas
95ecdd3753 fix(menu): highlight active nav tab in non-English locales (#41183)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-25 15:33:30 -07:00
Evan Rusackas
aac02ab679 fix(deck.gl): use interval notation for Polygon legend bucket labels (#41400)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 12:23:34 -07:00
madhushreeag
de01fe2ff0 fix(chart-controls): fix RadioButtonControl crash on empty options and false values (#41170)
Co-authored-by: madhushree agarwal <madhushree_agarwal@apple.com>
2026-06-25 12:02:58 -07:00
Beto Dealmeida
9965c05699 fix(semantic layers): small fixes (#40474) 2026-06-25 14:59:49 -04:00
Greg Neighbors
d8bcc66472 feat(mcp): dashboard layout, theme, and CSS control + update_dashboard tool (#40399)
Co-authored-by: gkneighb <26003+gkneighb@users.noreply.github.com>
Co-authored-by: Greg Neighbors <gregneighbors@Gregs-MacBook-Air-2.local>
Co-authored-by: Greg Neighbors <gregneighbors@Gregs-Air-2.lan>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
2026-06-25 10:41:07 -07:00
Evan Rusackas
4b9b8187b3 fix(config): make Swagger UI opt-in (off by default) (#41300)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-25 10:34:28 -07:00
Evan Rusackas
83f7dc9d5b chore(codeowners): add translation maintainers (#41429)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-25 10:09:16 -07:00
Elizabeth Thompson
baca76ebe0 fix(slack): fix indented triple-quoted string in v1 API deprecation warning (#41393) 2026-06-25 09:54:33 -07:00
Mehmet Salih Yavuz
9a11c15a33 feat(explore): add full-range option for time-shift comparison (#41334) 2026-06-25 18:30:33 +03:00
Michael S. Molina
a90c8e0347 feat(extensions): add Chat contribution type (SIP-214) (#41205)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 08:57:30 -03:00
dependabot[bot]
fe2424ec14 chore(deps): bump mapbox-gl from 3.24.1 to 3.25.0 in /superset-frontend (#41409)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-25 02:09:48 -07:00
dependabot[bot]
b4f43bd7e0 chore(deps): bump baseline-browser-mapping from 2.10.37 to 2.10.38 in /docs (#41405)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-25 02:09:45 -07:00
dependabot[bot]
2b25345ed9 chore(deps-dev): bump baseline-browser-mapping from 2.10.37 to 2.10.38 in /superset-frontend (#41413)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-25 02:09:41 -07:00
Evan Rusackas
e0f3f93cd4 fix(mcp): require MCP_JWT_AUDIENCE when MCP JWT auth is enabled (#41292)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 16:53:36 -07:00
Evan Rusackas
0667ba6097 chore(deps): bump dompurify and http-proxy-middleware (security) (#41289)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 16:16:56 -07:00
Evan Rusackas
81f7e42f4e fix(rls): preserve tables/roles on partial RLS rule updates (#41294)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 16:16:47 -07:00
Evan Rusackas
0fd244b5c6 fix(security): reject unknown fields on guest-token RLS rules (#41217)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-24 16:16:43 -07:00
Evan Rusackas
1f16d10cbf chore(deps): bump pyjwt to 2.13.0 (CVE-2026-48526) (#41288)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 16:16:40 -07:00
Evan Rusackas
4f4663418f fix(tests): stabilize update_chart MCP test failing on previous-Python CI leg (#41310)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 16:16:14 -07:00
Evan Rusackas
4519a5c52d fix(safe-markdown): do not mutate the shared sanitization schema (#41298)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 16:16:06 -07:00
Evan Rusackas
da9fbadaf6 fix(logout): purge the namespaced Cache API store on logout (#41303)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 16:15:50 -07:00
Evan Rusackas
f40abbbefd fix(mcp): fail closed when the JWT verifier has no pinned algorithm (#41296)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 16:15:42 -07:00
Evan Rusackas
6166af3c3c fix(mcp): reject non-finite JWT exp instead of 500ing on int() overflow (#41394)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 16:15:29 -07:00
Evan Rusackas
076d8c1508 docs(security): add a secrets register and rotation schedule (#41308)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 16:15:17 -07:00
Elizabeth Thompson
518cadd907 fix(mcp_service): reduce deprecated authlib.jose.errors imports (#41248) 2026-06-24 15:01:58 -07:00
JUST.in DO IT
b955c90de4 fix(sqllab): Invalid multi sorting state in table header (#40680) 2026-06-25 06:43:02 +09:00
Evan Rusackas
7363774869 fix(theming): deep-merge partial THEME_DEFAULT overrides with built-in defaults (#41347)
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 13:27:32 -07:00
Vansh Gilhotra
6f12d17313 fix(charts): show user-friendly error for HTTP 413 payload too large (#37131)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-24 11:21:59 -07:00
abhyudaytomar
09c7ba14df fix(export): sanitize control characters in titles to prevent export failures (#39294)
Co-authored-by: Abhyuday Tomar <abhyuday.tomar@exotel.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 11:03:46 -07:00
Elizabeth Thompson
3ec4bd23c4 fix(deps): restore np.nan in offset_metrics_df empty branch (#41267)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 10:49:38 -07:00
yousoph
f6ce105450 fix(pandas-postprocessing): handle prophet errors and validate minimum data points for forecast (#41180)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 10:44:23 -07:00
Evan Rusackas
7bb4e82a82 fix(dashboard): Remove 308 redirect when creating new dashboards (#41343)
Co-authored-by: ericsong <eric.song@example.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 10:31:31 -07:00
Kamil Gabryjelski
2d78a8733c fix(plugin-chart-ag-grid-table): show correct percent-metric totals in summary row (#41247)
Signed-off-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
2026-06-24 19:21:00 +02:00
Evan Rusackas
3261d10270 chore(frontend): enforce TypeScript-only source files (#41385)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-24 05:54:37 -07:00
Shlummie
a57b5f6078 fix(deckgl): show dashboard filter badges for multi-layer charts (#40003)
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 02:14:25 -07:00
MelikHajlawi
d1b523b97f docs: fix placeholder text in @superset-ui/core README (#40002)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 02:07:24 -07:00
Shashwati Bhattacharyaa
91188a0302 fix(config): Wire LOGO_TARGET_PATH and document custom spinner usage (#36951)
Co-authored-by: Shashwati <shashwatibhattacaharya21.2@gmail.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
2026-06-24 01:56:15 -07:00
MUHAMMED SINAN D
ac234d0fb2 fix(dashboard): prevent x-axis clipping when toggling chart description (#38307) 2026-06-24 01:54:43 -07:00
felipegr0ssi
8eb753eab2 fix(dashboard): keep native filter dropdown from covering input (#40032)
Co-authored-by: feehgrossi <felipe.leite@sptech.school>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 01:53:44 -07:00
abhyudaytomar
779fa13679 fix(security): prevent duplicate items in permissions dropdown on scroll (#39292)
Co-authored-by: Abhyuday Tomar <abhyuday.tomar@exotel.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 01:53:27 -07:00
Greg Neighbors
caf81e71d2 feat(mcp): add typed Pydantic response schemas to generate_explore_link tool (#39900)
Co-authored-by: gkneighb <26003+gkneighb@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-24 01:53:08 -07:00
Eddy
1b8c6d109d feat: added deterministic field generation to dashboard export (#36339)
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-24 01:41:44 -07:00
Viktor Högberg
eb60e5477b fix(radar): correct legend margin control in the radar chart (#39414) 2026-06-24 01:41:24 -07:00
Puneet Dixit
7b9bcdd951 fix(bigquery): preserve catalog in partition metadata lookup (#40200)
Co-authored-by: Puneet Dixit <rvit23bcs086.rvitm@rvei.edu.in>
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-24 01:41:06 -07:00
ruhz3
d9d395bde1 fix(helm): remove unused SQLALCHEMY_TRACK_MODIFICATIONS setting (#37259) 2026-06-24 01:28:30 -07:00
Jay Masiwal
584d41759b refactor: migrate test files from nested describe blocks and remove stale lint ignores (#39202)
Co-authored-by: Joe Li <joe@preset.io>
2026-06-24 01:19:15 -07:00
abdullah reveha
8f22b71898 feat(chart): enable cross-filter on x-axis labels for bar, line, area and scatter charts (#41111)
Co-authored-by: Abdullah Sahin <you@example.comclear>
2026-06-24 01:17:29 -07:00
omkarhall
1ea3584dcb fix(chart): added Big Number chart support for MAX metric with VARCHAR column (#41182) 2026-06-24 01:11:13 -07:00
Imad Helal
6bc77fecc2 feat(country-map): add cross-filters support (#35859)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-24 00:54:47 -07:00
dependabot[bot]
420a74b01e chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 (#41358)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-24 00:52:16 -07:00
dependabot[bot]
7ba59c2d79 chore(deps): bump @jsonforms/vanilla-renderers from 3.7.0 to 3.8.0 in /superset-frontend (#41367)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-24 00:51:53 -07:00
dependabot[bot]
b77c525d4b chore(deps-dev): bump storybook from 10.4.5 to 10.4.6 in /superset-frontend (#41368)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-24 00:51:22 -07:00
dependabot[bot]
41ce9ca7d3 chore(deps-dev): bump @swc/plugin-emotion from 14.12.0 to 14.13.0 in /superset-frontend (#41377)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-24 00:51:06 -07:00
Abdul Rehman
c2fb94cedf perf(filters): cache column-values endpoint to skip DB on repeat requests (#40839) 2026-06-23 23:41:26 -07:00
yousoph
1d0866556f fix(sql_lab): serialize dict/list cell values as valid JSON strings (#41099)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 20:39:23 -07:00
Evan Rusackas
b4dfeef2fd fix(reports): add network timeouts so schedules can't hang forever (#41250)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-23 18:01:03 -07:00
Dinesh M
0ec6cae45d feat(Boxplot): Allow configuration of y-axis range (#24380)
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: dinesh-zemoso <dinesh.mandava@zemosolabs.com>
2026-06-23 17:48:06 -07:00
Lukas Biermann
d6ede99861 fix(tags): tags api change tag_get_objects method to be aligned with api documentation (#29338)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 14:12:33 -07:00
Hans Yu
9b6d3ce775 fix(models): make naive datetime object timezone-aware before converting to unix timestamp (#39782)
Co-authored-by: Hans Yu <hans.yu@digits.schwarz>
2026-06-23 14:09:26 -07:00
yousoph
c1f4062af6 fix(sql-lab): normalize tabViewId in QUERY_EDITOR_SET_SQL reducer (#40983)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 13:28:20 -07:00
crabulous
3bc3f47d67 fix(dataset): import/export jinja template bug (#28790)
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 13:25:49 -07:00
Durgaprasad M L
acb996a324 feat(mcp): support virtual dataset metrics and improve adhoc SQL metric discoverability (#40935)
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 12:19:44 -07:00
innovark
c1d08bf27c fix(table): respect row limit with server pagination (#41024)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Claude <noreply@anthropic.com>
2026-06-23 12:17:12 -07:00
Ayush Sharaf
d3d5297025 fix(reports): preserve dashboard state in tab permalinks (#39708)
Co-authored-by: Ayush Kumar Sharaf <sharaf@Ayushs-MacBook-Air.local>
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Ayush Kumar Sharaf <ayush.sharaf@314ecorp.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 12:15:41 -07:00
sofiankhalfi-kosmos
b1470bd5a5 fix(i18n): correct french translations causing build errors (#34563)
Co-authored-by: sofiankhalfi-kosmos <sofiankhalfi-kosmos@users.noreply.github.com>
Co-authored-by: Sam Firke <sfirke@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 12:15:23 -07:00
peng weikang
18fea37e84 fix(SavedQueries): allow other admin users see "saved queries" (#20604) (#21769) 2026-06-23 12:14:48 -07:00
Evan Rusackas
1b71c105b7 docs(meta-db): warn that SUPERSET_META_DB_LIMIT truncates tables before joins (#41302)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 14:29:44 -04:00
Ville Brofeldt
b061b5d317 chore: fix lint on untouched files (#41333) 2026-06-23 11:29:19 -07:00
Evan Rusackas
386893f9f2 feat(security): record audit metadata on guest token issuance (#41305)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 11:25:44 -07:00
Evan Rusackas
c1787a67aa fix(extensions): log extension-init failures via the logger, not print() (#41304)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 11:25:33 -07:00
Evan Rusackas
dee5859599 fix(rls): reject empty or whitespace-only RLS clauses (#41297)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 11:24:38 -07:00
Evan Rusackas
1d3daf2ac8 fix(security): return generic error and log internally in RoleRestAPI.get_list (#41295)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 11:24:26 -07:00
Elizabeth Thompson
9d56b1721d fix(models): use Series.iloc for positional access in post_process_df (#41344) 2026-06-23 11:22:22 -07:00
Ayush Anand
67182e255c fix(dashboard): prevent undo crash on new dashboard opened in edit mode (#41252) 2026-06-23 11:22:03 -07:00
Joe Li
e2c6dc3e1a fix(sqllab): shrink Template Parameters editor height and add outline (#41128)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 10:44:11 -07:00
Michael Shen
c539ae98ba fix(helm): enable graceful termination and overrides for celery worker (#41175)
Signed-off-by: Michael Shen <mishen@umich.edu>
2026-06-23 10:33:09 -07:00
Alexis
ca3c420412 fix(trino): ignore Iceberg $partitions metadata fields in partition detection (#41055)
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-23 10:13:23 -07:00
Evan Rusackas
5e8a0c0244 fix(embedded): allow guest users to sort table columns in embedded dashboards (#41218)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-23 10:10:55 -07:00
dependabot[bot]
90fa31f305 chore(deps-dev): bump typescript-eslint from 8.61.0 to 8.61.1 in /superset-websocket (#41313)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 09:18:34 -07:00
Michael Shen
5731d0874a fix(docker): exec gunicorn in run-server.sh so it receives SIGTERM (#41173)
Signed-off-by: Michael Shen <mishen@umich.edu>
2026-06-23 09:17:59 -07:00
Evan Rusackas
66f5ab2d2f fix(ssh-tunnel): support ed25519 and ECDSA keys, not just RSA (#24180) (#40139)
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
2026-06-23 09:15:45 -07:00
Stepan
36b0ed023b fix(viz-date-control): Just use global DEFAULT_TIME_FORMAT instead of hardcoding 'smart_date' (#28708) 2026-06-23 08:53:39 -07:00
Enzo Martellucci
3ff90bd532 fix(big-number): respect extra_form_data.time_compare in Big Number with Time Comparison (#41342) 2026-06-23 17:05:42 +02:00
Beto Dealmeida
5d06438a07 fix(docker): restore working docker compose up for the dev stack (#41077) 2026-06-23 10:01:57 -04:00
dependabot[bot]
eb0d4dd601 chore(deps-dev): bump @typescript-eslint/eslint-plugin from 8.61.0 to 8.61.1 in /superset-websocket (#41315)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 05:55:14 -07:00
dependabot[bot]
92109f0f99 chore(deps-dev): bump eslint-plugin-storybook from 10.4.4 to 10.4.5 in /superset-frontend (#41316)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 05:55:11 -07:00
dependabot[bot]
9431381c3e chore(deps-dev): bump @storybook/addon-docs from 10.4.4 to 10.4.5 in /superset-frontend (#41326)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 05:55:07 -07:00
dependabot[bot]
b94f90e39e chore(deps-dev): bump @formatjs/intl-durationformat from 0.10.14 to 0.10.15 in /superset-frontend (#41332)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:51:20 -07:00
dependabot[bot]
714c5cd075 chore(deps-dev): bump oxlint from 1.69.0 to 1.70.0 in /superset-frontend (#41331)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:50:46 -07:00
dependabot[bot]
c65c0951cf chore(deps-dev): bump storybook from 10.4.4 to 10.4.5 in /superset-frontend (#41330)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:50:42 -07:00
dependabot[bot]
ae5c08b993 chore(deps-dev): bump @playwright/test from 1.60.0 to 1.61.0 in /superset-frontend (#41327)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:50:37 -07:00
dependabot[bot]
b9c61a079d chore(deps-dev): bump eslint-plugin-react-you-might-not-need-an-effect from 1.0.0 to 1.0.1 in /superset-frontend (#41322)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:50:27 -07:00
dependabot[bot]
2599bea0c2 chore(deps): bump actions/checkout from 6.0.2 to 6.0.3 (#41321)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:50:07 -07:00
dependabot[bot]
6c70f3d275 chore(deps-dev): bump @typescript-eslint/eslint-plugin from 8.61.0 to 8.61.1 in /superset-frontend (#41320)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:50:02 -07:00
dependabot[bot]
da893462b8 chore(deps-dev): bump typescript-eslint from 8.61.0 to 8.61.1 in /docs (#41319)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:49:58 -07:00
dependabot[bot]
18853c6ecf chore(deps): bump actions/setup-java from 5.2.0 to 5.3.0 (#41317)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:49:53 -07:00
dependabot[bot]
8768e5be0f chore(deps-dev): bump @typescript-eslint/parser from 8.61.0 to 8.61.1 in /superset-websocket (#41312)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 02:49:46 -07:00
yousoph
133473d0f4 fix(explore): pre-populate SaveModal dashboard from chart metadata (#41181)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 00:54:49 -07:00
alex
5916ec4876 fix(plugin-chart-echarts): cross-filter horizontal bars on category not metric (#41104)
Signed-off-by: alex-poor <alex@karo.co.nz>
2026-06-22 20:29:29 -07:00
Harshit-Tiwary
36781fbf47 fix(i18n): wrap table access error message with gettext for translation (#38489)
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 20:28:05 -07:00
Shaitan
215b207ae4 fix(sql): detect set operations and nested selects in subquery check (#38452)
Co-authored-by: sha174n <pedro.sousa@preset.io>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 20:27:32 -07:00
Vitor Avila
3b46a5f121 fix(chart API): Consider time grain filters with the filters_dashboard_id param (#41290) 2026-06-22 20:01:24 -03:00
Sebastian Mohr
416fa266d9 chore(datatablecontrol): Removed unused useTableColumns (#41155)
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-22 15:38:19 -07:00
yousoph
f70a2eac89 fix(dashboard): normalize legacy currentState to filterState in native_filters URL param (#40929)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 15:37:18 -07:00
Hans Yu
c49391ab08 refactor: update Connection.execute() to use queries with text() (#40277) 2026-06-22 15:36:15 -07:00
stevensuting
0fbace5b5d docs: Update INTHEWILD.yaml (#36894)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-22 15:34:28 -07:00
Evan Rusackas
c55c85f824 fix(helm)!: replace dockerize initContainer with bash TCP wait (#40425)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-22 14:44:51 -07:00
Antonio Pio Volgarino
e34b7c2daf fix(gsheets): pass service_account_info via adapter_kwargs (#38443)
Co-authored-by: Antonio Pio Volgarino <avolgarino@zanichelli.it>
Co-authored-by: Joe Li <joe@preset.io>
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-22 11:34:08 -07:00
Evan Rusackas
eac5bd23bd ci(docs): fix Netlify docs preview never skipping on non-docs PRs (#41070)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-22 11:33:14 -07:00
Daniel Vaz Gaspar
27a65257ee perf(screenshots): reuse Playwright browser across tasks instead of launching per-task (#41243)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-22 11:32:30 -07:00
Gonzalo Majlis
932bb2f154 feat(i18n): update Spanish (es) translations (#41265) 2026-06-22 14:24:24 -04:00
dependabot[bot]
4b87e03e7c chore(deps): bump http-proxy-middleware from 2.0.9 to 2.0.10 in /docs (#41287)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 11:05:35 -07:00
yousoph
2a7fadbd08 fix(sql-lab): use consistent icon size for schema refresh button (#41105) 2026-06-22 10:30:23 -07:00
Đỗ Trọng Hải
403e11e2ef feat(ci): add workflow to automatically sync pinned requirements for pip Dependabot PRs (#40557) 2026-06-23 00:00:12 +07:00
Michael S. Molina
d76b896c9c chore: Updates CHANGELOG.md and UPDATING.md with 6.1.0 (#41249) 2026-06-22 13:53:48 -03:00
Pham Quang Binh
36632c20eb fix(databases): apply IMPERSONATE_WITH_EMAIL_PREFIX to StarRocks engine (#37984) 2026-06-22 23:45:05 +07:00
Abdul Rehman
cb1694575c fix(dataset-api): disambiguate get_or_create by schema (#40494) 2026-06-22 09:45:02 -07:00
Ujjwal Jain
449bd69802 fix(logging): safely render database URIs in startup warnings (#38229) 2026-06-22 09:05:16 -07:00
SkinnyPigeon
7340d06a05 feat(reports): adding link to report content (#40525)
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-22 08:30:40 -04:00
Evan Rusackas
b8aeecfc44 fix(export): dashboard export must not leak env-local chartIds (#32972) (#40588)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 03:50:29 -07:00
dependabot[bot]
7128760d32 chore(deps-dev): bump baseline-browser-mapping from 2.10.36 to 2.10.37 in /superset-frontend (#41271)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 01:30:25 -07:00
dependabot[bot]
6118a01bc1 chore(deps): bump mapbox-gl from 3.24.0 to 3.24.1 in /superset-frontend (#41273)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 01:30:21 -07:00
dependabot[bot]
b7451cd16d chore(deps-dev): bump yeoman-test from 11.5.3 to 11.6.0 in /superset-frontend (#41274)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 01:30:18 -07:00
dependabot[bot]
4312d67775 chore(deps): bump react-arborist from 3.10.1 to 3.10.5 in /superset-frontend (#41276)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 01:30:14 -07:00
dependabot[bot]
55190b1da0 chore(deps-dev): bump eslint-plugin-storybook from 10.4.3 to 10.4.4 in /superset-frontend (#41277)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 01:30:11 -07:00
dependabot[bot]
dc8f0d7b24 chore(deps-dev): bump eslint from 10.4.1 to 10.5.0 in /superset-frontend (#41278)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 01:30:07 -07:00
dependabot[bot]
8b430caef4 chore(deps-dev): bump eslint from 10.4.1 to 10.5.0 in /superset-websocket (#41269)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 00:36:54 -07:00
dependabot[bot]
f5dd28714d chore(deps): bump baseline-browser-mapping from 2.10.36 to 2.10.37 in /docs (#41270)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 00:36:49 -07:00
dependabot[bot]
6d15876b13 chore(deps-dev): bump grpcio from 1.71.0 to 1.81.1 (#41254)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:39:37 -07:00
dependabot[bot]
3dd570cd9b chore(deps-dev): bump trino from 0.330.0 to 0.337.0 (#41255)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:39:34 -07:00
dependabot[bot]
e6fffe95c2 chore(deps): bump pyyaml from 6.0.2 to 6.0.3 (#41256)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:39:30 -07:00
dependabot[bot]
27d9bcb7bc chore(deps): bump greenlet from 3.5.0 to 3.5.1 (#41258)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:39:27 -07:00
dependabot[bot]
f33c209f7a chore(deps): bump flask-cors from 6.0.2 to 6.0.5 (#41260)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:39:24 -07:00
dependabot[bot]
ba339fd9c1 chore(deps): bump msgpack from 1.0.8 to 1.2.1 (#41261)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:39:20 -07:00
Abdul Rehman
defacc3237 fix(deps): declare cachetools explicitly in pyproject.toml (#40987) 2026-06-22 00:45:59 +07:00
dependabot[bot]
b612f573d7 chore(deps-dev): update ydb-sqlalchemy requirement from >=0.1.2 to >=0.1.22 (#41253)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-20 23:34:37 +07:00
dependabot[bot]
99ffaf3694 chore(deps-dev): update sqlalchemy-solr requirement from >=0.2.0 to >=0.2.4.3 (#41257)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-20 23:33:49 +07:00
Viktor Högberg
14d4432843 fix: remove erroneous box shadow when bulk selecting (#41198) 2026-06-20 22:15:00 +07:00
Đỗ Trọng Hải
686beb9117 chore(build): replace d3-color usage with existing tinycolor2 (#39468)
Signed-off-by: hainenber <dotronghai96@gmail.com>
2026-06-20 21:44:02 +07:00
Đỗ Trọng Hải
3aa1218f9b feat(ci): do not run expensive E2E tests on draft PRs (#40720)
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-20 13:03:26 +07:00
Mehmet Salih Yavuz
0d92d0dbb7 chore(deps): finish pip→uv swap in Makefile and CI (#41197) 2026-06-20 10:56:25 +07:00
Đỗ Trọng Hải
2d5df6625b build(deps): update major versions for memoize-one, json-stringify-pretty-compact and webpack-cli (#38793)
Signed-off-by: hainenber <dotronghai96@gmail.com>
2026-06-20 10:48:10 +07:00
dependabot[bot]
d0a34d9372 chore(deps): bump @visx/scale from 3.12.0 to 4.0.0 in /superset-frontend (#41231)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 15:07:06 -07:00
Jean Dupuis
b2e5f80db2 fix(sql): preserve multi-arg DISTINCT in sanitize_clause and format (#39340) 2026-06-19 13:02:50 -07:00
Evan Rusackas
f1504611fd docs(config): document customizing the landing page via FAB_INDEX_VIEW (#41222)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 13:01:47 -07:00
dependabot[bot]
382a094795 chore(deps): bump @visx/grid from 3.12.0 to 4.0.0 in /superset-frontend (#41240)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 11:39:05 -07:00
Vitor Avila
334b13c3d9 fix(chart API): apply dashboard filters by live scope, not stale chartsInScope (#41214) 2026-06-19 15:22:54 -03:00
Vitor Avila
9e130e5927 fix(chart): preserve SQL_QUERY_MUTATOR line comments structure (#41215) 2026-06-19 15:07:24 -03:00
dependabot[bot]
fe017d0b20 chore(deps): bump @visx/responsive from 3.12.0 to 4.0.0 in /superset-frontend (#41239)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 11:04:20 -07:00
dependabot[bot]
97659678f9 chore(deps): bump simple-zstd from 1.4.2 to 2.1.0 in /superset-frontend (#39369)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-19 10:10:36 -07:00
André Meyer
141f045104 test: add unit tests for get_current_user (superset/tasks/utils.py) (#40878)
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-19 10:09:53 -07:00
dependabot[bot]
919bd35028 chore(deps): bump marshmallow from 3.26.2 to 4.3.0 (#39751)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
2026-06-19 10:02:35 -07:00
dependabot[bot]
be225e5c20 chore(deps): bump @visx/responsive from 3.12.0 to 4.0.0 in /superset-frontend/packages/superset-ui-core (#41224)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:54:28 -07:00
dependabot[bot]
81b7f31096 chore(deps-dev): bump Storybook 10.x packages from 10.4.3 to 10.4.4 in /superset-frontend (#41229)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:52:42 -07:00
dependabot[bot]
045674ab3c chore(deps): bump @visx/tooltip from 3.12.0 to 4.0.0 in /superset-frontend (#41226)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 09:48:07 -07:00
dependabot[bot]
061f61977f chore(deps-dev): bump react-dnd-test-backend from 11.1.3 to 16.0.1 in /superset-frontend (#41187)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 09:11:44 -07:00
dependabot[bot]
ffa98d03df chore(deps): bump @visx/xychart from 3.12.0 to 4.0.0 in /superset-frontend (#41230)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 09:11:18 -07:00
dependabot[bot]
bdf494d8b5 chore(deps): bump @visx/axis from 3.12.0 to 4.0.0 in /superset-frontend (#41242)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 09:10:21 -07:00
Evan Rusackas
d32170b020 chore(embedded-sdk): remove temporary OIDC diagnostic step (#41216) 2026-06-19 22:59:21 +07:00
Amin Ghadersohi
1467006427 fix(mcp): generate durable explore permalink URL instead of ephemeral form_data_key (#40773) 2026-06-19 08:50:11 -07:00
Artem Lytkin
e18cd1f50c fix(table): preserve percentage format for small numbers when d3SmallNumberFormat is unset (#37980)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-19 08:49:40 -07:00
Furkan Emre Güngör
9d3efb0aab fix(csv): apply CSV_EXPORT encoding explicitly, Werkzeug 3 removed Response.charset (#40801) 2026-06-19 08:49:27 -07:00
Grégoire Gailly
cc9c20fcb6 feat(dashboard): Edit dashboard description from ui (and api) and show tooltip on dashboard list view (#36071) 2026-06-19 08:49:14 -07:00
Alexandru Soare
f545d70647 feat(listview): Add headerContent prop and HomeOutlined icon (#41244) 2026-06-19 16:34:47 +03:00
dependabot[bot]
e1be76e5fa chore(deps): bump baseline-browser-mapping from 2.10.35 to 2.10.36 in /docs (#41227)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 02:28:26 -07:00
dependabot[bot]
55eb5699d5 chore(deps): bump caniuse-lite from 1.0.30001797 to 1.0.30001799 in /docs (#41225)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 01:37:52 -07:00
dependabot[bot]
4d5c171e9e chore(deps): bump antd from 6.4.3 to 6.4.4 in /docs (#41228)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 01:37:46 -07:00
dependabot[bot]
a85796418a chore(deps): bump @deck.gl/mapbox from 9.3.3 to 9.3.4 in /superset-frontend (#41233)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 01:37:43 -07:00
dependabot[bot]
655395cb4e chore(deps): bump acorn from 8.16.0 to 8.17.0 in /superset-frontend (#41234)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 01:37:40 -07:00
dependabot[bot]
28f9b3786c chore(deps-dev): bump baseline-browser-mapping from 2.10.35 to 2.10.36 in /superset-frontend (#41235)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 01:37:37 -07:00
dependabot[bot]
25ad827ff3 chore(deps-dev): bump storybook from 10.4.3 to 10.4.4 in /superset-frontend (#41236)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 01:37:34 -07:00
dependabot[bot]
afbbe44de2 chore(deps): bump dom-to-image-more from 3.9.0 to 3.10.0 in /superset-frontend (#41237)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 01:37:30 -07:00
rijekaDrina
79cfe4d9bc feat(i18n): add Serbian translations (Cyrillic + Latin) (#41137)
Signed-off-by: Aleksije Micic <aleksije.micic1997@gmail.com>
Co-authored-by: Aleksije Micic <aleksije.micic1997@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-18 17:45:04 -07:00
Evan Rusackas
3eae8cd614 fix(alerts): don't show a never-run report as a green success (#29622) (#41121)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-18 15:55:30 -07:00
Elizabeth Thompson
0c9ece65bb fix(reports): require user in get_screenshot, simplify Selenium lifecycle, and fail on tiled screenshot error (#41080)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 15:46:17 -07:00
Elizabeth Thompson
7040388ad1 fix(query_object_factory): normalize deprecated query fields before constructing QueryObject (#41204) 2026-06-18 15:02:07 -07:00
Elizabeth Thompson
a5ece52207 fix(views): add new_target to deprecated explore_json endpoints (#41159) 2026-06-18 15:02:03 -07:00
Evan Rusackas
a7c0f4b83d fix(embedded-sdk): omit registry-url so npm uses OIDC publishing (#41211)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 13:43:23 -07:00
Evan Rusackas
0f05239260 fix(embedded-sdk): clear placeholder token so npm uses OIDC publishing (#41210)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 13:26:32 -07:00
Evan Rusackas
60a7804193 fix(embedded-sdk): surface npm publish stderr in release script (#41206)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 13:16:15 -07:00
Evan Rusackas
4053f53c29 ci(embedded-sdk): fix release CI by publishing via npm trusted publishing (OIDC) (#41207)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 11:33:39 -07:00
Nitish Agarwal
7837054dbc fix(chart): cross-filter emits dimension value instead of metric label for stacked bars (#38120)
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-18 11:24:36 -07:00
Evan Rusackas
69c8f37c67 docs(installation): fix PyPI install Python version and OS dependencies (#41178)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 11:03:50 -07:00
Abdul Rehman
76e2418f1e fix(mcp): add safeguards to ensure all MCP tools are wrapped with mcp_auth_hook (#40412)
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-18 10:27:53 -07:00
Vitor Avila
b4e3452bfd fix(chart API): Do not duplicate Jinja-applied filters with filters_dashboard_id (#41131) 2026-06-18 14:25:54 -03:00
jesperct
188c84f1cd fix(explore): drop inherit/custom time shifts when switching to a viz that can't honor them (#40865) 2026-06-18 10:23:31 -07:00
dependabot[bot]
74ae5a45f9 chore(deps): bump dompurify from 3.4.9 to 3.4.11 in /superset-frontend (#41201)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 08:22:57 -07:00
dependabot[bot]
fc61918364 chore(deps): bump undici from 7.25.0 to 7.28.0 in /superset-frontend (#41202)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 08:22:47 -07:00
dependabot[bot]
3e811087de chore(deps): bump dompurify from 3.4.2 to 3.4.11 in /docs (#41203)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 08:22:39 -07:00
ksnikiforov
c218dc418b fix(dashboard): fixed first/last aggregations in pivot tables (#33275)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
2026-06-18 10:49:12 +02:00
dependabot[bot]
c98ed92303 chore(deps): bump markdown-to-jsx from 9.8.1 to 9.8.2 in /superset-frontend (#41191)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 01:07:47 -07:00
dependabot[bot]
84c32ec132 chore(deps-dev): bump @types/node from 25.9.2 to 25.9.3 in /superset-frontend (#41190)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 00:47:15 -07:00
dependabot[bot]
8636875b39 chore(deps-dev): bump eslint-plugin-storybook from 10.4.2 to 10.4.3 in /superset-frontend (#41192)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 00:47:12 -07:00
dependabot[bot]
dde6974ac2 chore(deps): bump dom-to-image-more from 3.7.2 to 3.9.0 in /superset-frontend (#41193)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 00:47:08 -07:00
dependabot[bot]
e36eb6f47c chore(deps-dev): bump @types/node from 25.9.2 to 25.9.3 in /superset-websocket (#41186)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 00:26:54 -07:00
dependabot[bot]
f6e12278dc chore(deps-dev): update @types/node requirement from ^25.9.2 to ^25.9.3 in /superset-frontend/packages/superset-ui-core (#41188)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 00:26:51 -07:00
dependabot[bot]
43d5b6319b chore(deps-dev): bump baseline-browser-mapping from 2.10.34 to 2.10.35 in /superset-frontend (#41189)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 00:26:48 -07:00
melikmertd
ae0b1f0308 fix(countrymap chart): city names of Türkiye edited in Countrymap Chart. (#32497)
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
2026-06-17 21:46:11 -07:00
Evan Rusackas
4acb777a40 chore(sqllab): remove dead TableElement component and syncTable action (#41071)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-17 19:29:09 -07:00
Durgaprasad M L
7e98410743 fix(theme): embedded method overrides dashboard level config (#40777)
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
2026-06-17 18:33:04 -07:00
Hans Yu
883b7a286d refactor: update SQLAlchemy select() syntax to 2.0 (#40276) 2026-06-17 17:50:32 -07:00
Evan Rusackas
d9d8b2bcc0 chore(ci): correct action ref version comments (zizmor) (#41160)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 15:42:14 -07:00
Evan Rusackas
9da54eff84 chore(ci): set least-privilege workflow permissions (zizmor) (#41161)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 15:41:47 -07:00
dependabot[bot]
fb2b9fa8ff chore(deps): bump cryptography from 46.0.7 to 48.0.1 (#41010)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 15:01:20 -07:00
Dante R. Giuliano
31797005db docs(INTHEWILD): adding Tech Solution (#37178)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Joe Li <joe@preset.io>
2026-06-17 14:59:15 -07:00
Evan Rusackas
ca2d340db3 fix(security): validate dynamic method dispatch in asyncEvent (#41163)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 14:58:34 -07:00
jesperct
ef82da8458 fix(charts): apply datetime format to unaggregated temporal columns (#41060) 2026-06-17 14:56:09 -07:00
Jean Massucatto
fee1cf9f08 chore(sqllab): remove dead TableElement component (#41029) 2026-06-17 14:54:41 -07:00
jesperct
2d2a8f3ab0 fix(plugin-chart-handlebars): follow the app theme in Customize code editors (#40952) 2026-06-17 14:52:52 -07:00
dependabot[bot]
a19093e65a chore(deps-dev): bump webpack-dev-server from 5.2.4 to 5.2.5 in /superset-frontend (#41168)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 12:55:44 -07:00
dependabot[bot]
b72a0a53c0 chore(deps): bump webpack-dev-server from 5.2.4 to 5.2.5 in /docs (#41169)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 12:55:40 -07:00
Thomas Bernhard
512b6f43c1 chore(embedded sdk): bump sdk version number (#40991) 2026-06-17 12:47:41 -07:00
Evan Rusackas
b18fab7fc1 ci(docker): free disk space before image build to fix "no space left on device" (#41068)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-17 12:43:43 -07:00
Evan Rusackas
b06c6b7464 ci: bump setup-python to v6 (Node 24) before Node 20 deprecation (#41066)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-17 11:56:47 -07:00
Evan Rusackas
bede4b2121 ci(docker): retry image build to absorb transient Docker Hub registry errors (#41069)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-17 11:56:23 -07:00
İbrahim Ercan
5e812c8757 feat(docker): add environment values to set log file for worker and beat (#40998)
Co-authored-by: Ibrahim Ercan <ibrahim.ercan@vlmedia.com.tr>
2026-06-17 10:42:45 -07:00
Craig Ingram
de390f22a4 fix(helm): Evaluate init.extraContainers templates (#31878)
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-17 10:39:40 -07:00
dependabot[bot]
464c67d586 chore(deps-dev): bump @storybook/addon-links from 10.4.2 to 10.4.3 in /superset-frontend (#41146)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-17 10:17:00 -07:00
dependabot[bot]
7f7f87e823 chore(deps-dev): bump prettier from 3.8.3 to 3.8.4 in /docs (#41140)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 09:49:28 -07:00
dependabot[bot]
7c2f5142ce chore(deps-dev): bump yeoman-test from 11.5.2 to 11.5.3 in /superset-frontend/packages/generator-superset (#41142)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 09:35:54 -07:00
dependabot[bot]
874ac3dc01 chore(deps): bump @swc/core from 1.15.40 to 1.15.41 in /docs (#41143)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 09:35:46 -07:00
dependabot[bot]
f56e34d6e6 chore(deps-dev): bump @typescript-eslint/eslint-plugin from 8.60.1 to 8.61.0 in /superset-websocket (#41085)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 09:28:38 -07:00
dependabot[bot]
742a21f6f7 chore(deps-dev): bump prettier from 3.8.3 to 3.8.4 in /superset-websocket (#41138)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 09:28:21 -07:00
dependabot[bot]
a7c49ac9f2 chore(deps): bump baseline-browser-mapping from 2.10.34 to 2.10.35 in /docs (#41144)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 09:24:51 -07:00
dependabot[bot]
99d927eac7 chore(deps-dev): bump @swc/core from 1.15.40 to 1.15.41 in /superset-frontend (#41145)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 09:24:35 -07:00
dependabot[bot]
994594e4a8 chore(deps-dev): bump storybook from 10.4.2 to 10.4.3 in /superset-frontend (#41147)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 09:23:32 -07:00
dependabot[bot]
e92599fb50 chore(deps-dev): bump prettier from 3.8.3 to 3.8.4 in /superset-frontend (#41150)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-17 09:22:13 -07:00
Amin Ghadersohi
eebe1a1a5b fix(dashboards): remove thumbnail_url from list API to reduce cache cost (#38567) 2026-06-17 09:35:21 -06:00
Mehmet Salih Yavuz
664e777a84 chore(deps): bump react to ^18.3.0 (#40012) 2026-06-17 18:01:59 +03:00
Joao Amaral
750518cf6f fix(celery): check app context before session removal in teardown (#37574)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
Co-authored-by: Daniel Vaz Gaspar <danielvazgaspar@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
2026-06-17 10:44:27 -03:00
Michael S. Molina
59d1b5f300 fix(nav): prevent full reload when clicking logo; redirect / to welcome (#41119)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 09:27:17 -03:00
Xie Yanbo
a27ec1923e chore(export): Added ability to export chart YAML files with Unicode characters, fix #20331 (#28008)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 07:55:19 +01:00
serverdevil
3e2174b50f fix(database): enable superset_app_root override for databaseview link (#33508)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Superset Dev <dev@superset.apache.org>
2026-06-16 20:24:49 -07:00
Gabriel Bourgeois
5b66443d48 fix(cli): inconsistent options for set-database-uri (#34893) 2026-06-16 17:50:51 -07:00
Korbinian Preisler
2ea7585490 chore(i18n): update German (de) translation (#40431)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 17:47:57 -07:00
Simon Rühle
eeac76146c fix(helm): add host alias to init job (#33968)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-16 17:44:47 -07:00
Shaitan
6a1091d576 fix(sql): broaden mutating-statement detection in SQL Lab parser (#40421)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: sha174n <pedro.sousa@preset.io>
2026-06-16 15:07:34 -07:00
Jakub Hrubý
8e82b6b2c3 fix(translation): loading translations in menu (#35640)
Co-authored-by: Jakub Hrubý <jakub.hruby@orgis.cz>
Co-authored-by: Jezevec <panjzvc@gmail.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-16 14:35:32 -07:00
Evan Rusackas
b0c5f99007 fix(oracle): replace deprecated cx-Oracle extra with oracledb (#41122)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-16 14:32:11 -07:00
Elizabeth Thompson
f1ae683923 fix(deps): replace deprecated np.NaN with np.nan (#41118)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 14:19:08 -07:00
dependabot[bot]
d51d98891e chore(deps): bump flask-migrate from 3.1.0 to 4.1.0 (#41011)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 12:18:08 -07:00
dependabot[bot]
1f95a6c486 chore(deps): bump simplejson from 3.20.1 to 4.1.1 (#41082)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 11:00:42 -07:00
dependabot[bot]
e93cbd6c38 chore(deps): bump croniter from 6.0.0 to 6.2.2 (#41086)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 10:59:00 -07:00
dependabot[bot]
dca8af770c chore(deps-dev): bump typescript-eslint from 8.60.1 to 8.61.0 in /superset-websocket (#41087)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 10:58:39 -07:00
dependabot[bot]
81c1181519 chore(deps-dev): bump typescript-eslint from 8.60.1 to 8.61.0 in /docs (#41092)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 10:56:44 -07:00
dependabot[bot]
387c62919e chore(deps): bump hot-shots from 15.0.0 to 16.0.0 in /superset-websocket (#41107)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 10:56:22 -07:00
dependabot[bot]
77d7483f27 chore(deps-dev): bump @formatjs/intl-durationformat from 0.10.13 to 0.10.14 in /superset-frontend (#41109)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 10:54:22 -07:00
dependabot[bot]
1a8d08152d chore(deps): bump fuse.js from 7.4.1 to 7.4.2 in /superset-frontend (#41110)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 10:54:06 -07:00
Bob Jo
257dafeec5 fix(query): don't mutate ad-hoc ORDER BY expressions when building queries (#40993)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-16 13:03:39 -04:00
Alexandru Soare
6d08e79259 feat(security): Add extension hooks for custom access control, ownership, and asset lifecycle (#40707) 2026-06-16 15:25:03 +03:00
Geidō
01ed81785e fix(dashboard): required filters reliably apply default + Apply enables on change (#40470) 2026-06-16 11:23:05 +03:00
Vighnesh Tule
7b4efacbc2 fix(charts): add default padding to match other charts (#36895)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-06-15 21:05:17 -07:00
Amin Ghadersohi
7cb4990403 feat(mcp): add create_dataset tool to register physical tables as datasets (#40340)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 23:25:29 -04:00
dependabot[bot]
c90b2571d7 chore(deps-dev): bump xlrd from 2.0.1 to 2.0.2 (#41083)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:19:43 -07:00
dependabot[bot]
1a4941eee5 chore(deps-dev): bump hdbcli from 2.28.20 to 2.28.21 (#41084)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:19:33 -07:00
dependabot[bot]
d839cca995 chore(deps-dev): update pyocient requirement from <2,>=1.0.15 to >=1.0.15,<4 (#40941)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-15 18:18:25 -07:00
dependabot[bot]
0ec7e7df99 chore(deps): bump dompurify from 3.4.8 to 3.4.9 in /superset-frontend (#41089)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:16:36 -07:00
dependabot[bot]
9d8287e1bd chore(deps-dev): bump @typescript-eslint/parser from 8.60.1 to 8.61.0 in /superset-websocket (#41090)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:16:21 -07:00
dependabot[bot]
0c696cea7e chore(deps): bump google-auth-library from 10.6.2 to 10.7.0 in /superset-frontend (#41091)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:16:05 -07:00
dependabot[bot]
fe625a917e chore(deps-dev): bump @typescript-eslint/parser from 8.60.1 to 8.61.0 in /docs (#41093)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:14:51 -07:00
dependabot[bot]
a69f9eb00d chore(deps-dev): bump oxlint from 1.68.0 to 1.69.0 in /superset-frontend (#41094)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:14:27 -07:00
Evan Rusackas
1311d040ba feat(deckgl): add point radius controls for GeoJSON layer (#33247)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-06-15 17:38:43 -07:00
Evan Rusackas
6e2db42d98 chore(lint): convert dashboard components to function components (#39460)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
2026-06-15 16:39:12 -07:00
yousoph
28aedc82c3 fix(upload): database field shows validation warning after selecting a database (#41078) 2026-06-15 16:38:24 -07:00
Evan Rusackas
f56524bb71 chore(frontend): remove unused modules flagged by knip (#41072)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-15 16:38:00 -07:00
Evan Rusackas
4ae9980e4c chore(ci): remove unused Claude PR Assistant workflow (#41081)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-15 16:37:39 -07:00
903 changed files with 97528 additions and 45496 deletions

2
.github/CODEOWNERS vendored
View File

@@ -38,7 +38,7 @@
# Notify translation maintainers of changes to translations # Notify translation maintainers of changes to translations
/superset/translations/ @sfirke @rusackas /superset/translations/ @sfirke @rusackas @villebro @sadpandajoe @hainenber
# Notify PMC members of changes to extension-related files # Notify PMC members of changes to extension-related files

View File

@@ -42,7 +42,7 @@ runs:
fi fi
echo "python-version=$RESOLVED_VERSION" >> "$GITHUB_OUTPUT" echo "python-version=$RESOLVED_VERSION" >> "$GITHUB_OUTPUT"
- name: Set up Python ${{ steps.set-python-version.outputs.python-version }} - name: Set up Python ${{ steps.set-python-version.outputs.python-version }}
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with: with:
python-version: ${{ steps.set-python-version.outputs.python-version }} python-version: ${{ steps.set-python-version.outputs.python-version }}
cache: ${{ inputs.cache }} cache: ${{ inputs.cache }}

View File

@@ -3,10 +3,6 @@ enable-beta-ecosystems: true
updates: updates:
- package-ecosystem: "github-actions" - package-ecosystem: "github-actions"
directory: "/" directory: "/"
ignore:
# Ignore temporarily as release schedule is too mentally taxing for dep-handling maintainers
# Additionally, very few PRs are reviewed by this action.
- dependency-name: anthropics/claude-code-action
schedule: schedule:
interval: "daily" interval: "daily"
cooldown: cooldown:
@@ -36,6 +32,13 @@ updates:
# and confirm the issue https://github.com/apache/superset/issues/39600 is fixed # and confirm the issue https://github.com/apache/superset/issues/39600 is fixed
- dependency-name: "react-checkbox-tree" - dependency-name: "react-checkbox-tree"
update-types: ["version-update:semver-major"] update-types: ["version-update:semver-major"]
# Babel 8 (7.x -> 8.x) is blocked on the surrounding ecosystem: @emotion/babel-plugin
# (NodePath#hoist), babel-plugin-jsx-remove-data-test-id (t.jSXOpeningElement), and
# ts-jest all rely on Babel APIs removed in v8 and have not shipped Babel 8 support.
# Ignore the coordinated major bump until the ecosystem catches up; it must be done
# as a single manual upgrade anyway. TODO: remove when Babel 8 support is viable.
- dependency-name: "@babel/*"
update-types: ["version-update:semver-major"]
directory: "/superset-frontend/" directory: "/superset-frontend/"
schedule: schedule:
interval: "daily" interval: "daily"

View File

@@ -114,7 +114,7 @@ testdata() {
say "::group::Load test data" say "::group::Load test data"
# must specify PYTHONPATH to make `tests.superset_test_config` importable # must specify PYTHONPATH to make `tests.superset_test_config` importable
export PYTHONPATH="$GITHUB_WORKSPACE" export PYTHONPATH="$GITHUB_WORKSPACE"
pip install -e . uv pip install --system -e .
superset db upgrade superset db upgrade
superset load_test_users superset load_test_users
superset load_examples --load-test-data superset load_examples --load-test-data
@@ -127,7 +127,7 @@ playwright_testdata() {
say "::group::Load all examples for Playwright tests" say "::group::Load all examples for Playwright tests"
# must specify PYTHONPATH to make `tests.superset_test_config` importable # must specify PYTHONPATH to make `tests.superset_test_config` importable
export PYTHONPATH="$GITHUB_WORKSPACE" export PYTHONPATH="$GITHUB_WORKSPACE"
pip install -e . uv pip install --system -e .
superset db upgrade superset db upgrade
superset load_test_users superset load_test_users
superset load_examples superset load_examples

View File

@@ -31,7 +31,7 @@ jobs:
checks: write checks: write
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: true persist-credentials: true
ref: master ref: master
@@ -40,7 +40,7 @@ jobs:
uses: ./.github/actions/setup-supersetbot/ uses: ./.github/actions/setup-supersetbot/
- name: Set up Python ${{ inputs.python-version }} - name: Set up Python ${{ inputs.python-version }}
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with: with:
python-version: "3.10" python-version: "3.10"

View File

@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive

View File

@@ -25,7 +25,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Check and notify - name: Check and notify

View File

@@ -1,88 +0,0 @@
name: Claude PR Assistant
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
permissions:
contents: read
jobs:
check-permissions:
if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude'))
runs-on: ubuntu-latest
outputs:
allowed: ${{ steps.check.outputs.allowed }}
steps:
- name: Check if user is allowed
id: check
env:
COMMENTER: ${{ github.event.comment.user.login }}
run: |
# List of allowed users
ALLOWED_USERS="mistercrunch,rusackas"
echo "Checking permissions for user: $COMMENTER"
# Check if user is in allowed list
if [[ ",$ALLOWED_USERS," == *",$COMMENTER,"* ]]; then
echo "allowed=true" >> $GITHUB_OUTPUT
echo "✅ User $COMMENTER is allowed to use Claude"
else
echo "allowed=false" >> $GITHUB_OUTPUT
echo "❌ User $COMMENTER is not allowed to use Claude"
fi
deny-access:
needs: check-permissions
if: needs.check-permissions.outputs.allowed == 'false'
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- name: Comment access denied
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
env:
COMMENTER_LOGIN: ${{ github.event.comment.user.login || github.event.review.user.login || github.event.issue.user.login }}
with:
script: |
const commenter = process.env.COMMENTER_LOGIN;
const message = `👋 Hi @${commenter}!
Thanks for trying to use Claude Code, but currently only certain team members have access to this feature.
If you believe you should have access, please contact a project maintainer.`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: message
});
claude-code-action:
needs: check-permissions
if: needs.check-permissions.outputs.allowed == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
fetch-depth: 1
- name: Run Claude PR Action
uses: anthropics/claude-code-action@5fb899572b81d2bb648d4d187173a2f423a9677c # beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
timeout_minutes: "60"

View File

@@ -26,7 +26,7 @@ jobs:
frontend: ${{ steps.check.outputs.frontend }} frontend: ${{ steps.check.outputs.frontend }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Check for file changes - name: Check for file changes
@@ -47,6 +47,7 @@ jobs:
permissions: permissions:
actions: read actions: read
contents: read contents: read
pull-requests: read
security-events: write security-events: write
strategy: strategy:
@@ -57,7 +58,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -27,7 +27,7 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: "Checkout Repository" - name: "Checkout Repository"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: "Dependency Review" - name: "Dependency Review"
@@ -43,7 +43,7 @@ jobs:
# the latest version. It's MIT: https://github.com/nbubna/store/blob/master/LICENSE-MIT # the latest version. It's MIT: https://github.com/nbubna/store/blob/master/LICENSE-MIT
# pkg:npm/node-forge@1.3.1 # pkg:npm/node-forge@1.3.1
# selecting BSD-3-Clause licensing terms for node-forge to ensure compatibility with Apache # selecting BSD-3-Clause licensing terms for node-forge to ensure compatibility with Apache
allow-dependencies-licenses: pkg:npm/store2@2.14.2, pkg:npm/node-forge@1.3.1, pkg:npm/rgbcolor, pkg:npm/jszip@3.10.1 allow-dependencies-licenses: pkg:npm/rgbcolor, pkg:npm/jszip@3.10.1
python-dependency-liccheck: python-dependency-liccheck:
# NOTE: Configuration for liccheck lives in our pyproject.yml. # NOTE: Configuration for liccheck lives in our pyproject.yml.
@@ -51,7 +51,7 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- name: "Checkout Repository" - name: "Checkout Repository"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -30,7 +30,7 @@ jobs:
docker: ${{ steps.check.outputs.docker }} docker: ${{ steps.check.outputs.docker }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Check for file changes - name: Check for file changes
@@ -71,10 +71,28 @@ jobs:
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Free up disk space
shell: bash
run: |
# Reclaim large preinstalled toolchains we don't use. The image
# build, and especially the docker-compose sanity check (which
# rebuilds from scratch whenever the registry cache image
# apache/superset-cache is unavailable), can otherwise exhaust the
# runner's root disk and fail with "no space left on device".
echo "Disk before cleanup:"; df -h /
sudo rm -rf \
/usr/share/dotnet \
/usr/local/lib/android \
/opt/ghc \
/usr/local/.ghcup \
/opt/hostedtoolcache/CodeQL \
/usr/local/share/boost || true
echo "Disk after cleanup:"; df -h /
- name: Setup Docker Environment - name: Setup Docker Environment
uses: ./.github/actions/setup-docker uses: ./.github/actions/setup-docker
with: with:
@@ -101,13 +119,27 @@ jobs:
PUSH_OR_LOAD="--load" PUSH_OR_LOAD="--load"
fi fi
supersetbot docker \ # Retry to absorb transient Docker Hub registry errors (base-image
$PUSH_OR_LOAD \ # pull timeouts, 504/401 on push, ECONNRESET) that otherwise fail
--preset "$BUILD_PRESET" \ # the whole job. buildx reuses the buildkit layer cache from the
--context "$EVENT" \ # failed attempt, so a retry mostly re-does just the failed push.
--context-ref "$RELEASE" $FORCE_LATEST \ for attempt in 1 2 3; do
--extra-flags "--build-arg INCLUDE_CHROMIUM=false --tag $IMAGE_TAG" \ if supersetbot docker \
$PLATFORM_ARG $PUSH_OR_LOAD \
--preset "$BUILD_PRESET" \
--context "$EVENT" \
--context-ref "$RELEASE" $FORCE_LATEST \
--extra-flags "--build-arg INCLUDE_CHROMIUM=false --tag $IMAGE_TAG" \
$PLATFORM_ARG; then
break
fi
if [ "$attempt" -eq 3 ]; then
echo "::error::supersetbot docker build failed after 3 attempts"
exit 1
fi
echo "::warning::Build attempt ${attempt} failed; retrying in 30s..."
sleep 30
done
# in the context of push (using multi-platform build), we need to pull the image locally # in the context of push (using multi-platform build), we need to pull the image locally
- name: Docker pull - name: Docker pull
@@ -145,9 +177,24 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Free up disk space
shell: bash
run: |
# The sanity check rebuilds the image from scratch whenever the
# registry cache image apache/superset-cache is unavailable, which
# can exhaust the runner's root disk ("no space left on device").
echo "Disk before cleanup:"; df -h /
sudo rm -rf \
/usr/share/dotnet \
/usr/local/lib/android \
/opt/ghc \
/usr/local/.ghcup \
/opt/hostedtoolcache/CodeQL \
/usr/local/share/boost || true
echo "Disk after cleanup:"; df -h /
- name: Setup Docker Environment - name: Setup Docker Environment
uses: ./.github/actions/setup-docker uses: ./.github/actions/setup-docker
with: with:

View File

@@ -10,37 +10,29 @@ permissions:
contents: read contents: read
jobs: jobs:
config:
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
- name: "Check for secrets"
id: check
shell: bash
run: |
if [ -n "${NPM_TOKEN}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
env:
NPM_TOKEN: ${{ (secrets.NPM_TOKEN != '') || '' }}
build: build:
needs: config # Publishing uses npm trusted publishing (OIDC), so there is no NPM_TOKEN to
if: needs.config.outputs.has-secrets # gate on. Restrict to the canonical repo: forks cannot mint a valid OIDC
# token for this package and must not publish.
if: github.repository == 'apache/superset'
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
permissions:
contents: read
id-token: write # required for npm trusted publishing (OIDC)
defaults: defaults:
run: run:
working-directory: superset-embedded-sdk working-directory: superset-embedded-sdk
steps: steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
# Note: registry-url is intentionally omitted. When set, actions/setup-node
# writes an .npmrc with `_authToken=${NODE_AUTH_TOKEN}` and a placeholder
# token, which makes npm attempt token auth and skip the OIDC
# trusted-publishing exchange. With no .npmrc auth line, npm authenticates
# via OIDC against the default registry (registry.npmjs.org).
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with: with:
node-version-file: "./superset-embedded-sdk/.nvmrc" node-version-file: "./superset-embedded-sdk/.nvmrc"
registry-url: "https://registry.npmjs.org"
- run: npm ci - run: npm ci
- run: npm run ci:release - run: npm run ci:release
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -21,7 +21,7 @@ jobs:
run: run:
working-directory: superset-embedded-sdk working-directory: superset-embedded-sdk
steps: steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6

View File

@@ -32,12 +32,12 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: "temurin" distribution: "temurin"
java-version: "11" java-version: "11"

View File

@@ -27,7 +27,7 @@ jobs:
security-events: write security-events: write
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
@@ -43,4 +43,4 @@ jobs:
run: bash .github/workflows/github-action-validator.sh run: bash .github/workflows/github-action-validator.sh
- name: Check for security issues on GHA workflows - name: Check for security issues on GHA workflows
uses: zizmorcore/zizmor-action@5f14fd08f7cf1cb1609c1e344975f152c7ee938d # v0.5.6 uses: zizmorcore/zizmor-action@192e21d79ab29983730a13d1382995c2307fbcaa # v0.5.7

View File

@@ -16,7 +16,7 @@ jobs:
issues: write issues: write
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -12,7 +12,7 @@ jobs:
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive

View File

@@ -18,12 +18,12 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: "temurin" distribution: "temurin"
java-version: "11" java-version: "11"

View File

@@ -21,7 +21,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive

View File

@@ -28,7 +28,7 @@ jobs:
python-version: ${{ github.event_name == 'pull_request' && fromJSON('["current"]') || fromJSON('["current", "previous", "next"]') }} python-version: ${{ github.event_name == 'pull_request' && fromJSON('["current"]') || fromJSON('["current", "previous", "next"]') }}
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
@@ -63,7 +63,7 @@ jobs:
yarn install --immutable yarn install --immutable
- name: Cache pre-commit environments - name: Cache pre-commit environments
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with: with:
path: ~/.cache/pre-commit path: ~/.cache/pre-commit
key: pre-commit-v2-${{ runner.os }}-py${{ matrix.python-version }}-${{ hashFiles('.pre-commit-config.yaml') }} key: pre-commit-v2-${{ runner.os }}-py${{ matrix.python-version }}-${{ hashFiles('.pre-commit-config.yaml') }}

View File

@@ -33,7 +33,7 @@ jobs:
permissions: permissions:
contents: write contents: write
steps: steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
# pulls all commits (needed for lerna / semantic release to correctly version) # pulls all commits (needed for lerna / semantic release to correctly version)
@@ -56,7 +56,7 @@ jobs:
- name: Cache npm - name: Cache npm
if: env.HAS_TAGS if: env.HAS_TAGS
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with: with:
path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS
key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}
@@ -70,7 +70,7 @@ jobs:
run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- name: Cache npm - name: Cache npm
if: env.HAS_TAGS if: env.HAS_TAGS
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
id: npm-cache # use this to check for `cache-hit` (`steps.npm-cache.outputs.cache-hit != 'true'`) id: npm-cache # use this to check for `cache-hit` (`steps.npm-cache.outputs.cache-hit != 'true'`)
with: with:
path: ${{ steps.npm-cache-dir-path.outputs.dir }} path: ${{ steps.npm-cache-dir-path.outputs.dir }}

View File

@@ -0,0 +1,177 @@
name: Scheduled Docker image refresh
# Re-runs the Docker image build against the latest published release on a
# weekly cadence. The code being built doesn't change — but the base image
# layers (python:*-slim-trixie and its OS packages) DO get upstream
# security patches between Superset releases, and those patches don't
# reach our published images unless we rebuild.
#
# Without this workflow, `apache/superset:<latest>` lags behind upstream
# Debian/Python base patches by whatever interval falls between Superset
# releases (typically 36 weeks). With it, the lag drops to at most one
# week regardless of release cadence.
#
# This is a security-hygiene cron, not a release. It overwrites the
# existing tags for the most recent release (e.g. `apache/superset:5.0.0`
# and `apache/superset:latest`) with bit-for-bit-equivalent contents
# layered on a refreshed base. Image digests change; everything users
# actually pin against (image content, code, deps) does not.
on:
schedule:
# Mondays at 06:00 UTC — gives the weekend for upstream patches to
# settle and surfaces failures at the start of the work week so a
# human can react.
- cron: "0 6 * * 1"
# Manual trigger so operators can force a refresh on demand (e.g.
# immediately after a high-severity base-image CVE drops).
workflow_dispatch: {}
permissions:
contents: read
# Serialize with itself and with the release publisher (tag-release.yml) —
# both push to the same Docker Hub tags, so a race could end with stale
# layers winning. Both workflows must declare this group for the lock to work.
concurrency:
group: docker-publish-latest-release
cancel-in-progress: false
jobs:
config:
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
latest-release: ${{ steps.latest.outputs.tag }}
force-latest: ${{ steps.latest.outputs.force-latest }}
steps:
- name: Check for Docker Hub secrets
id: check
shell: bash
run: |
if [ -n "${DOCKERHUB_USER}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
env:
DOCKERHUB_USER: ${{ (secrets.DOCKERHUB_USER != '' && secrets.DOCKERHUB_TOKEN != '') || '' }}
- name: Look up latest published release
id: latest
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPOSITORY: ${{ github.repository }}
run: |
# `releases/latest` returns the latest non-prerelease, non-draft
# release — which is exactly what `apache/superset:latest`
# should reflect.
TAG=$(gh api "repos/${REPOSITORY}/releases/latest" --jq .tag_name)
if [ -z "$TAG" ] || [ "$TAG" = "null" ]; then
echo "::error::Could not determine latest release tag"
exit 1
fi
echo "Latest release: $TAG"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
# Only move `:latest` when the release flagged "latest" is also the
# highest semver release. This guards against a mis-click leaving an
# older maintenance release (e.g. a 5.x patch shipped after 6.0 GA)
# marked latest, which would otherwise roll `:latest` back a major
# version on the next cron run. If it isn't the newest, we still
# refresh that release's own version tag but leave `:latest` alone.
HIGHEST=$(gh api --paginate "repos/${REPOSITORY}/releases" \
--jq '.[] | select(.draft|not) | select(.prerelease|not) | .tag_name' \
| sed 's/^v//' | sort -V | tail -n1)
if [ "${TAG#v}" = "$HIGHEST" ]; then
echo "force-latest=1" >> "$GITHUB_OUTPUT"
else
echo "::warning::Latest-flagged release $TAG is not the highest semver ($HIGHEST); refreshing its version tag but leaving :latest untouched"
fi
docker-rebuild:
needs: config
if: needs.config.outputs.has-secrets == '1'
name: docker-rebuild
runs-on: ubuntu-24.04
strategy:
# Mirror the same matrix the release publisher uses so every variant
# operators consume from Docker Hub gets the refreshed base.
matrix:
build_preset: ["dev", "lean", "py310", "websocket", "dockerize", "py311", "py312"]
fail-fast: false
steps:
- name: "Checkout release tag: ${{ needs.config.outputs.latest-release }}"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ needs.config.outputs.latest-release }}
fetch-depth: 0
persist-credentials: false
- name: Setup Docker Environment
uses: ./.github/actions/setup-docker
with:
dockerhub-user: ${{ secrets.DOCKERHUB_USER }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
install-docker-compose: "false"
build: "true"
- name: Use Node.js 20
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: 20
- name: Setup supersetbot
uses: ./.github/actions/setup-supersetbot/
- name: Rebuild and push
env:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BUILD_PRESET: ${{ matrix.build_preset }}
LATEST_RELEASE: ${{ needs.config.outputs.latest-release }}
FORCE_LATEST_FLAG: ${{ needs.config.outputs.force-latest == '1' && '--force-latest' || '' }}
run: |
# Reuses the same supersetbot invocation as the release
# publisher (`tag-release.yml`), so the resulting tags are
# identical to what a manual release dispatch would produce —
# just with a freshly-pulled base image layer underneath.
# `--force-latest` is only passed when the config job confirmed the
# fetched release is the newest one (see FORCE_LATEST_FLAG above).
supersetbot docker \
--push \
--preset "$BUILD_PRESET" \
--context release \
--context-ref "$LATEST_RELEASE" \
$FORCE_LATEST_FLAG \
--platform "linux/arm64" \
--platform "linux/amd64"
# The whole point of this cron is catching base-image CVEs, so a silent
# failure is the expensive case — a red X in the Actions tab nobody is
# watching on a Monday. File a tracked issue when any rebuild leg fails so
# a missed security refresh surfaces instead of sitting unnoticed.
notify-on-failure:
needs: [config, docker-rebuild]
if: failure() && needs.config.outputs.has-secrets == '1'
runs-on: ubuntu-24.04
permissions:
contents: read
issues: write
steps:
- name: Open a tracking issue
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPOSITORY: ${{ github.repository }}
LATEST_RELEASE: ${{ needs.config.outputs.latest-release }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: |
gh issue create \
--repo "$REPOSITORY" \
--title "Scheduled Docker image refresh failed for ${LATEST_RELEASE}" \
--label "infra:container" \
--label "bug" \
--body "The weekly Docker base-image refresh failed for release \`${LATEST_RELEASE}\`. Published images may be missing upstream base-layer security patches until this is resolved.
Failed run: ${RUN_URL}"

View File

@@ -24,13 +24,14 @@ jobs:
permissions: permissions:
contents: read contents: read
issues: write # delete orphaned showtime label definitions (label CRUD is the issues API)
pull-requests: write pull-requests: write
steps: steps:
- name: Install Superset Showtime - name: Install Superset Showtime
run: pip install superset-showtime run: pip install superset-showtime
- name: Cleanup expired environments - name: Cleanup expired environments and orphaned labels
run: | run: |
echo "Cleaning up environments respecting TTL labels" echo "Cleaning up environments respecting TTL labels, and pruning orphaned 🎪 labels"
python -m showtime cleanup --respect-ttl python -m showtime cleanup --respect-ttl --force

View File

@@ -152,7 +152,7 @@ jobs:
- name: Checkout PR code (only if build needed) - name: Checkout PR code (only if build needed)
if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.build_needed == 'true' if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.build_needed == 'true'
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
ref: ${{ steps.check.outputs.target_sha }} ref: ${{ steps.check.outputs.target_sha }}
persist-credentials: false persist-credentials: false

View File

@@ -41,7 +41,7 @@ jobs:
- 16379:6379 - 16379:6379
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
@@ -61,7 +61,7 @@ jobs:
- name: superset init - name: superset init
if: steps.check.outputs.python if: steps.check.outputs.python
run: | run: |
pip install -e . uv pip install --system -e .
superset db upgrade superset db upgrade
superset load_test_users superset load_test_users
- name: superset load_examples - name: superset load_examples

View File

@@ -60,7 +60,7 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: "Checkout ${{ github.event.workflow_run.head_sha || github.sha }}" - name: "Checkout ${{ github.event.workflow_run.head_sha || github.sha }}"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
ref: ${{ github.event.workflow_run.head_sha || github.sha }} ref: ${{ github.event.workflow_run.head_sha || github.sha }}
persist-credentials: false persist-credentials: false
@@ -71,7 +71,7 @@ jobs:
node-version-file: "./docs/.nvmrc" node-version-file: "./docs/.nvmrc"
- name: Setup Python - name: Setup Python
uses: ./.github/actions/setup-backend/ uses: ./.github/actions/setup-backend/
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5 - uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: "zulu" distribution: "zulu"
java-version: "21" java-version: "21"

View File

@@ -28,7 +28,7 @@ jobs:
name: Link Checking name: Link Checking
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
# Do not bump this linkinator-action version without opening # Do not bump this linkinator-action version without opening
@@ -73,7 +73,7 @@ jobs:
working-directory: docs working-directory: docs
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
@@ -112,7 +112,7 @@ jobs:
working-directory: docs working-directory: docs
steps: steps:
- name: "Checkout PR head: ${{ github.event.workflow_run.head_sha }}" - name: "Checkout PR head: ${{ github.event.workflow_run.head_sha }}"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
ref: ${{ github.event.workflow_run.head_sha }} ref: ${{ github.event.workflow_run.head_sha }}
persist-credentials: false persist-credentials: false

View File

@@ -38,7 +38,7 @@ jobs:
frontend: ${{ steps.check.outputs.frontend }} frontend: ${{ steps.check.outputs.frontend }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Check for file changes - name: Check for file changes
@@ -49,7 +49,7 @@ jobs:
cypress-matrix: cypress-matrix:
needs: changes needs: changes
if: needs.changes.outputs.python == 'true' || needs.changes.outputs.frontend == 'true' if: (needs.changes.outputs.python == 'true' || needs.changes.outputs.frontend == 'true') && github.event.pull_request.draft == false
# Somehow one test flakes on 24.04 for unknown reasons, this is the only GHA left on 22.04 # Somehow one test flakes on 24.04 for unknown reasons, this is the only GHA left on 22.04
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
timeout-minutes: 30 timeout-minutes: 30
@@ -97,21 +97,21 @@ jobs:
# Conditional checkout based on context # Conditional checkout based on context
- name: Checkout for push or pull_request event - name: Checkout for push or pull_request event
if: github.event_name == 'push' || github.event_name == 'pull_request' if: github.event_name == 'push' || github.event_name == 'pull_request'
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
- name: Checkout using ref (workflow_dispatch) - name: Checkout using ref (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != '' if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
ref: ${{ github.event.inputs.ref }} ref: ${{ github.event.inputs.ref }}
submodules: recursive submodules: recursive
- name: Checkout using PR ID (workflow_dispatch) - name: Checkout using PR ID (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != '' if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
@@ -207,21 +207,21 @@ jobs:
# Conditional checkout based on context (same as Cypress workflow) # Conditional checkout based on context (same as Cypress workflow)
- name: Checkout for push or pull_request event - name: Checkout for push or pull_request event
if: github.event_name == 'push' || github.event_name == 'pull_request' if: github.event_name == 'push' || github.event_name == 'pull_request'
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
- name: Checkout using ref (workflow_dispatch) - name: Checkout using ref (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != '' if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
ref: ${{ github.event.inputs.ref }} ref: ${{ github.event.inputs.ref }}
submodules: recursive submodules: recursive
- name: Checkout using PR ID (workflow_dispatch) - name: Checkout using PR ID (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != '' if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge ref: refs/pull/${{ github.event.inputs.pr_id }}/merge

View File

@@ -31,7 +31,7 @@ jobs:
working-directory: superset-extensions-cli working-directory: superset-extensions-cli
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive

View File

@@ -27,7 +27,7 @@ jobs:
should-run: ${{ steps.check.outputs.frontend }} should-run: ${{ steps.check.outputs.frontend }}
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
fetch-depth: 0 fetch-depth: 0
@@ -110,7 +110,7 @@ jobs:
id-token: write id-token: write
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
fetch-depth: 0 fetch-depth: 0

View File

@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive

View File

@@ -29,7 +29,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
ref: ${{ inputs.ref || github.ref_name }} ref: ${{ inputs.ref || github.ref_name }}
persist-credentials: true persist-credentials: true

View File

@@ -34,7 +34,7 @@ jobs:
frontend: ${{ steps.check.outputs.frontend }} frontend: ${{ steps.check.outputs.frontend }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Check for file changes - name: Check for file changes
@@ -83,21 +83,21 @@ jobs:
# Conditional checkout based on context (same as Cypress workflow) # Conditional checkout based on context (same as Cypress workflow)
- name: Checkout for push or pull_request event - name: Checkout for push or pull_request event
if: github.event_name == 'push' || github.event_name == 'pull_request' if: github.event_name == 'push' || github.event_name == 'pull_request'
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
- name: Checkout using ref (workflow_dispatch) - name: Checkout using ref (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != '' if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
ref: ${{ github.event.inputs.ref }} ref: ${{ github.event.inputs.ref }}
submodules: recursive submodules: recursive
- name: Checkout using PR ID (workflow_dispatch) - name: Checkout using PR ID (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != '' if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge ref: refs/pull/${{ github.event.inputs.pr_id }}/merge

View File

@@ -1,6 +1,11 @@
# Python integration tests # Python integration tests
name: Python-Integration name: Python-Integration
# Least-privilege default for GITHUB_TOKEN. Jobs that need more (e.g. OIDC for
# codecov uploads) opt in via their own job-level `permissions:` block.
permissions:
contents: read
on: on:
push: push:
branches: branches:
@@ -24,7 +29,7 @@ jobs:
python: ${{ steps.check.outputs.python }} python: ${{ steps.check.outputs.python }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Check for file changes - name: Check for file changes
@@ -67,7 +72,7 @@ jobs:
- 16379:6379 - 16379:6379
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
@@ -152,7 +157,7 @@ jobs:
- 16379:6379 - 16379:6379
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
@@ -202,7 +207,7 @@ jobs:
- 16379:6379 - 16379:6379
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive

View File

@@ -25,7 +25,7 @@ jobs:
python: ${{ steps.check.outputs.python }} python: ${{ steps.check.outputs.python }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Check for file changes - name: Check for file changes
@@ -72,7 +72,7 @@ jobs:
- 16379:6379 - 16379:6379
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
@@ -127,7 +127,7 @@ jobs:
- 16379:6379 - 16379:6379
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
@@ -149,7 +149,7 @@ jobs:
run: celery-worker run: celery-worker
- name: Python unit tests (PostgreSQL) - name: Python unit tests (PostgreSQL)
run: | run: |
pip install -e .[hive] uv pip install --system -e .[hive]
./scripts/python_tests.sh -m 'chart_data_flow or sql_json_flow' ./scripts/python_tests.sh -m 'chart_data_flow or sql_json_flow'
- name: Upload code coverage - name: Upload code coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0

View File

@@ -1,6 +1,11 @@
# Python unit tests # Python unit tests
name: Python-Unit name: Python-Unit
# Least-privilege default for GITHUB_TOKEN. Jobs that need more (e.g. OIDC for
# codecov uploads) opt in via their own job-level `permissions:` block.
permissions:
contents: read
on: on:
push: push:
branches: branches:
@@ -25,7 +30,7 @@ jobs:
python: ${{ steps.check.outputs.python }} python: ${{ steps.check.outputs.python }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Check for file changes - name: Check for file changes
@@ -50,7 +55,7 @@ jobs:
PYTHONPATH: ${{ github.workspace }} PYTHONPATH: ${{ github.workspace }}
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive

View File

@@ -25,7 +25,7 @@ jobs:
pull-requests: read pull-requests: read
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive
@@ -61,7 +61,7 @@ jobs:
pull-requests: read pull-requests: read
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
submodules: recursive submodules: recursive

View File

@@ -25,9 +25,13 @@ jobs:
timeout-minutes: 20 timeout-minutes: 20
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version-file: './superset-websocket/.nvmrc'
- name: Install dependencies - name: Install dependencies
working-directory: ./superset-websocket working-directory: ./superset-websocket
run: npm ci run: npm ci

View File

@@ -38,7 +38,7 @@ jobs:
}); });
- name: "Checkout ( ${{ github.sha }} )" - name: "Checkout ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -0,0 +1,60 @@
name: Sync requirements for Python dependency PRs
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: write
pull-requests: read
jobs:
sync-python-dep-requirements:
# This action is limited for (1) PRs authored by Dependabot and (2) upstream repo due to write back to remote
if: github.repository == 'apache/superset' && github.event.pull_request.user.login == 'dependabot[bot]' && github.event.pull_request.head.repo.fork == false
runs-on: ubuntu-26.04
steps:
- name: Fetch Dependabot metadata
id: dependabot-metadata
shell: bash
env:
BRANCH_NAME: ${{ github.head_ref }}
run: |
# Get current branch name, extract the package ecosystem and return as GHA step output
packageEcosystem=$(echo "$BRANCH_NAME" | cut -d'/' -f2)
echo "package-ecosystem=$packageEcosystem" >> $GITHUB_OUTPUT
# zizmor: ignore[artipacked] - required persisted credentials to push synced requirement changes back to remote
- name: Checkout source code
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ github.event.pull_request.head.sha }}
persist-credentials: true
# Authenticate the Docker daemon so the python:slim pull in
# uv-pip-compile.sh uses our (much higher) authenticated rate limit
# instead of the shared-runner anonymous one.
- name: Login to Docker Hub
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
continue-on-error: true
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Sync requirements in containerized environment
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
run: ./scripts/uv-pip-compile.sh
- name: Push changes to remote PRs
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
run: |
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git add requirements
git diff --cached --quiet && exit 0
git commit --signoff --message "build(deps): sync pinned requirements for Dependabot pip PRs"
git push origin "HEAD:refs/heads/${GITHUB_EVENT_PULL_REQUEST_HEAD_REF}"
env:
GITHUB_EVENT_PULL_REQUEST_HEAD_REF: ${{ github.event.pull_request.head.ref }}

View File

@@ -24,6 +24,12 @@ on:
permissions: permissions:
contents: read contents: read
# Serialize with the scheduled Docker image refresh — both workflows push
# to the same Docker Hub tags and must not race on apache/superset:latest.
concurrency:
group: docker-publish-latest-release
cancel-in-progress: false
jobs: jobs:
config: config:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
@@ -54,7 +60,7 @@ jobs:
fail-fast: false fail-fast: false
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
fetch-depth: 0 fetch-depth: 0
@@ -120,7 +126,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false
fetch-depth: 0 fetch-depth: 0

View File

@@ -32,7 +32,7 @@ jobs:
name: Generate Reports name: Generate Reports
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -50,3 +50,4 @@ under the License.
- [4.1.4](./CHANGELOG/4.1.4.md) - [4.1.4](./CHANGELOG/4.1.4.md)
- [5.0.0](./CHANGELOG/5.0.0.md) - [5.0.0](./CHANGELOG/5.0.0.md)
- [6.0.0](./CHANGELOG/6.0.0.md) - [6.0.0](./CHANGELOG/6.0.0.md)
- [6.1.0](./CHANGELOG/6.1.0.md)

1563
CHANGELOG/6.1.0.md Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -23,11 +23,14 @@ PYTHON=`command -v python3.11 || command -v python3.10`
install: superset pre-commit install: superset pre-commit
superset: superset:
# Bootstrap uv (the project's installer) into the active environment
pip install uv
# Install external dependencies # Install external dependencies
pip install -r requirements/development.txt uv pip install -r requirements/development.txt
# Install Superset in editable (development) mode # Install Superset in editable (development) mode
pip install -e . uv pip install -e .
# Create an admin user in your metadata database # Create an admin user in your metadata database
superset fab create-admin \ superset fab create-admin \
@@ -52,11 +55,14 @@ superset:
update: update-py update-js update: update-py update-js
update-py: update-py:
# Bootstrap uv (the project's installer) into the active environment
pip install uv
# Install external dependencies # Install external dependencies
pip install -r requirements/development.txt uv pip install -r requirements/development.txt
# Install Superset in editable (development) mode # Install Superset in editable (development) mode
pip install -e . uv pip install -e .
# Initialize the database # Initialize the database
superset db upgrade superset db upgrade
@@ -79,7 +85,8 @@ activate:
pre-commit: pre-commit:
# setup pre commit dependencies # setup pre commit dependencies
pip3 install -r requirements/development.txt pip install uv
uv pip install -r requirements/development.txt
pre-commit install pre-commit install
format: py-format js-format format: py-format js-format

View File

@@ -83,6 +83,9 @@ categories:
- name: Clark.de - name: Clark.de
url: https://clark.de/ url: https://clark.de/
- name: Cover Genius
url: https://covergenius.com/
- name: EnquiryLabs - name: EnquiryLabs
url: https://www.enquirylabs.co.uk url: https://www.enquirylabs.co.uk
@@ -92,6 +95,10 @@ categories:
- name: KarrotPay - name: KarrotPay
url: https://www.daangnpay.com/ url: https://www.daangnpay.com/
- name: NICE Actimize
url: https://www.niceactimize.com/
contributors: ["@stevensuting"]
- name: Remita - name: Remita
url: https://remita.net url: https://remita.net
contributors: ["@mujibishola"] contributors: ["@mujibishola"]
@@ -112,9 +119,6 @@ categories:
url: https://xendit.co/ url: https://xendit.co/
contributors: ["@LieAlbertTriAdrian"] contributors: ["@LieAlbertTriAdrian"]
- name: Cover Genius
url: https://covergenius.com/
Gaming: Gaming:
- name: Popoko VM Games Studio - name: Popoko VM Games Studio
url: https://popoko.live url: https://popoko.live
@@ -296,7 +300,6 @@ categories:
logo: hifadih.png logo: hifadih.png
contributors: ["@saintLaurent00"] contributors: ["@saintLaurent00"]
# Logo approved by @anmol-hpe on behalf of HPE
- name: HPE - name: HPE
url: https://www.hpe.com/in/en/home.html url: https://www.hpe.com/in/en/home.html
logo: hpe.png logo: hpe.png
@@ -396,6 +399,10 @@ categories:
url: https://www.techaudit.info url: https://www.techaudit.info
contributors: ["@ETselikov"] contributors: ["@ETselikov"]
- name: Tech Solution
url: https://www.tech-solution.com.ar/
contributors: ["@danteGiuliano", "@LeandroVallejos", "@McJaben", "@xJeree", "@zeo-return-null"]
- name: Tenable - name: Tenable
url: https://www.tenable.com url: https://www.tenable.com
contributors: ["@dflionis"] contributors: ["@dflionis"]
@@ -425,6 +432,10 @@ categories:
logo: userguiding.svg logo: userguiding.svg
contributors: ["@tzercin"] contributors: ["@tzercin"]
- name: Value Ad
url: https://bestpair.info/
contributors: ["@stevensuting"]
- name: Virtuoso QA - name: Virtuoso QA
url: https://www.virtuosoqa.com url: https://www.virtuosoqa.com
@@ -509,10 +520,6 @@ categories:
url: https://www.sunbird.org/ url: https://www.sunbird.org/
contributors: ["@eksteporg"] contributors: ["@eksteporg"]
- name: The GRAPH Network
url: https://thegraphnetwork.org/
contributors: ["@fccoelho"]
- name: Udemy - name: Udemy
url: https://www.udemy.com/ url: https://www.udemy.com/
contributors: ["@sungjuly"] contributors: ["@sungjuly"]
@@ -521,7 +528,24 @@ categories:
url: https://www.vipkid.com.cn/ url: https://www.vipkid.com.cn/
contributors: ["@illpanda"] contributors: ["@illpanda"]
- name: WikiMedia Foundation Social Organization:
- name: Living Goods
url: https://www.livinggoods.org
contributors: ["@chelule"]
- name: One Acre Fund
url: https://oneacrefund.org/
contributors: ["@stevensuting"]
- name: Quest Alliance
url: https://www.questalliance.net/
contributors: ["@stevensuting"]
- name: The GRAPH Network
url: https://thegraphnetwork.org/
contributors: ["@fccoelho"]
- name: Wikimedia Foundation
url: https://wikimediafoundation.org url: https://wikimediafoundation.org
contributors: ["@vg"] contributors: ["@vg"]
@@ -534,6 +558,10 @@ categories:
url: https://www.douroeci.com/ url: https://www.douroeci.com/
contributors: ["@nunohelibeires"] contributors: ["@nunohelibeires"]
- name: Rogow
url: https://rogow.com.br/
contributors: ["@nilmonto"]
- name: Safaricom - name: Safaricom
url: https://www.safaricom.co.ke/ url: https://www.safaricom.co.ke/
contributors: ["@mmutiso"] contributors: ["@mmutiso"]
@@ -546,11 +574,10 @@ categories:
url: https://wattbewerb.de/ url: https://wattbewerb.de/
contributors: ["@wattbewerb"] contributors: ["@wattbewerb"]
- name: Rogow
url: https://rogow.com.br/
contributors: ["@nilmonto"]
Healthcare: Healthcare:
- name: 2070Health
url: https://2070health.com/
- name: Amino - name: Amino
url: https://amino.com url: https://amino.com
contributors: ["@shkr"] contributors: ["@shkr"]
@@ -563,10 +590,6 @@ categories:
url: https://www.getcare.io/ url: https://www.getcare.io/
contributors: ["@alandao2021"] contributors: ["@alandao2021"]
- name: Living Goods
url: https://www.livinggoods.org
contributors: ["@chelule"]
- name: Maieutical Labs - name: Maieutical Labs
url: https://maieuticallabs.it url: https://maieuticallabs.it
contributors: ["@xrmx"] contributors: ["@xrmx"]
@@ -585,10 +608,10 @@ categories:
- name: WeSure - name: WeSure
url: https://www.wesure.cn/ url: https://www.wesure.cn/
- name: 2070Health
url: https://2070health.com/
HR / Staffing: HR / Staffing:
- name: bluquist
url: https://bluquist.com/
- name: Swile - name: Swile
url: https://www.swile.co/ url: https://www.swile.co/
contributors: ["@PaoloTerzi"] contributors: ["@PaoloTerzi"]
@@ -596,21 +619,18 @@ categories:
- name: Symmetrics - name: Symmetrics
url: https://www.symmetrics.fyi url: https://www.symmetrics.fyi
- name: bluquist
url: https://bluquist.com/
Government: Government:
- name: City of Ann Arbor, MI - name: City of Ann Arbor, MI
url: https://www.a2gov.org/ url: https://www.a2gov.org/
contributors: ["@sfirke"] contributors: ["@sfirke"]
- name: NRLM - Sarathi, India
url: https://pib.gov.in/PressReleasePage.aspx?PRID=1999586
- name: RIS3 Strategy of CZ, MIT CR - name: RIS3 Strategy of CZ, MIT CR
url: https://www.ris3.cz/ url: https://www.ris3.cz/
contributors: ["@RIS3CZ"] contributors: ["@RIS3CZ"]
- name: NRLM - Sarathi, India
url: https://pib.gov.in/PressReleasePage.aspx?PRID=1999586
Mobile Software: Mobile Software:
- name: VLMedia - name: VLMedia
url: https://www.vlmedia.com.tr url: https://www.vlmedia.com.tr

View File

@@ -24,6 +24,50 @@ assists people when migrating to a new version.
## Next ## Next
### Guest-token RLS rules reject unknown fields
The `rls` rules passed to `POST /api/v1/security/guest_token/` are now validated strictly: a rule may only contain `dataset` and `clause`. Previously unknown fields were silently dropped, so a mistyped or legacy scope key (most commonly `datasource` instead of `dataset`) produced a rule with no `dataset`, which is treated as a *global* rule applied to every dataset the embedded resource can reach. Such a request now returns HTTP 400 identifying the offending field instead of issuing a token with an unintended global rule. Integrators that were sending extra fields in RLS rules must remove them; valid dataset-scoped (`{"dataset": 41, "clause": "..."}`) and global (`{"clause": "..."}`) rules are unaffected.
### MCP service requires `MCP_JWT_AUDIENCE` when JWT auth is enabled
When the MCP service has JWT auth enabled (`MCP_AUTH_ENABLED = True`), an audience must be configured via `MCP_JWT_AUDIENCE` so issued tokens are bound to this service. The service now fails to start with a clear configuration error when the audience is unset, instead of starting with audience validation skipped. Deployments that enable MCP JWT auth must set `MCP_JWT_AUDIENCE` to the audience value their identity provider issues for the MCP service. API-key-only MCP deployments (JWT auth disabled) are unaffected.
### Swagger UI is opt-in (off by default)
`FAB_API_SWAGGER_UI` now defaults to `False` and is driven by the `SUPERSET_ENABLE_SWAGGER_UI` environment variable. The interactive Swagger UI / OpenAPI documentation endpoints (e.g. `/swagger/v1`) are therefore no longer exposed by default. To enable them, set `SUPERSET_ENABLE_SWAGGER_UI=true` (the bundled Docker development environment sets this) or override `FAB_API_SWAGGER_UI = True` in `superset_config.py`.
### Build details (git SHA / build number) are admin-only by default
The git SHA and build number surfaced in the "About" section, the bootstrap payload, and the public `/version` endpoint are now only included for admin users by default; the release version string is still shown to everyone. To expose the build details to all users (the previous behavior), set the `SUPERSET_EXPOSE_BUILD_DETAILS` environment variable (or `EXPOSE_BUILD_DETAILS_TO_USERS = True` in `superset_config.py`).
### Pivot table First/Last aggregations follow data order
The pivot table chart's `First` and `Last` aggregations now return the first and last value in data (query result) order, instead of effectively returning the minimum and maximum. Existing pivot tables that use these aggregations for totals/subtotals may show different values after upgrading. For deterministic results, ensure the underlying query has a stable sort order.
### `thumbnail_url` removed from dashboard list API response
The `thumbnail_url` field has been removed from `GET /api/v1/dashboard/` list responses. External consumers relying on this field must now construct the thumbnail URL client-side using `id` and `changed_on_utc`:
```
/api/v1/dashboard/{id}/thumbnail/{changed_on_utc}/
```
The thumbnail endpoint redirects to the current digest URL regardless of whether the supplied digest is exact. If the image is not yet cached, that digest URL may return `202` and trigger async generation. Using `changed_on_utc` as the digest is sufficient for cache-busting purposes.
### Tagging fix for `create_all`-bootstrapped schemas
Only affects deployments whose metadata schema was created with SQLAlchemy's `create_all` (rather than `superset db upgrade`) on a foreign-key-enforcing backend — PostgreSQL, or MySQL with `FOREIGN_KEY_CHECKS=1`. Such schemas carry three invalid foreign keys on `tagged_object.object_id` that break tagging (`TAGGING_SYSTEM = True`) with a `ForeignKeyViolation`. Schemas built via `superset db upgrade` are unaffected.
This release stops the ORM from emitting these constraints, but it cannot drop ones already present in your schema. If affected, drop them manually (names vary by backend, so look them up first):
```sql
-- PostgreSQL: names are typically tagged_object_object_id_fkey, _fkey1, _fkey2
ALTER TABLE tagged_object DROP CONSTRAINT <constraint_name>;
-- MySQL: find names via `SHOW CREATE TABLE tagged_object;`
ALTER TABLE tagged_object DROP FOREIGN KEY <constraint_name>;
```
### Webhook alerts/reports block private/internal hosts by default ### Webhook alerts/reports block private/internal hosts by default
Webhook alert/report dispatch (`WebhookNotification.send`) now validates the target URL's host against the same private/internal-IP block applied to dataset import URLs. If the resolved host is in a loopback, link-local, private (RFC-1918), shared-CGNAT, or multicast range, the webhook is rejected with `NotificationParamException`. Webhook alert/report dispatch (`WebhookNotification.send`) now validates the target URL's host against the same private/internal-IP block applied to dataset import URLs. If the resolved host is in a loopback, link-local, private (RFC-1918), shared-CGNAT, or multicast range, the webhook is rejected with `NotificationParamException`.
@@ -213,6 +257,9 @@ Added a new combined datasource list endpoint at `GET /api/v1/datasource/` to se
- The endpoint is available to users with at least one of `can_read` on `Dataset` or `SemanticView`. - The endpoint is available to users with at least one of `can_read` on `Dataset` or `SemanticView`.
- Semantic views are included only when the `SEMANTIC_LAYERS` feature flag is enabled. - Semantic views are included only when the `SEMANTIC_LAYERS` feature flag is enabled.
- The endpoint enforces strict `order_column` validation and returns `400` for invalid sort columns. - The endpoint enforces strict `order_column` validation and returns `400` for invalid sort columns.
## 6.1.0
### ClickHouse minimum driver version bump ### ClickHouse minimum driver version bump
The minimum required version of `clickhouse-connect` has been raised to `>=0.13.0`. If you are using the ClickHouse connector, please upgrade your `clickhouse-connect` package. The `_mutate_label` workaround that appended hash suffixes to column aliases has also been removed, as it is no longer needed with modern versions of the driver. The minimum required version of `clickhouse-connect` has been raised to `>=0.13.0`. If you are using the ClickHouse connector, please upgrade your `clickhouse-connect` package. The `_mutate_label` workaround that appended hash suffixes to column aliases has also been removed, as it is no longer needed with modern versions of the driver.

View File

@@ -72,20 +72,23 @@ services:
- -c - -c
- | - |
url="http://host.docker.internal:9000/static/assets/manifest.json" url="http://host.docker.internal:9000/static/assets/manifest.json"
max_attempts=150 # ~5 minutes at 2s intervals max_attempts=300 # ~10 minutes at 2s intervals; first build can be slow
echo "Waiting for webpack dev server at $url..." echo "Waiting for webpack dev server at $$url..."
attempt=0 attempt=0
until curl -sf --max-time 5 -o /dev/null "$url"; do until curl -sf --max-time 5 -H "Host: localhost" -o /dev/null "$$url"; do
attempt=$((attempt + 1)) attempt=$$((attempt + 1))
if [ "$attempt" -ge "$max_attempts" ]; then if [ "$$attempt" -ge "$$max_attempts" ]; then
echo "ERROR: webpack dev server did not serve $url after $max_attempts attempts (~5 minutes)." >&2 echo "ERROR: webpack dev server did not serve $$url after $$max_attempts attempts." >&2
echo "Is the dev server running? With BUILD_SUPERSET_FRONTEND_IN_DOCKER=false you must start it on the host (e.g. 'npm run dev' in superset-frontend)." >&2 echo "Is the dev server running? With BUILD_SUPERSET_FRONTEND_IN_DOCKER=false you must start it on the host (e.g. 'npm run dev' in superset-frontend)." >&2
exit 1 exit 1
fi fi
if [ $$((attempt % 15)) -eq 0 ]; then
echo "Still waiting for webpack dev server... ($$attempt/$$max_attempts)"
fi
sleep 2 sleep 2
done done
echo "Webpack dev server is ready; starting nginx." echo "Webpack dev server is ready; starting nginx."
exec nginx -g 'daemon off;' exec /docker-entrypoint.sh nginx -g 'daemon off;'
redis: redis:
image: redis:7 image: redis:7

View File

@@ -70,6 +70,8 @@ SUPERSET_LOG_LEVEL=info
SUPERSET_APP_ROOT="/" SUPERSET_APP_ROOT="/"
SUPERSET_ENV=development SUPERSET_ENV=development
# Swagger UI is opt-in (off by default); enable it for local development.
SUPERSET_ENABLE_SWAGGER_UI=true
SUPERSET_LOAD_EXAMPLES=yes SUPERSET_LOAD_EXAMPLES=yes
CYPRESS_CONFIG=false CYPRESS_CONFIG=false
SUPERSET_PORT=8088 SUPERSET_PORT=8088

View File

@@ -71,27 +71,29 @@ case "${1}" in
worker) worker)
echo "Starting Celery worker..." echo "Starting Celery worker..."
# setting up only 2 workers by default to contain memory usage in dev environments # setting up only 2 workers by default to contain memory usage in dev environments
celery --app=superset.tasks.celery_app:app worker -O fair -l INFO --concurrency=${CELERYD_CONCURRENCY:-2} celery --app=superset.tasks.celery_app:app worker -O fair -l INFO --concurrency=${CELERYD_CONCURRENCY:-2} ${WORKER_LOG_FILE:+--logfile=$WORKER_LOG_FILE}
;; ;;
beat) beat)
echo "Starting Celery beat..." echo "Starting Celery beat..."
rm -f /tmp/celerybeat.pid rm -f /tmp/celerybeat.pid
celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid -l INFO -s "${SUPERSET_HOME}"/celerybeat-schedule celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid -l INFO -s "${SUPERSET_HOME}"/celerybeat-schedule ${BEAT_LOG_FILE:+--logfile=$BEAT_LOG_FILE}
;; ;;
app) app)
echo "Starting web app (using development server)..." echo "Starting web app (using development server)..."
# Environment-based debugger control for security # Default to Flask debug mode in this dev compose entrypoint so the Talisman
# Only enable Werkzeug interactive debugger when explicitly requested # dev CSP (which permits 'unsafe-eval' required by React Refresh / HMR) is
# Modern Werkzeug (3.0+) includes PIN protection, but defense-in-depth approach # served. Operators can still set FLASK_DEBUG=false in docker/.env-local
# Override FLASK_DEBUG so the effective state matches SUPERSET_DEBUG_ENABLED even # to exercise the production-like CSP and error handling.
# when FLASK_DEBUG=true is inherited from docker/.env or .flaskenv : "${FLASK_DEBUG:=1}"
export FLASK_DEBUG
# Werkzeug's interactive debugger (/console) is a separate, security-sensitive
# feature and must be opted into explicitly via SUPERSET_DEBUG_ENABLED=true.
if [[ "${SUPERSET_DEBUG_ENABLED:-}" == "true" ]]; then if [[ "${SUPERSET_DEBUG_ENABLED:-}" == "true" ]]; then
export FLASK_DEBUG=1
DEBUGGER_FLAG="--debugger" DEBUGGER_FLAG="--debugger"
echo " ⚠️ Werkzeug debugger enabled (requires PIN for /console access)" echo " ⚠️ Werkzeug debugger enabled (requires PIN for /console access)"
else else
export FLASK_DEBUG=0
DEBUGGER_FLAG="--no-debugger" DEBUGGER_FLAG="--no-debugger"
echo " 🔒 Werkzeug debugger disabled (set SUPERSET_DEBUG_ENABLED=true to enable)" echo " 🔒 Werkzeug debugger disabled (set SUPERSET_DEBUG_ENABLED=true to enable)"
fi fi

View File

@@ -19,7 +19,7 @@
# #
HYPHEN_SYMBOL='-' HYPHEN_SYMBOL='-'
gunicorn \ exec gunicorn \
--bind "${SUPERSET_BIND_ADDRESS:-0.0.0.0}:${SUPERSET_PORT:-8088}" \ --bind "${SUPERSET_BIND_ADDRESS:-0.0.0.0}:${SUPERSET_PORT:-8088}" \
--access-logfile "${ACCESS_LOG_FILE:-$HYPHEN_SYMBOL}" \ --access-logfile "${ACCESS_LOG_FILE:-$HYPHEN_SYMBOL}" \
--error-logfile "${ERROR_LOG_FILE:-$HYPHEN_SYMBOL}" \ --error-logfile "${ERROR_LOG_FILE:-$HYPHEN_SYMBOL}" \

View File

@@ -1 +0,0 @@
v24.16.0

1
docs/.nvmrc Symbolic link
View File

@@ -0,0 +1 @@
../superset-frontend/.nvmrc

View File

@@ -81,6 +81,21 @@ SLACK_CACHE_TIMEOUT = int(timedelta(days=2).total_seconds())
SLACK_API_RATE_LIMIT_RETRY_COUNT = 5 SLACK_API_RATE_LIMIT_RETRY_COUNT = 5
``` ```
#### Slack Enterprise Grid (org-scoped tokens)
On a Slack Enterprise Grid org, an org-scoped token spans multiple workspaces, so
workspace-scoped methods such as `conversations.list` require a `team_id` to
indicate which workspace to target. Set `SLACK_TEAM_ID` to your workspace (team)
ID so Superset can list channels and deliver reports:
```python
# The workspace (team) ID to target, e.g. "T01234567"
SLACK_TEAM_ID = "T01234567"
```
This defaults to `None` and only needs to be set when using an org-scoped token;
it is accepted but ignored for standard workspace-level tokens.
### Webhook integration ### Webhook integration
Superset can send alert and report notifications to any HTTP endpoint — useful for chat platforms, incident management tools, or custom automation. Superset can send alert and report notifications to any HTTP endpoint — useful for chat platforms, incident management tools, or custom automation.
@@ -160,7 +175,7 @@ When enabled, Superset rejects webhook configurations that use `http://` URLs.
#### Retry Behavior #### Retry Behavior
Superset automatically retries webhook deliveries on `429 Too Many Requests` and `5xx` server errors using exponential backoff. Superset automatically retries webhook deliveries on `429 Too Many Requests` and `5xx` server errors using exponential backoff. Retries are bounded to roughly 120 seconds of cumulative wall-clock time (worst case ~210 seconds, because the bound is checked against the time elapsed before each attempt, so the final request can begin just under the limit and still run its full request timeout), after which the delivery is abandoned.
### Kubernetes-specific ### Kubernetes-specific

View File

@@ -455,6 +455,51 @@ def FLASK_APP_MUTATOR(app: Flask) -> None:
app.before_request_funcs.setdefault(None, []).append(make_session_permanent) app.before_request_funcs.setdefault(None, []).append(make_session_permanent)
``` ```
## Customizing the landing page (index view)
The page served at `/` is rendered by an index view. By default Superset registers
`SupersetIndexView`, which redirects to `/superset/welcome/` and also adds the
`/lang/<locale>` locale handler. You can replace it with your own view, for example
to send users straight to a specific dashboard or to a chart list.
Set `FAB_INDEX_VIEW` to the **importable dotted path** of your view class. Flask-AppBuilder
resolves this during app initialization and uses it in place of the default:
```python
# my_overrides.py — must be importable on the PYTHONPATH
from flask import redirect
from superset.initialization import SupersetIndexView
from superset.superset_typing import FlaskResponse
from flask_appbuilder import expose
class MyIndexView(SupersetIndexView):
@expose("/")
def index(self) -> FlaskResponse:
return redirect("/chart/list/")
```
```python
# superset_config.py
FAB_INDEX_VIEW = "my_overrides.MyIndexView"
```
A few things that commonly trip people up:
- **Subclass `SupersetIndexView`, not Flask-AppBuilder's bare `IndexView`.** Subclassing
keeps Superset's `/lang/<locale>` locale handling; replacing it with a bare `IndexView`
silently drops that behavior.
- **The class must be importable as a real module.** `FAB_INDEX_VIEW` is resolved by
importing the dotted path, which is independent of how `superset_config.py` itself is
loaded. Superset only copies **uppercase** names out of `superset_config.py` into its
runtime config, so a `FAB_INDEX_VIEW = "superset_config.MyIndexView"` reference only works
if `superset_config` is itself importable by that name on the `PYTHONPATH`. If you load
config via `SUPERSET_CONFIG_PATH` (an arbitrary file path), put the view in a separate
importable module instead and reference that module.
- **Don't set `appbuilder.indexview` from `FLASK_APP_MUTATOR`.** The mutator runs after
routes are already registered, so the assignment has no effect on the `/` route. Use
`FAB_INDEX_VIEW` instead.
## Feature Flags ## Feature Flags
To support a diverse set of users, Superset has some features that are not enabled by default. For To support a diverse set of users, Superset has some features that are not enabled by default. For

View File

@@ -223,8 +223,9 @@ compose based installation, edit the `x-superset-image:` line in your `docker-co
`docker-compose-non-dev.yml` files, replacing `apachesuperset.docker.scarf.sh/apache/superset` with `docker-compose-non-dev.yml` files, replacing `apachesuperset.docker.scarf.sh/apache/superset` with
`apache/superset` to pull the image directly from Docker Hub. `apache/superset` to pull the image directly from Docker Hub.
To disable the Scarf telemetry pixel, set the `SCARF_ANALYTICS` environment variable to `False` in To disable the Scarf telemetry pixel, set the `SCARF_ANALYTICS` environment variable to `false` in
your terminal and/or in your `docker/.env` file. your `docker/.env` file. This is read at runtime, so it disables the pixel on the pre-built image
without rebuilding the frontend.
::: :::
## 3. Log in to Superset ## 3. Log in to Superset

View File

@@ -136,7 +136,17 @@ init:
:::note :::note
Superset uses [Scarf Gateway](https://about.scarf.sh/scarf-gateway) to collect telemetry data. Knowing the installation counts for different Superset versions informs the project's decisions about patching and long-term support. Scarf purges personally identifiable information (PII) and provides only aggregated statistics. Superset uses [Scarf Gateway](https://about.scarf.sh/scarf-gateway) to collect telemetry data. Knowing the installation counts for different Superset versions informs the project's decisions about patching and long-term support. Scarf purges personally identifiable information (PII) and provides only aggregated statistics.
To opt-out of this data collection in your Helm-based installation, edit the `repository:` line in your `helm/superset/values.yaml` file, replacing `apachesuperset.docker.scarf.sh/apache/superset` with `apache/superset` to pull the image directly from Docker Hub. There are two independent telemetry channels:
- **Image pulls** (Scarf Gateway): to opt out, edit the `repository:` line in your `helm/superset/values.yaml` file, replacing `apachesuperset.docker.scarf.sh/apache/superset` with `apache/superset` to pull the image directly from Docker Hub.
- **The analytics pixel** rendered in the UI: to opt out, set the `SCARF_ANALYTICS` environment variable to `false` on the Superset containers via `extraEnv` in your `values.yaml`:
```yaml
extraEnv:
SCARF_ANALYTICS: "false"
```
This is read at runtime, so it takes effect on the pre-built images without rebuilding the frontend.
::: :::
### Dependencies ### Dependencies

View File

@@ -22,31 +22,24 @@ level dependencies.
**Debian and Ubuntu** **Debian and Ubuntu**
Ubuntu **24.04** uses python 3.12 per default, which currently is not supported by Superset. You need to add a second python installation of 3.11 and install the required additional dependencies. The following command will ensure that the required dependencies are installed (tested on Ubuntu 20.04, 22.04, and 24.04):
```bash
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11 python3.11-dev python3.11-venv build-essential libssl-dev libffi-dev libsasl2-dev libldap2-dev default-libmysqlclient-dev
```
In Ubuntu **20.04 and 22.04** the following command will ensure that the required dependencies are installed:
```bash ```bash
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev python3-pip libsasl2-dev libldap2-dev default-libmysqlclient-dev sudo apt-get install build-essential libssl-dev libffi-dev python3-dev python3-pip python3-venv libsasl2-dev libldap2-dev libpq-dev default-libmysqlclient-dev pkg-config
``` ```
In Ubuntu **before 20.04** the following command will ensure that the required dependencies are installed: Refer to the
[pyproject.toml](https://github.com/apache/superset/blob/master/pyproject.toml) file for the list of
```bash Python versions officially supported by Superset, and install a matching `python3` interpreter for
sudo apt-get install build-essential libssl-dev libffi-dev python-dev python-pip libsasl2-dev libldap2-dev default-libmysqlclient-dev your distribution. The `libpq-dev` package is only needed if you intend to connect to (or use) a
``` PostgreSQL database; you can omit it otherwise.
**Fedora and RHEL-derivative Linux distributions** **Fedora and RHEL-derivative Linux distributions**
Install the following packages using the `yum` package manager: Install the following packages using the `yum` package manager:
```bash ```bash
sudo yum install gcc gcc-c++ libffi-devel python-devel python-pip python-wheel openssl-devel cyrus-sasl-devel openldap-devel sudo yum install gcc gcc-c++ libffi-devel python3-devel python3-pip python3-wheel openssl-devel cyrus-sasl-devel openldap-devel
``` ```
In more recent versions of CentOS and Fedora, you may need to install a slightly different set of packages using `dnf`: In more recent versions of CentOS and Fedora, you may need to install a slightly different set of packages using `dnf`:

View File

@@ -161,6 +161,7 @@ Here's the documentation section how how to set up Talisman: https://superset.ap
- [ ] Regularly update to the latest major or minor versions of Superset. Those versions receive up-to-date security patches. - [ ] Regularly update to the latest major or minor versions of Superset. Those versions receive up-to-date security patches.
- [ ] Rotate the `SUPERSET_SECRET_KEY` periodically (e.g., quarterly) and after any potential security incident. - [ ] Rotate the `SUPERSET_SECRET_KEY` periodically (e.g., quarterly) and after any potential security incident.
- [ ] Rotate the other security-critical secrets (guest-token and async-query JWT secrets, SMTP and database credentials) on the cadence in Appendix C, and after any potential security incident.
- [ ] Conduct quarterly access reviews for all users. - [ ] Conduct quarterly access reviews for all users.
- [ ] Assuming logging and monitoring is in place, review security monitoring alerts weekly. - [ ] Assuming logging and monitoring is in place, review security monitoring alerts weekly.
@@ -173,6 +174,24 @@ Rotating the `SUPERSET_SECRET_KEY` is a critical security procedure. It is manda
The procedure for safely rotating the SECRET_KEY must be followed precisely to avoid locking yourself out of your instance. The official Apache Superset documentation maintains the correct, up-to-date procedure. Please follow the official guide here: The procedure for safely rotating the SECRET_KEY must be followed precisely to avoid locking yourself out of your instance. The official Apache Superset documentation maintains the correct, up-to-date procedure. Please follow the official guide here:
https://superset.apache.org/admin-docs/configuration/configuring-superset/#rotating-to-a-newer-secret_key https://superset.apache.org/admin-docs/configuration/configuring-superset/#rotating-to-a-newer-secret_key
### **Appendix C: Secrets Register and Rotation Schedule**
`SUPERSET_SECRET_KEY` is not the only security-critical secret in a Superset deployment. Maintain an inventory of all such secrets, store each in a secrets manager (not in `superset_config.py` or version control), assign an owner, and rotate them on a defined cadence as well as after any suspected compromise.
| Secret | Purpose | Risk if leaked | Suggested rotation |
|---|---|---|---|
| `SUPERSET_SECRET_KEY` | Signs session cookies; key material for encrypting stored DB credentials (Fernet/AES) | Forged sessions (auth bypass / privilege escalation); decryption of exfiltrated metadata-DB secrets | Quarterly + post-incident |
| `GUEST_TOKEN_JWT_SECRET` | Signs embedded-dashboard guest tokens | Forged guest tokens → unauthorized dashboard/data access | Quarterly + post-incident |
| `GLOBAL_ASYNC_QUERIES_JWT_SECRET` | Signs the async-query channel JWT | Forged async-query tokens | Quarterly + post-incident |
| SMTP password | Outbound email for alerts & reports | Email relay abuse / spoofing | Per organizational policy + post-incident |
| Database connection passwords | Access to analytical databases and the metadata DB | Direct database access | Per organizational policy + post-incident |
Notes:
- Rotating `GUEST_TOKEN_JWT_SECRET` or `GLOBAL_ASYNC_QUERIES_JWT_SECRET` invalidates outstanding tokens of that type; schedule rotations accordingly.
- After a suspected compromise, rotate **all** of the above, not only `SUPERSET_SECRET_KEY`.
- Keep the register under change control so new secrets introduced by future features are added to the rotation schedule.
:::resources :::resources
- [Blog: Running Apache Superset on the Open Internet](https://preset.io/blog/running-apache-superset-on-the-open-internet-a-report-from-the-fireline/) - [Blog: Running Apache Superset on the Open Internet](https://preset.io/blog/running-apache-superset-on-the-open-internet-a-report-from-the-fireline/)
- [Blog: How Security Vulnerabilities are Reported & Handled in Apache Superset](https://preset.io/blog/how-security-vulnerabilities-are-reported-and-handled-in-apache-superset/) - [Blog: How Security Vulnerabilities are Reported & Handled in Apache Superset](https://preset.io/blog/how-security-vulnerabilities-are-reported-and-handled-in-apache-superset/)

View File

@@ -34,15 +34,14 @@ Frontend contribution types allow extensions to extend Superset's user interface
Extensions can add new views or panels to the host application, such as custom SQL Lab panels, dashboards, or other UI components. Contribution areas are uniquely identified (e.g., `sqllab.panels` for SQL Lab panels), enabling seamless integration into specific parts of the application. Extensions can add new views or panels to the host application, such as custom SQL Lab panels, dashboards, or other UI components. Contribution areas are uniquely identified (e.g., `sqllab.panels` for SQL Lab panels), enabling seamless integration into specific parts of the application.
```tsx ```typescript
import React from 'react';
import { views } from '@apache-superset/core'; import { views } from '@apache-superset/core';
import MyPanel from './MyPanel'; import MyPanel from './MyPanel';
views.registerView( views.registerView(
{ id: 'my-extension.main', name: 'My Panel Name' }, { id: 'my-extension.main', name: 'My Panel Name' },
'sqllab.panels', 'sqllab.panels',
() => <MyPanel />, MyPanel,
); );
``` ```
@@ -112,6 +111,24 @@ editors.registerEditor(
See [Editors Extension Point](./extension-points/editors.md) for implementation details. See [Editors Extension Point](./extension-points/editors.md) for implementation details.
### Chat
Extensions can add a chat interface to Superset by registering a trigger component and a panel component. The host owns the layout, open/close state, and display mode — the extension only provides the UI. The panel can be displayed as a floating overlay or docked as a resizable sidebar beside the page content, and the user's preference is persisted across reloads.
```tsx
import { chat } from '@apache-superset/core';
import ChatTrigger from './ChatTrigger';
import ChatPanel from './ChatPanel';
chat.registerChat(
{ id: 'my-org.my-chat', name: 'My Chat' },
ChatTrigger,
ChatPanel,
);
```
See [Chat](./extension-points/chat.md) for implementation details.
## Backend ## Backend
Backend contribution types allow extensions to extend Superset's server-side capabilities. Backend contributions are registered at startup via classes and functions imported from the auto-discovered `entrypoint.py` file. Backend contribution types allow extensions to extend Superset's server-side capabilities. Backend contributions are registered at startup via classes and functions imported from the auto-discovered `entrypoint.py` file.

View File

@@ -0,0 +1,141 @@
---
title: Chat
sidebar_position: 3
---
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Chat Contributions
Extensions can add a chat interface to Superset by registering a trigger and a panel. The host owns the layout, open/close state, and display mode — the extension only needs to provide the UI components.
## Overview
A chat registration consists of two React components:
| Component | Role |
|-----------|------|
| **Trigger** | Always-visible entry point (e.g., a floating button). Rendered in the bottom-right corner in floating mode, or as a fixed overlay in panel mode. |
| **Panel** | The chat UI itself (message list, input, etc.). Mounted by the host in the active display mode. |
## Display Modes
The host supports two display modes, switchable by the user or the extension at runtime:
| Mode | Behavior |
|------|----------|
| `floating` | Panel floats above page content, anchored to the bottom-right corner. |
| `panel` | Panel is docked to the right side of the application as a resizable sidebar, sitting beside the page content. |
The user's last selected mode and open/closed state are persisted across page reloads.
## Registering a Chat
Call `chat.registerChat` from your extension's entry point with a descriptor, a trigger factory, and a panel factory:
```tsx
import { chat } from '@apache-superset/core';
import ChatTrigger from './ChatTrigger';
import ChatPanel from './ChatPanel';
chat.registerChat(
{ id: 'my-org.my-chat', name: 'My Chat' },
ChatTrigger,
ChatPanel,
);
```
Only one chat registration is active at a time. If a second extension calls `registerChat`, it replaces the first and a warning is logged.
## Opening and Closing the Chat
The trigger component is responsible for toggling the panel. Use `chat.isOpen()`, `chat.open()`, and `chat.close()` to control visibility:
```tsx
import { chat } from '@apache-superset/core';
export default function ChatTrigger() {
return (
<button onClick={() => (chat.isOpen() ? chat.close() : chat.open())}>
💬
</button>
);
}
```
You can also subscribe to open/close events from any component:
```tsx
useEffect(() => {
const { dispose } = chat.onDidOpen(() => console.log('chat opened'));
return dispose;
}, []);
```
## Changing the Display Mode
Call `chat.setDisplayMode` to switch between `'floating'` and `'panel'` modes. In your panel component, subscribe to `onDidChangeDisplayMode` to react to changes (including those triggered by the user):
```tsx
import { useState, useEffect } from 'react';
import { chat } from '@apache-superset/core';
export default function ChatPanel() {
const [mode, setMode] = useState(chat.getDisplayMode());
useEffect(() => {
const { dispose } = chat.onDidChangeDisplayMode(m => setMode(m));
return dispose;
}, []);
return (
<div style={{ height: mode === 'panel' ? '100%' : '80vh' }}>
<button onClick={() => chat.setDisplayMode(mode === 'panel' ? 'floating' : 'panel')}>
{mode === 'panel' ? 'Float' : 'Dock'}
</button>
{/* message list and input */}
</div>
);
}
```
## Chat API Reference
All methods are available on the `chat` namespace from `@apache-superset/core`:
| Method / Event | Description |
|----------------|-------------|
| `registerChat(descriptor, trigger, panel)` | Register a chat extension. Returns a `Disposable` to unregister. |
| `open()` | Open the chat panel. No-op if already open or no registration. |
| `close()` | Close the chat panel. |
| `isOpen()` | Returns `true` if the panel is currently open. |
| `getDisplayMode()` | Returns the current display mode (`'floating'` or `'panel'`). |
| `setDisplayMode(mode)` | Switch between `'floating'` and `'panel'` mode. |
| `onDidOpen(listener)` | Subscribe to panel open events. Returns a `Disposable`. |
| `onDidClose(listener)` | Subscribe to panel close events. Returns a `Disposable`. |
| `onDidChangeDisplayMode(listener)` | Subscribe to display mode changes. Returns a `Disposable`. |
| `onDidRegisterChat(listener)` | Subscribe to registration events. |
| `onDidUnregisterChat(listener)` | Subscribe to unregistration events. |
| `onDidResizePanel(listener)` | Subscribe to panel resize events (panel mode only). Not all hosts provide a resizer — do not rely on this firing. Returns a `Disposable`. |
## Next Steps
- **[Contribution Types](../contribution-types.md)** — Explore other contribution types
- **[Development](../development.md)** — Set up your development environment

View File

@@ -47,6 +47,8 @@ module.exports = {
collapsed: true, collapsed: true,
items: [ items: [
'extensions/extension-points/sqllab', 'extensions/extension-points/sqllab',
'extensions/extension-points/editors',
'extensions/extension-points/chat',
], ],
}, },
'extensions/development', 'extensions/development',

View File

@@ -321,8 +321,8 @@ This can be used, for example, to convert UTC time to local time.
Superset uses [Scarf](https://about.scarf.sh/) by default to collect basic telemetry data upon installing and/or running Superset. This data helps the maintainers of Superset better understand which versions of Superset are being used, in order to prioritize patch/minor releases and security fixes. Superset uses [Scarf](https://about.scarf.sh/) by default to collect basic telemetry data upon installing and/or running Superset. This data helps the maintainers of Superset better understand which versions of Superset are being used, in order to prioritize patch/minor releases and security fixes.
We use the [Scarf Gateway](https://docs.scarf.sh/gateway/) to sit in front of container registries, the [scarf-js](https://about.scarf.sh/package-sdks) package to track `npm` installations, and a Scarf pixel to gather anonymous analytics on Superset page views. We use the [Scarf Gateway](https://docs.scarf.sh/gateway/) to sit in front of container registries, the [scarf-js](https://about.scarf.sh/package-sdks) package to track `npm` installations, and a Scarf pixel to gather anonymous analytics on Superset page views.
Scarf purges PII and provides aggregated statistics. Superset users can easily opt out of analytics in various ways documented [here](https://docs.scarf.sh/gateway/#do-not-track) and [here](https://docs.scarf.sh/package-analytics/#as-a-user-of-a-package-using-scarf-js-how-can-i-opt-out-of-analytics). Scarf purges PII and provides aggregated statistics. Superset users can easily opt out of analytics in various ways documented [here](https://docs.scarf.sh/gateway/#do-not-track) and [here](https://docs.scarf.sh/package-analytics/#as-a-user-of-a-package-using-scarf-js-how-can-i-opt-out-of-analytics).
Superset maintainers can also opt out of telemetry data collection by setting the `SCARF_ANALYTICS` environment variable to `false` in the Superset container (or anywhere Superset/webpack are run). You can also opt out of the analytics pixel by setting the `SCARF_ANALYTICS` environment variable to `false`. This is read at runtime, so setting it on the Superset container (for example via `extraEnv` in the Helm chart, or `docker/.env` for Docker Compose) disables the pixel on the pre-built images without rebuilding the frontend. Note that this only disables the page-view pixel; the Scarf Gateway (container registry) and `scarf-js` (`npm`) channels are opted out separately, as described above.
Additional opt-out instructions for Docker users are available on the [Docker Installation](/admin-docs/installation/docker-compose) page. Additional opt-out instructions are available on the [Docker Compose](/admin-docs/installation/docker-compose) and [Kubernetes](/admin-docs/installation/kubernetes) installation pages.
## Does Superset have an archive panel or trash bin from which a user can recover deleted assets? ## Does Superset have an archive panel or trash bin from which a user can recover deleted assets?

View File

@@ -28,14 +28,19 @@
# Skip builds when no docs changes (exit 0 = skip, non-zero = build). # Skip builds when no docs changes (exit 0 = skip, non-zero = build).
# Checks for changes in docs/ and README.md (which gets pulled into docs). # Checks for changes in docs/ and README.md (which gets pulled into docs).
# #
# $CACHED_COMMIT_REF is the last *deployed* commit. On a PR's first build it # $CACHED_COMMIT_REF is the last *deployed* commit; it is set on incremental
# is empty, so the original `git diff` errored and Netlify fell back to # builds (notably the master production deploy) and empty on a context's
# building -- which is why every PR built a docs preview once even with no # first build (every deploy preview). The production path diffs against it
# docs changes. When it is empty we instead diff the whole branch against its # and skips correctly.
# merge-base with master, so non-docs PRs are skipped from the very first #
# build. Subsequent builds (and the master production build) keep the cheaper # Deploy previews need different handling: Netlify checks out a *merge*
# incremental $CACHED_COMMIT_REF diff. Any failure exits non-zero -> build. # commit, so $COMMIT_REF (the PR head SHA) is frequently not resolvable in
ignore = 'if [ -n "$CACHED_COMMIT_REF" ]; then git diff --quiet "$CACHED_COMMIT_REF" "$COMMIT_REF" -- . ../README.md; else git fetch origin master --depth=100 >/dev/null 2>&1; git diff --quiet "$(git merge-base origin/master "$COMMIT_REF" 2>/dev/null || echo origin/master)" "$COMMIT_REF" -- . ../README.md; fi' # the clone, and on a shallow clone `git merge-base` can fail too -- so the
# previous logic fell through to a build on every PR, even non-docs ones.
# Instead, always diff the checked-out HEAD against its merge-base with
# master, deepening the shallow clone until that merge-base resolves. If it
# genuinely can't be determined, exit non-zero to build (fail safe).
ignore = 'if [ -n "$CACHED_COMMIT_REF" ]; then git diff --quiet "$CACHED_COMMIT_REF" HEAD -- . ../README.md; else git fetch --no-tags origin master >/dev/null 2>&1 || true; i=0; while [ "$i" -lt 10 ] && ! git merge-base origin/master HEAD >/dev/null 2>&1; do git fetch --deepen=200 origin master >/dev/null 2>&1 || break; i=$((i+1)); done; BASE="$(git merge-base origin/master HEAD 2>/dev/null || true)"; if [ -z "$BASE" ]; then exit 1; fi; git diff --quiet "$BASE" HEAD -- . ../README.md; fi'
[build.environment] [build.environment]
# Node version matching docs/.nvmrc # Node version matching docs/.nvmrc

View File

@@ -70,10 +70,10 @@
"@storybook/preview-api": "^8.6.18", "@storybook/preview-api": "^8.6.18",
"@storybook/theming": "^8.6.15", "@storybook/theming": "^8.6.15",
"@superset-ui/core": "^0.20.4", "@superset-ui/core": "^0.20.4",
"@swc/core": "^1.15.40", "@swc/core": "^1.15.41",
"antd": "^6.4.3", "antd": "^6.4.5",
"baseline-browser-mapping": "^2.10.34", "baseline-browser-mapping": "^2.10.38",
"caniuse-lite": "^1.0.30001797", "caniuse-lite": "^1.0.30001799",
"docusaurus-plugin-openapi-docs": "^5.0.2", "docusaurus-plugin-openapi-docs": "^5.0.2",
"docusaurus-theme-openapi-docs": "^5.0.2", "docusaurus-theme-openapi-docs": "^5.0.2",
"js-yaml": "^4.2.0", "js-yaml": "^4.2.0",
@@ -101,15 +101,15 @@
"@types/js-yaml": "^4.0.9", "@types/js-yaml": "^4.0.9",
"@types/react": "^19.1.8", "@types/react": "^19.1.8",
"@typescript-eslint/eslint-plugin": "^8.59.3", "@typescript-eslint/eslint-plugin": "^8.59.3",
"@typescript-eslint/parser": "^8.60.1", "@typescript-eslint/parser": "^8.61.0",
"eslint": "^9.39.2", "eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.6", "eslint-plugin-prettier": "^5.5.6",
"eslint-plugin-react": "^7.37.5", "eslint-plugin-react": "^7.37.5",
"globals": "^17.6.0", "globals": "^17.6.0",
"prettier": "^3.8.3", "prettier": "^3.8.4",
"typescript": "~6.0.3", "typescript": "~6.0.3",
"typescript-eslint": "^8.60.1", "typescript-eslint": "^8.61.1",
"webpack": "^5.107.2" "webpack": "^5.107.2"
}, },
"browserslist": { "browserslist": {
@@ -134,7 +134,8 @@
"yaml": "1.10.3", "yaml": "1.10.3",
"uuid": "11.1.1", "uuid": "11.1.1",
"serialize-javascript": "7.0.5", "serialize-javascript": "7.0.5",
"d3-color": "3.1.0" "d3-color": "3.1.0",
"ws": "^8.21.0"
}, },
"packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610" "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610"
} }

View File

@@ -7235,10 +7235,10 @@
"pypi_packages": [ "pypi_packages": [
"oracledb" "oracledb"
], ],
"connection_string": "oracle://{username}:{password}@{hostname}:{port}", "connection_string": "oracle+oracledb://{username}:{password}@{hostname}:{port}",
"default_port": 1521, "default_port": 1521,
"notes": "Previously used cx_Oracle, now uses oracledb.", "notes": "Previously used cx_Oracle, now uses oracledb.",
"docs_url": "https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html", "docs_url": "https://python-oracledb.readthedocs.io/en/latest/user_guide/installation.html",
"category": "Other Databases" "category": "Other Databases"
}, },
"engine": "oracle", "engine": "oracle",

View File

@@ -1808,6 +1808,10 @@ If you enable DML in the meta database users will be able to run DML queries on
Second, you might want to change the value of `SUPERSET_META_DB_LIMIT`. The default value is 1000, and defines how many are read from each database before any aggregations and joins are executed. You can also set this value `None` if you only have small tables. Second, you might want to change the value of `SUPERSET_META_DB_LIMIT`. The default value is 1000, and defines how many are read from each database before any aggregations and joins are executed. You can also set this value `None` if you only have small tables.
:::warning
`SUPERSET_META_DB_LIMIT` is applied to **each** underlying table *before* the in-memory join runs, not to the final result. If any table involved in a join has more rows than the limit, the meta database will read only the first `SUPERSET_META_DB_LIMIT` rows of that table, which means matching rows can be silently dropped and the join can return **incomplete or even empty** results with no error. If you join tables larger than the limit, raise `SUPERSET_META_DB_LIMIT` to comfortably exceed your largest joined table, or set it to `None` when working only with small tables, to get correct results.
:::
Additionally, you might want to restrict the databases to with the meta database has access to. This can be done in the database configuration, under "Advanced" -> "Other" -> "ENGINE PARAMETERS" and adding: Additionally, you might want to restrict the databases to with the meta database has access to. This can be done in the database configuration, under "Advanced" -> "Other" -> "ENGINE PARAMETERS" and adding:
```json ```json

View File

@@ -212,7 +212,7 @@
resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz" resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz"
integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA== integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==
"@ant-design/icons@^6.2.3", "@ant-design/icons@^6.2.5": "@ant-design/icons@^6.2.5":
version "6.2.5" version "6.2.5"
resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-6.2.5.tgz#31c142aa6ce5eaf99598aaead222f4c459693512" resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-6.2.5.tgz#31c142aa6ce5eaf99598aaead222f4c459693512"
integrity sha512-0hKtoKqTjGFOndUyJLJmC9Cg6k4rEO7rLo6xmgbNJH+/ZX1C57RVals2v1j1knHl9n7Q+sBOveTvn931wLOCKw== integrity sha512-0hKtoKqTjGFOndUyJLJmC9Cg6k4rEO7rLo6xmgbNJH+/ZX1C57RVals2v1j1knHl9n7Q+sBOveTvn931wLOCKw==
@@ -3162,21 +3162,21 @@
resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz" resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz"
integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==
"@rc-component/async-validator@^5.1.0": "@rc-component/async-validator@^6.0.0":
version "5.1.0" version "6.0.0"
resolved "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz" resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-6.0.0.tgz#1c20b8864f69bac63b7876b1321697c2ea71c68d"
integrity sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA== integrity sha512-D3AGQwdyE58gmvx6waVSXJ80JGO+IY5L2O8HDnSOex7JNlzB3GuN/4hyHNTdhy2qtOhkpbIjmeAN3tL993wKbA==
dependencies: dependencies:
"@babel/runtime" "^7.24.4" "@babel/runtime" "^7.24.4"
"@rc-component/cascader@~1.15.0": "@rc-component/cascader@~1.16.1":
version "1.15.0" version "1.16.1"
resolved "https://registry.yarnpkg.com/@rc-component/cascader/-/cascader-1.15.0.tgz#554cba8e01e94a1288547cec96422b2cfc73ff40" resolved "https://registry.yarnpkg.com/@rc-component/cascader/-/cascader-1.16.1.tgz#94193ee55009219999a46e005a0f8589c8c021a2"
integrity sha512-ZzpMtwFCRo3fbXHuDnncARJMZQjdqA2w7aDuPofNQt+aDx39st1hgfIpEwTBLhe2Hqsvs/zOr8RTtgxTkCPySw== integrity sha512-wxLopwM+EBed0zNNGdnGE4coYoqcO+XD42fHgn+pDvO+XzhNFbdgSlSNXdKocIYqccvqgWvoxDPNb0OVRdi59A==
dependencies: dependencies:
"@rc-component/select" "~1.6.0" "@rc-component/select" "~1.7.1"
"@rc-component/tree" "~1.3.0" "@rc-component/tree" "~1.3.2"
"@rc-component/util" "^1.4.0" "@rc-component/util" "^1.11.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/checkbox@~2.0.0": "@rc-component/checkbox@~2.0.0":
@@ -3242,13 +3242,13 @@
"@rc-component/util" "^1.2.1" "@rc-component/util" "^1.2.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/form@~1.8.1": "@rc-component/form@~1.8.5":
version "1.8.1" version "1.8.5"
resolved "https://registry.yarnpkg.com/@rc-component/form/-/form-1.8.1.tgz#d811fb52df41bf72297938ebfe5cf4a4774588d4" resolved "https://registry.yarnpkg.com/@rc-component/form/-/form-1.8.5.tgz#20571cfd401dc38c74c38cdf4722ddc6c23a9806"
integrity sha512-8O7TB55Fi2mWIGvSnwZjk8jFqVNYyKDAswglwGShcbndxqzKz4cHwNtNaLjZlAeRge9wcB0LL8IWsC/Bl18raQ== integrity sha512-d24EYtvUOBhxEtSd/EqIu9DaMuqrWF2IRIvAFCTM6NQ/GJIYNr8DvEpUSUlv2uPxEJ0ZPwYQ+wwlGIAaiHvdrw==
dependencies: dependencies:
"@rc-component/async-validator" "^5.1.0" "@rc-component/async-validator" "^6.0.0"
"@rc-component/util" "^1.6.2" "@rc-component/util" "^1.11.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/image@~1.9.0": "@rc-component/image@~1.9.0":
@@ -3270,13 +3270,13 @@
"@rc-component/util" "^1.4.0" "@rc-component/util" "^1.4.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/input@~1.3.0": "@rc-component/input@~1.3.0", "@rc-component/input@~1.3.1":
version "1.3.0" version "1.3.1"
resolved "https://registry.yarnpkg.com/@rc-component/input/-/input-1.3.0.tgz#a8c113000bbc39089cf75337bec68120115b9e05" resolved "https://registry.yarnpkg.com/@rc-component/input/-/input-1.3.1.tgz#230b8b59cdde8521d50f0eede63ddacb61cc0cd3"
integrity sha512-IUUNOdAuWuEvDEFFgfmwQl818tiDbvXwLgon4HL1q2hJeYkqrRrYwYhJN0zfPHGTDxs3gvyVC/C02D4hWFoIcA== integrity sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==
dependencies: dependencies:
"@rc-component/resize-observer" "^1.1.1" "@rc-component/resize-observer" "^1.1.1"
"@rc-component/util" "^1.4.0" "@rc-component/util" "^1.11.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/mentions@~1.9.0": "@rc-component/mentions@~1.9.0":
@@ -3290,15 +3290,15 @@
"@rc-component/util" "^1.3.0" "@rc-component/util" "^1.3.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/menu@~1.3.0": "@rc-component/menu@~1.3.0", "@rc-component/menu@~1.3.1":
version "1.3.0" version "1.3.1"
resolved "https://registry.yarnpkg.com/@rc-component/menu/-/menu-1.3.0.tgz#fc70d81ca76ae6013b0d7955f20a2393adef04b3" resolved "https://registry.yarnpkg.com/@rc-component/menu/-/menu-1.3.1.tgz#16cae71a01080914e8bac08359fccdda7bfce540"
integrity sha512-u3NfiwpiEgT177qa5Yxm5QsI8i/93EBGpWj8HYZQDnh2pCZ2xtQCe/+w3pSR2NlwKOZDTCKzEhEyD09mGphssA== integrity sha512-pSZl9nBPgKgxN0aaW7NilIBEwWsc+43S+ulGdWAg9afak96dNOGWsGx0DLLBB1VQsAJvo6bQMTDzXoPlEHsBEw==
dependencies: dependencies:
"@rc-component/motion" "^1.1.4" "@rc-component/motion" "^1.1.4"
"@rc-component/overflow" "^1.0.0" "@rc-component/overflow" "^1.0.0"
"@rc-component/trigger" "^3.0.0" "@rc-component/trigger" "^3.0.0"
"@rc-component/util" "^1.3.0" "@rc-component/util" "^1.11.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/mini-decimal@^1.0.1": "@rc-component/mini-decimal@^1.0.1":
@@ -3308,12 +3308,12 @@
dependencies: dependencies:
"@babel/runtime" "^7.18.0" "@babel/runtime" "^7.18.0"
"@rc-component/motion@^1.0.0", "@rc-component/motion@^1.1.3", "@rc-component/motion@^1.1.4", "@rc-component/motion@^1.3.2": "@rc-component/motion@^1.0.0", "@rc-component/motion@^1.1.3", "@rc-component/motion@^1.1.4", "@rc-component/motion@^1.3.3":
version "1.3.2" version "1.3.3"
resolved "https://registry.yarnpkg.com/@rc-component/motion/-/motion-1.3.2.tgz#bd96e0fd16ee9d98c1d9be14198f003e367d8feb" resolved "https://registry.yarnpkg.com/@rc-component/motion/-/motion-1.3.3.tgz#6a7bbe0a9f070bd11642168f741d40e78bb28565"
integrity sha512-itfd+GztzJYAb04Z4RkEub1TbJAfZc2Iuy8p44U44xD1F5+fNYFKI3897ijlbIyfvXkTmMm+KGcjkQQGMHywEQ== integrity sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==
dependencies: dependencies:
"@rc-component/util" "^1.2.0" "@rc-component/util" "^1.11.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/mutate-observer@^2.0.1": "@rc-component/mutate-observer@^2.0.1":
@@ -3342,12 +3342,12 @@
"@rc-component/util" "^1.4.0" "@rc-component/util" "^1.4.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/pagination@~1.2.0": "@rc-component/pagination@~1.3.0":
version "1.2.0" version "1.3.0"
resolved "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.2.0.tgz" resolved "https://registry.yarnpkg.com/@rc-component/pagination/-/pagination-1.3.0.tgz#ee66301e37a03974826fb3028a91a1aeacdcd0ac"
integrity sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw== integrity sha512-12ahTY+HPITg1L2bjWKXUqBJe/oOnpA2QsChdCjthqLVf/e19StiCsv8OLKpWoHbc+8PFEkNjRqRqrLoRBHjFw==
dependencies: dependencies:
"@rc-component/util" "^1.3.0" "@rc-component/util" "^1.11.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/picker@~1.10.0": "@rc-component/picker@~1.10.0":
@@ -3377,10 +3377,10 @@
"@rc-component/util" "^1.2.1" "@rc-component/util" "^1.2.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/qrcode@~1.1.1": "@rc-component/qrcode@~2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz" resolved "https://registry.yarnpkg.com/@rc-component/qrcode/-/qrcode-2.0.0.tgz#ef4134c213002e7a43edbe609b24248914de4974"
integrity sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA== integrity sha512-aAv3QhPP1xyafuTZOxub6a54pCeBnN3IwQkpETrBtthq4BL5IgxnCbuoBWPDpdLw1y1j6BgBUCAKV92+yX06Dw==
dependencies: dependencies:
"@babel/runtime" "^7.24.7" "@babel/runtime" "^7.24.7"
@@ -3409,15 +3409,15 @@
"@rc-component/util" "^1.3.0" "@rc-component/util" "^1.3.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/select@~1.6.0", "@rc-component/select@~1.6.15": "@rc-component/select@~1.7.0", "@rc-component/select@~1.7.1":
version "1.6.15" version "1.7.1"
resolved "https://registry.yarnpkg.com/@rc-component/select/-/select-1.6.15.tgz#de2a3c8b020834cabd600b52de573a328c061eef" resolved "https://registry.yarnpkg.com/@rc-component/select/-/select-1.7.1.tgz#cdda0ac185f00ebed1c85e7809ae1f7855a9f7ab"
integrity sha512-SyVCWnqxCQZZcQvQJ/CxSjx2bGma6ds/HtnpkIfZVnt6RoEgbqUmHgD6vrzNarNXwbLXerwVzWwq8F3d1sst7g== integrity sha512-GZ1cMJk2xQh0VHyOQjjG8drYL4iu24NcbkXioUcReQOCUr+ub/3fmRonZe6cRPEZhWMbJdeHsqnEltogDaZ5Tg==
dependencies: dependencies:
"@rc-component/overflow" "^1.0.0" "@rc-component/overflow" "^1.0.0"
"@rc-component/trigger" "^3.0.0" "@rc-component/trigger" "^3.0.0"
"@rc-component/util" "^1.3.0" "@rc-component/util" "^1.11.1"
"@rc-component/virtual-list" "^1.0.1" "@rc-component/virtual-list" "^1.2.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/slider@~1.0.1": "@rc-component/slider@~1.0.1":
@@ -3444,27 +3444,27 @@
"@rc-component/util" "^1.3.0" "@rc-component/util" "^1.3.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/table@~1.10.0": "@rc-component/table@~1.10.2":
version "1.10.0" version "1.10.2"
resolved "https://registry.yarnpkg.com/@rc-component/table/-/table-1.10.0.tgz#7a98d68176f23f50a762df464f4c9142e7db3942" resolved "https://registry.yarnpkg.com/@rc-component/table/-/table-1.10.2.tgz#7b052fd5eb2ccf6996a93eebeb7af7036a262c8b"
integrity sha512-SjtpcCf+rL7dDc62GKT3rXTdERjVuJvRiqjpU7g0Jc/ewCifXynHc7Nm3Em1XsD+WhGrgQtxNDScI/0+Lpfr0w== integrity sha512-b3PjqB9Gp25p5t/zq+9QrbXbodkptT8/zvLmwgd2FNPUUtaYyDnQqfxeD5a7ao8E8lpinLHsi2u2vdfPhyNvAw==
dependencies: dependencies:
"@rc-component/context" "^2.0.1" "@rc-component/context" "^2.0.1"
"@rc-component/resize-observer" "^1.0.0" "@rc-component/resize-observer" "^1.0.0"
"@rc-component/util" "^1.1.0" "@rc-component/util" "^1.11.1"
"@rc-component/virtual-list" "^1.0.1" "@rc-component/virtual-list" "^1.0.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/tabs@~1.9.0": "@rc-component/tabs@~1.9.1":
version "1.9.0" version "1.9.1"
resolved "https://registry.yarnpkg.com/@rc-component/tabs/-/tabs-1.9.0.tgz#8f3e3755450e5a90d240d1ed3dc140d520b1fbef" resolved "https://registry.yarnpkg.com/@rc-component/tabs/-/tabs-1.9.1.tgz#52b9cb0392c718fba43e7d558f46f6c910d19acb"
integrity sha512-tn1slmbbaTyt8mgwyWJcT8jo/qNiYUs6u1H7OgGQt9faYO06BJIkU5cTmMqORzIrNmSEeeUY6pD5i+JlqSHYhg== integrity sha512-6mY08Fce6aNOHuGsxbzT+f2ekgL9mg1cGGHkittMlVGymjGg+kGupu5v90sRxcUd/paRU9jclLLXtF/PkK1FUA==
dependencies: dependencies:
"@rc-component/dropdown" "~1.0.0" "@rc-component/dropdown" "~1.0.0"
"@rc-component/menu" "~1.3.0" "@rc-component/menu" "~1.3.0"
"@rc-component/motion" "^1.1.3" "@rc-component/motion" "^1.1.3"
"@rc-component/resize-observer" "^1.0.0" "@rc-component/resize-observer" "^1.0.0"
"@rc-component/util" "^1.3.0" "@rc-component/util" "^1.11.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/tooltip@~1.4.0": "@rc-component/tooltip@~1.4.0":
@@ -3486,30 +3486,30 @@
"@rc-component/util" "^1.7.0" "@rc-component/util" "^1.7.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/tree-select@~1.9.0": "@rc-component/tree-select@~1.10.0":
version "1.9.0" version "1.10.0"
resolved "https://registry.yarnpkg.com/@rc-component/tree-select/-/tree-select-1.9.0.tgz#13ea516478b6cb558e04181abb0a01ae6fbdd31f" resolved "https://registry.yarnpkg.com/@rc-component/tree-select/-/tree-select-1.10.0.tgz#72e337fd58591f677404189cb3e9d3f718cd3332"
integrity sha512-GXcFe15a+trUl1/J3OHWQhsVWFpwFpGFK2cqYWZ1sK22Zs3KZTvMwDpzr75PIo1s6QVioVxpE/pRwRopkeDQ6w== integrity sha512-E1U4pn2LAbXEhLJdzIzid7WYbIuFbkTIctuFoeC6weppf8UbPR3+YYB6/ay0c0ksand4gXMRQpa1Z60Auo7VJA==
dependencies: dependencies:
"@rc-component/select" "~1.6.0" "@rc-component/select" "~1.7.0"
"@rc-component/tree" "~1.3.0" "@rc-component/tree" "~1.3.0"
"@rc-component/util" "^1.4.0" "@rc-component/util" "^1.4.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/tree@~1.3.0", "@rc-component/tree@~1.3.1": "@rc-component/tree@~1.3.0", "@rc-component/tree@~1.3.2":
version "1.3.1" version "1.3.2"
resolved "https://registry.yarnpkg.com/@rc-component/tree/-/tree-1.3.1.tgz#6983ca6bd9d5f6d04dd7258d00cb0fe71cdfe661" resolved "https://registry.yarnpkg.com/@rc-component/tree/-/tree-1.3.2.tgz#4b0c13564314eff61ca948c18ef923b87c9d7e44"
integrity sha512-zlL0PW0bTFlveTtLcA01VD/yMWKK73EywItFMgIZUY5sb6tMOAw7zV6qGzqldufqrV93ZWQB4H3NBNoTMCueJA== integrity sha512-bJFj46wEkpBPnWyTm18XmgAgNQ/4YvprxMOPPY2a6rmhGJYxLuNKEFiL5Qej4Qctu9wHJm8WW+v2SYskafE0kA==
dependencies: dependencies:
"@rc-component/motion" "^1.0.0" "@rc-component/motion" "^1.0.0"
"@rc-component/util" "^1.8.1" "@rc-component/util" "^1.11.1"
"@rc-component/virtual-list" "^1.0.1" "@rc-component/virtual-list" "^1.2.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/trigger@^3.0.0", "@rc-component/trigger@^3.6.15", "@rc-component/trigger@^3.7.1", "@rc-component/trigger@^3.9.0": "@rc-component/trigger@^3.0.0", "@rc-component/trigger@^3.6.15", "@rc-component/trigger@^3.7.1", "@rc-component/trigger@^3.9.1":
version "3.9.0" version "3.9.1"
resolved "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.0.tgz" resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-3.9.1.tgz#3f730315c558bc392921a563ac9109a1d094ef23"
integrity sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg== integrity sha512-LNsYvz60mrLJ/kRvKcHE7boUvcQfVMCfRqZ71x3Fo9AOiZ1KKIEqkzMA8DNvz2V3Bcvir/vwQNn7JF1NPODQ7Q==
dependencies: dependencies:
"@rc-component/motion" "^1.1.4" "@rc-component/motion" "^1.1.4"
"@rc-component/portal" "^2.2.0" "@rc-component/portal" "^2.2.0"
@@ -3517,18 +3517,18 @@
"@rc-component/util" "^1.2.1" "@rc-component/util" "^1.2.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/upload@~1.1.0": "@rc-component/upload@~1.1.1":
version "1.1.0" version "1.1.1"
resolved "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.0.tgz" resolved "https://registry.yarnpkg.com/@rc-component/upload/-/upload-1.1.1.tgz#90d16edcdaeb104ffa9111fd0b428061de7c21ac"
integrity sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw== integrity sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==
dependencies: dependencies:
"@rc-component/util" "^1.3.0" "@rc-component/util" "^1.11.1"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/util@^1.1.0", "@rc-component/util@^1.10.1", "@rc-component/util@^1.11.0", "@rc-component/util@^1.2.0", "@rc-component/util@^1.2.1", "@rc-component/util@^1.3.0", "@rc-component/util@^1.4.0", "@rc-component/util@^1.6.2", "@rc-component/util@^1.7.0", "@rc-component/util@^1.8.1", "@rc-component/util@^1.9.0": "@rc-component/util@^1.10.1", "@rc-component/util@^1.11.0", "@rc-component/util@^1.11.1", "@rc-component/util@^1.2.0", "@rc-component/util@^1.2.1", "@rc-component/util@^1.3.0", "@rc-component/util@^1.4.0", "@rc-component/util@^1.7.0", "@rc-component/util@^1.9.0":
version "1.11.0" version "1.11.1"
resolved "https://registry.yarnpkg.com/@rc-component/util/-/util-1.11.0.tgz#965c8b44a3f57fc96dc14e5072afbe32e422fd4d" resolved "https://registry.yarnpkg.com/@rc-component/util/-/util-1.11.1.tgz#07d698908339c55648e4f974afa739345e65b483"
integrity sha512-jHG3/BYgUWiP5c7RZHiaUNToyw1L3nlPSKG2RPu+YoiD9b3ajiJwBWhsjO+ZELmCsKFAjNR5DelbKdlF0e2BDA== integrity sha512-awVlI3ub2vqfqkYxOBc/uQ0efm3jw0wcrhtO/YWLyZfxiKXczKwNbVuhlnyxytDt7H9pbbVQiqr+O6MLATtRYg==
dependencies: dependencies:
is-mobile "^5.0.0" is-mobile "^5.0.0"
react-is "^18.2.0" react-is "^18.2.0"
@@ -3543,6 +3543,16 @@
"@rc-component/util" "^1.4.0" "@rc-component/util" "^1.4.0"
clsx "^2.1.1" clsx "^2.1.1"
"@rc-component/virtual-list@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@rc-component/virtual-list/-/virtual-list-1.2.0.tgz#3c9ee8cd7d10da334a2a06ad86ca234e2792a381"
integrity sha512-iavRm1Jo4GDbASQwdGa7jFyk93RvSOo9xHyBT4QL1pgFJj/Fdf1G+3RErH7/7BmAMvx2AkF62mjGYxDbXsK9TQ==
dependencies:
"@babel/runtime" "^7.20.0"
"@rc-component/resize-observer" "^1.0.1"
"@rc-component/util" "^1.4.0"
clsx "^2.1.1"
"@redocly/ajv@^8.18.0": "@redocly/ajv@^8.18.0":
version "8.18.3" version "8.18.3"
resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.18.3.tgz#a925753d9a33375219f1b2ba91aef320f9929577" resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.18.3.tgz#a925753d9a33375219f1b2ba91aef320f9929577"
@@ -4143,86 +4153,86 @@
dependencies: dependencies:
apg-lite "^1.0.4" apg-lite "^1.0.4"
"@swc/core-darwin-arm64@1.15.40": "@swc/core-darwin-arm64@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.40.tgz#b05d715b04c4fd47baf59288233da85a683cc0bc" resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.41.tgz#4fcbc9cbb9dfc9027d66e2b23b8d1d0315d164bd"
integrity sha512-PaYyclfmQ++77D8ityYvmmVzHv9aG8ROwt2GfG6/ccloy4Hgf80qtOnzb9VYvPsUT7Ty1uhuDRhv3XYpf62qhQ== integrity sha512-kREh6J5paQFvP3i7f/4FbqRNOJREutVFVOkder4GVyCBQ39YmER55cW/y1NNjwrchzFqgYswFn0mMDCqbqKzrw==
"@swc/core-darwin-x64@1.15.40": "@swc/core-darwin-x64@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.40.tgz#3180daef5c1e47b435f8edd084509e0a5c0d883b" resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.41.tgz#726c60a893e2f1a07bee28f79b519b8e6489415b"
integrity sha512-HbbPzvfLBUXjIB1Ezks+//lNUjmLjfyd63XSwprJgrZaXYdm70kohXPJUWdqKZozolFxbPaO+xtBaiUp6BoueA== integrity sha512-N8B56ESFazZAWZyIkecADSPCwlLEinW7QLMEeotCpv4J7VXwfH+OLkmRL8o96UZ+1355fwHxDTS6/wK7yucvkA==
"@swc/core-linux-arm-gnueabihf@1.15.40": "@swc/core-linux-arm-gnueabihf@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.40.tgz#18fcd3c70e48fdfae07c9f18751b1409ce1e5e84" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.41.tgz#08930e8015ca2fadc729546d5bd4b758a3999dda"
integrity sha512-SlRZsCjOCPR2LvFs0Ri/Xrx/5o5TCt8vl4gW6mX1hEZOG0a625RxzRHpHdAQNGykmAN/7IeaFAJG+QnNmxlHcA== integrity sha512-6XrId2fyle0mS5xxON8rU84mPd2Cq1kDJRj+4BnQKTd7u+2kSA6Ww+JkOP0iTNqOqt9OXhPOEAjBHAuonWcdCg==
"@swc/core-linux-arm64-gnu@1.15.40": "@swc/core-linux-arm64-gnu@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.40.tgz#26304933922f2a8e3194770e404403fc25a19c89" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.41.tgz#6c27490a4013647a09ff64cea1d6b1169394602f"
integrity sha512-Q8byxJt2fh8CR3EUX6snBpy47AoBVm+In/+Z3rjDHMjC38ZvR9/gtUUNCT0tfrn4EdVsO8/QPi59nxrxvqxvBQ== integrity sha512-ynLIarxlkVnqHn1D0fKOVht6mNU5ks6lrH+MY3kkS+XFaGGgDxFZVjWKJlkYTKm3RCvBTfA8Ng5fLufXheMRKQ==
"@swc/core-linux-arm64-musl@1.15.40": "@swc/core-linux-arm64-musl@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.40.tgz#3402dfba04ba7b8ea81f243e2f8fa2c336b54d03" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.41.tgz#4cce52fbbbe78b1f99c2a4e3f9ad2629f6eae494"
integrity sha512-4z0MgHU+7M0pZDqBN1El7mFXDI1SBwinfcUkAyA4v8QrhOIUOZltySt2aStQLZGrdXVXM4Y4ylfiTC04ED+MoQ== integrity sha512-dXu/5vd4gh8symyhRF+4G7gOPkjmb4pONhh7sl+6GSiW0LOKZlfu5kXmyFbTz9smOT7jgr002qY9b1nujjXt2A==
"@swc/core-linux-ppc64-gnu@1.15.40": "@swc/core-linux-ppc64-gnu@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.40.tgz#b3df9065cad352328c1eeef08a28fc9fe98785aa" resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.41.tgz#3d1fadd8d320e7250a6b2a2d9c0b0d4dac162f97"
integrity sha512-fLI4iUgeSZu0eRWUXwe6YzPFx9gHbFiPkl8Rp3mJfP8OpNR3nTQCGPvHdDh9xniW7mVvgMY4ni7A4VzqI1KrpA== integrity sha512-XGO6zVPXoPE0gf/XnI4jBbafNT13AYgoh6ns0JCSdOetI/kqVf0vhpz7NuNgAzZrMVCsmieqjPoTwViDgh4mOQ==
"@swc/core-linux-s390x-gnu@1.15.40": "@swc/core-linux-s390x-gnu@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.40.tgz#58e5b601f641dde81b30626ef66a668701ec918f" resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.41.tgz#6e4c54168d4a8d7852ef797437bd25e6fb5d7a50"
integrity sha512-YqeKMAb7d4nQSGMJQ454IlaCENpzcDqhvBE9+CPfdnYpnUXxd+BSrB6Xk0YjW8UyoEhUj4p6quATCxbsp6J3jg== integrity sha512-0WUglRwyZtW+iMi7J3iFdrCxreZZIKf4egTwEQfIYRsqFax69A0OrFj+NIoFSE03xBT/IFRrg+S8K6f9Ky+4hA==
"@swc/core-linux-x64-gnu@1.15.40": "@swc/core-linux-x64-gnu@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.40.tgz#cf057dce0c148c53f2d30152baaf60ea29e5d59c" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.41.tgz#5f947698786e15e2f696e0c6b3afd25138bae86b"
integrity sha512-7HOuS1iGcme/j/TuL1TfmmLGiMQrjv/GmjyZeydl00FKPtpGXEldwqfI56xgd1YzrzoB2svWjxbGGyQ0TEASxg== integrity sha512-VxkuQK59c0tHm6uJZCUrS3cyA2JhGGfdU6e41SZz0x/JS+4Sm7C1mIc97In14vkZJopEt7yXA2TouCqZDSygEA==
"@swc/core-linux-x64-musl@1.15.40": "@swc/core-linux-x64-musl@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.40.tgz#21fb1a4d0193e9bbcd1469ecd36166d2e96e4006" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.41.tgz#f4a0910cb273e39bcc09d572a08f62a355a93628"
integrity sha512-h4kZYHc7dpc9P9u4brRJaS8Pl7tPVHAeiLSzw7T5RfIJgAoSdaCMKzI/2Uay9gFhaw8uyCDl0L5q37r0EpAfIA== integrity sha512-/0qXIu1ZxggLuovLb22vFfKHq2AA4n6Whw5UwmVCHk4pkw7KWnPIQpMCEqUMPsNkFJig7PPp/TSYFu8ZEb2rtQ==
"@swc/core-win32-arm64-msvc@1.15.40": "@swc/core-win32-arm64-msvc@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.40.tgz#1dba23b2b0db86b3d6d65da2abd627cc607a1fbc" resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.41.tgz#a55334b1b7c23a962d4219f332b6422f3c3374e4"
integrity sha512-+mQgKZXSj6mV38Zh05QaxSjUDmGP/R2JWlXZTDLSPkDzHU6p3GxN9eeSf5dfyDVU86946fmCvSzyl/ucImx8+A== integrity sha512-Y481sMNZM6rECh9VO4+y26N1lWEDAyxnBZskUf37fl90uHE946VHfmiVQWT0uMFOhyJJFovGTRuF4W82dwewUg==
"@swc/core-win32-ia32-msvc@1.15.40": "@swc/core-win32-ia32-msvc@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.40.tgz#b2da1e33165d469467b1046a2189db468da488eb" resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.41.tgz#e1135f8d6857f6c48e4bfb6105568b37b3f88dc5"
integrity sha512-yvwdPLGd25mcj/mNatjNQ0lZujtQD6psH3v9PNmMb+fSzjbNG8KIDxjFWrcV+fsFVLOkyOmdJsFmX7NAFjVyPw== integrity sha512-BAchBD5qeUzy3hiPSLJtaaoSm4blCLyYffOF1bGE4ETcV+OisqjUAwDQMJj++4bTpvMCDzwC+Bj3PmQyBCtscw==
"@swc/core-win32-x64-msvc@1.15.40": "@swc/core-win32-x64-msvc@1.15.41":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.40.tgz#3563f7e8ce8708f5fda43eb8e0956ef11e0da320" resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.41.tgz#52d241e2bf4c6154675c0ad447b29cbdb0ccb547"
integrity sha512-OXtKsLU1bVtInzzDEAY2sYiF/rl4tvAnLLLpuMp3HzAOQZ5A+i69AKDhA1YLQTaMAqO3vzyYNVAYVRMPtSYD4w== integrity sha512-WOkA+fJ/ViVBQDsSV9JC52NACTe5PhlurA6viASDZGb7HR3KS01ZG7RZ+Bg6SVQFIoq3gSbTsskQVe6EbHFAYw==
"@swc/core@^1.15.40", "@swc/core@^1.7.39": "@swc/core@^1.15.41", "@swc/core@^1.7.39":
version "1.15.40" version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.40.tgz#941c949aa88c0d8d291f102f519f3c2c77701b90" resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.41.tgz#a212c5040abd1ffd2ad6caf140f0d586ffcfaa6e"
integrity sha512-2kwzJikRvgtNAG7MwVZY2vEzZjTxKIq5jXOihuSV/8U+Hej8Va22t65aKnJZs3P+NwojZvR8Mf8kyM7O+V8sQg== integrity sha512-03nQq/082QRJJiOvp3FGbgxTGyyxMxohPTjhk/W9bD2J0tk4ukITI7goOhOO2WbaHn/lsPmo/zf8+DIXhwpgYQ==
dependencies: dependencies:
"@swc/counter" "^0.1.3" "@swc/counter" "^0.1.3"
"@swc/types" "^0.1.26" "@swc/types" "^0.1.26"
optionalDependencies: optionalDependencies:
"@swc/core-darwin-arm64" "1.15.40" "@swc/core-darwin-arm64" "1.15.41"
"@swc/core-darwin-x64" "1.15.40" "@swc/core-darwin-x64" "1.15.41"
"@swc/core-linux-arm-gnueabihf" "1.15.40" "@swc/core-linux-arm-gnueabihf" "1.15.41"
"@swc/core-linux-arm64-gnu" "1.15.40" "@swc/core-linux-arm64-gnu" "1.15.41"
"@swc/core-linux-arm64-musl" "1.15.40" "@swc/core-linux-arm64-musl" "1.15.41"
"@swc/core-linux-ppc64-gnu" "1.15.40" "@swc/core-linux-ppc64-gnu" "1.15.41"
"@swc/core-linux-s390x-gnu" "1.15.40" "@swc/core-linux-s390x-gnu" "1.15.41"
"@swc/core-linux-x64-gnu" "1.15.40" "@swc/core-linux-x64-gnu" "1.15.41"
"@swc/core-linux-x64-musl" "1.15.40" "@swc/core-linux-x64-musl" "1.15.41"
"@swc/core-win32-arm64-msvc" "1.15.40" "@swc/core-win32-arm64-msvc" "1.15.41"
"@swc/core-win32-ia32-msvc" "1.15.40" "@swc/core-win32-ia32-msvc" "1.15.41"
"@swc/core-win32-x64-msvc" "1.15.40" "@swc/core-win32-x64-msvc" "1.15.41"
"@swc/counter@^0.1.3": "@swc/counter@^0.1.3":
version "0.1.3" version "0.1.3"
@@ -4922,110 +4932,110 @@
dependencies: dependencies:
"@types/yargs-parser" "*" "@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@8.60.1", "@typescript-eslint/eslint-plugin@^8.59.3": "@typescript-eslint/eslint-plugin@8.61.1", "@typescript-eslint/eslint-plugin@^8.59.3":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz#c1060bb8fa4be80624d3f3dec8dd9caca373af76" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz#6e4b7fee21f1983308e9e9b634ecbaf702c86006"
integrity sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg== integrity sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==
dependencies: dependencies:
"@eslint-community/regexpp" "^4.12.2" "@eslint-community/regexpp" "^4.12.2"
"@typescript-eslint/scope-manager" "8.60.1" "@typescript-eslint/scope-manager" "8.61.1"
"@typescript-eslint/type-utils" "8.60.1" "@typescript-eslint/type-utils" "8.61.1"
"@typescript-eslint/utils" "8.60.1" "@typescript-eslint/utils" "8.61.1"
"@typescript-eslint/visitor-keys" "8.60.1" "@typescript-eslint/visitor-keys" "8.61.1"
ignore "^7.0.5" ignore "^7.0.5"
natural-compare "^1.4.0" natural-compare "^1.4.0"
ts-api-utils "^2.5.0" ts-api-utils "^2.5.0"
"@typescript-eslint/parser@8.60.1", "@typescript-eslint/parser@^8.60.1": "@typescript-eslint/parser@8.61.1", "@typescript-eslint/parser@^8.61.0":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.60.1.tgz#a9d7f30850384d34b41f4687dd8944823c09e289" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.61.1.tgz#881fba60b50636249cdeea2e547bf75715254c72"
integrity sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA== integrity sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==
dependencies: dependencies:
"@typescript-eslint/scope-manager" "8.60.1" "@typescript-eslint/scope-manager" "8.61.1"
"@typescript-eslint/types" "8.60.1" "@typescript-eslint/types" "8.61.1"
"@typescript-eslint/typescript-estree" "8.60.1" "@typescript-eslint/typescript-estree" "8.61.1"
"@typescript-eslint/visitor-keys" "8.60.1" "@typescript-eslint/visitor-keys" "8.61.1"
debug "^4.4.3" debug "^4.4.3"
"@typescript-eslint/project-service@8.60.1": "@typescript-eslint/project-service@8.61.1":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.60.1.tgz#eb29712f58d72c222fc727162e92f2ab4670971b" resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.61.1.tgz#fcd9739964a40867eed55f1ac318d3909f24b4af"
integrity sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw== integrity sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==
dependencies: dependencies:
"@typescript-eslint/tsconfig-utils" "^8.60.1" "@typescript-eslint/tsconfig-utils" "^8.61.1"
"@typescript-eslint/types" "^8.60.1" "@typescript-eslint/types" "^8.61.1"
debug "^4.4.3" debug "^4.4.3"
"@typescript-eslint/scope-manager@8.60.1": "@typescript-eslint/scope-manager@8.61.1":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz#2f875962eaad0a0789cc3c36aea9b4ddeb2dd9c8" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz#2479921a40fdb0afa18f5838fae6167264b417b2"
integrity sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w== integrity sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==
dependencies: dependencies:
"@typescript-eslint/types" "8.60.1" "@typescript-eslint/types" "8.61.1"
"@typescript-eslint/visitor-keys" "8.60.1" "@typescript-eslint/visitor-keys" "8.61.1"
"@typescript-eslint/tsconfig-utils@8.60.1": "@typescript-eslint/tsconfig-utils@8.61.1":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz#bee8b942a13679a878101c9c74577d732062ed93" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz#ca88080e0cf191d49516d7f300b67aa090d2254f"
integrity sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA== integrity sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==
"@typescript-eslint/tsconfig-utils@^8.60.1": "@typescript-eslint/tsconfig-utils@^8.61.1":
version "8.61.0" version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz#05d6e3ff20001674ebcd22d03dac29ee448043ba" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.0.tgz#9440a673581c6d9de308c4d5803dd52ed5d71729"
integrity sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ== integrity sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==
"@typescript-eslint/type-utils@8.60.1": "@typescript-eslint/type-utils@8.61.1":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz#1ae45f0f2a701354beea4a58c2161e40a5e3c379" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz#8fa18f453ee140893b47d339d1a6b64cac9b08a1"
integrity sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A== integrity sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==
dependencies: dependencies:
"@typescript-eslint/types" "8.60.1" "@typescript-eslint/types" "8.61.1"
"@typescript-eslint/typescript-estree" "8.60.1" "@typescript-eslint/typescript-estree" "8.61.1"
"@typescript-eslint/utils" "8.60.1" "@typescript-eslint/utils" "8.61.1"
debug "^4.4.3" debug "^4.4.3"
ts-api-utils "^2.5.0" ts-api-utils "^2.5.0"
"@typescript-eslint/types@8.60.1": "@typescript-eslint/types@8.61.1":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.60.1.tgz#ccdc482ba9e17f9723a10ce240b5e67dad3046c4" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.61.1.tgz#0c51f518e4e6848371a1c988e859d59eb7522d5a"
integrity sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w== integrity sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==
"@typescript-eslint/types@^8.60.1": "@typescript-eslint/types@^8.61.1":
version "8.61.0" version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.61.0.tgz#0ddb46e012a4288292950bdd253db42f278ce64d" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.62.0.tgz#601427c10203d9f0f34f0b3e474df735eb12b593"
integrity sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg== integrity sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==
"@typescript-eslint/typescript-estree@8.60.1": "@typescript-eslint/typescript-estree@8.61.1":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz#016630b119228bf483ddc652703a6a038f3fdd74" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz#febbe70365ac0bf7611262b61b338fc8797965c7"
integrity sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew== integrity sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==
dependencies: dependencies:
"@typescript-eslint/project-service" "8.60.1" "@typescript-eslint/project-service" "8.61.1"
"@typescript-eslint/tsconfig-utils" "8.60.1" "@typescript-eslint/tsconfig-utils" "8.61.1"
"@typescript-eslint/types" "8.60.1" "@typescript-eslint/types" "8.61.1"
"@typescript-eslint/visitor-keys" "8.60.1" "@typescript-eslint/visitor-keys" "8.61.1"
debug "^4.4.3" debug "^4.4.3"
minimatch "^10.2.2" minimatch "^10.2.2"
semver "^7.7.3" semver "^7.7.3"
tinyglobby "^0.2.15" tinyglobby "^0.2.15"
ts-api-utils "^2.5.0" ts-api-utils "^2.5.0"
"@typescript-eslint/utils@8.60.1": "@typescript-eslint/utils@8.61.1":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.60.1.tgz#31cf566095602d9fe8ad91837d2eb520b8de762b" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.61.1.tgz#ffd1054de7dd33b7873cd6c6713ec6b0366316d3"
integrity sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg== integrity sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==
dependencies: dependencies:
"@eslint-community/eslint-utils" "^4.9.1" "@eslint-community/eslint-utils" "^4.9.1"
"@typescript-eslint/scope-manager" "8.60.1" "@typescript-eslint/scope-manager" "8.61.1"
"@typescript-eslint/types" "8.60.1" "@typescript-eslint/types" "8.61.1"
"@typescript-eslint/typescript-estree" "8.60.1" "@typescript-eslint/typescript-estree" "8.61.1"
"@typescript-eslint/visitor-keys@8.60.1": "@typescript-eslint/visitor-keys@8.61.1":
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz#165d1d8901137b944efaf18f00ab5ecb57f06995" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz#546cf102b4efdb72a9a08e63a1b0d7d745eb66eb"
integrity sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag== integrity sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==
dependencies: dependencies:
"@typescript-eslint/types" "8.60.1" "@typescript-eslint/types" "8.61.1"
eslint-visitor-keys "^5.0.0" eslint-visitor-keys "^5.0.0"
"@ungap/structured-clone@^1.0.0": "@ungap/structured-clone@^1.0.0":
@@ -5382,54 +5392,54 @@ ansis@^3.2.0:
resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7" resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7"
integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg== integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==
antd@^6.4.3: antd@^6.4.5:
version "6.4.3" version "6.4.5"
resolved "https://registry.yarnpkg.com/antd/-/antd-6.4.3.tgz#80a7aab9c13c35daa0e0e7eea80585ba57cb7203" resolved "https://registry.yarnpkg.com/antd/-/antd-6.4.5.tgz#98372c96af3e562aeff126289ead5e7e5c5f4212"
integrity sha512-6H2avkxCGfxcF67r3J2mwm9Ck50el1pks/73vfM1wDsPL/tPtj5vHuauMgJFnrqmq7CH3g8aoZ0VBQbt+jpAsw== integrity sha512-xyAgX/sqF/CRS1G95oM4ql0+3TBG+tE58aRJqdUPVv4yMZcQrnnkA4cU7Uc5Rny2yK2TrusDVargHzzXUrlJ1g==
dependencies: dependencies:
"@ant-design/colors" "^8.0.1" "@ant-design/colors" "^8.0.1"
"@ant-design/cssinjs" "^2.1.2" "@ant-design/cssinjs" "^2.1.2"
"@ant-design/cssinjs-utils" "^2.1.2" "@ant-design/cssinjs-utils" "^2.1.2"
"@ant-design/fast-color" "^3.0.1" "@ant-design/fast-color" "^3.0.1"
"@ant-design/icons" "^6.2.3" "@ant-design/icons" "^6.2.5"
"@ant-design/react-slick" "~2.0.0" "@ant-design/react-slick" "~2.0.0"
"@babel/runtime" "^7.29.2" "@babel/runtime" "^7.29.2"
"@rc-component/cascader" "~1.15.0" "@rc-component/cascader" "~1.16.1"
"@rc-component/checkbox" "~2.0.0" "@rc-component/checkbox" "~2.0.0"
"@rc-component/collapse" "~1.2.0" "@rc-component/collapse" "~1.2.0"
"@rc-component/color-picker" "~3.1.1" "@rc-component/color-picker" "~3.1.1"
"@rc-component/dialog" "~1.9.0" "@rc-component/dialog" "~1.9.0"
"@rc-component/drawer" "~1.4.2" "@rc-component/drawer" "~1.4.2"
"@rc-component/dropdown" "~1.0.2" "@rc-component/dropdown" "~1.0.2"
"@rc-component/form" "~1.8.1" "@rc-component/form" "~1.8.5"
"@rc-component/image" "~1.9.0" "@rc-component/image" "~1.9.0"
"@rc-component/input" "~1.3.0" "@rc-component/input" "~1.3.1"
"@rc-component/input-number" "~1.6.2" "@rc-component/input-number" "~1.6.2"
"@rc-component/mentions" "~1.9.0" "@rc-component/mentions" "~1.9.0"
"@rc-component/menu" "~1.3.0" "@rc-component/menu" "~1.3.1"
"@rc-component/motion" "^1.3.2" "@rc-component/motion" "^1.3.3"
"@rc-component/mutate-observer" "^2.0.1" "@rc-component/mutate-observer" "^2.0.1"
"@rc-component/notification" "~2.0.7" "@rc-component/notification" "~2.0.7"
"@rc-component/pagination" "~1.2.0" "@rc-component/pagination" "~1.3.0"
"@rc-component/picker" "~1.10.0" "@rc-component/picker" "~1.10.0"
"@rc-component/progress" "~1.0.2" "@rc-component/progress" "~1.0.2"
"@rc-component/qrcode" "~1.1.1" "@rc-component/qrcode" "~2.0.0"
"@rc-component/rate" "~1.0.1" "@rc-component/rate" "~1.0.1"
"@rc-component/resize-observer" "^1.1.2" "@rc-component/resize-observer" "^1.1.2"
"@rc-component/segmented" "~1.3.0" "@rc-component/segmented" "~1.3.0"
"@rc-component/select" "~1.6.15" "@rc-component/select" "~1.7.1"
"@rc-component/slider" "~1.0.1" "@rc-component/slider" "~1.0.1"
"@rc-component/steps" "~1.2.2" "@rc-component/steps" "~1.2.2"
"@rc-component/switch" "~1.0.3" "@rc-component/switch" "~1.0.3"
"@rc-component/table" "~1.10.0" "@rc-component/table" "~1.10.2"
"@rc-component/tabs" "~1.9.0" "@rc-component/tabs" "~1.9.1"
"@rc-component/tooltip" "~1.4.0" "@rc-component/tooltip" "~1.4.0"
"@rc-component/tour" "~2.4.0" "@rc-component/tour" "~2.4.0"
"@rc-component/tree" "~1.3.1" "@rc-component/tree" "~1.3.2"
"@rc-component/tree-select" "~1.9.0" "@rc-component/tree-select" "~1.10.0"
"@rc-component/trigger" "^3.9.0" "@rc-component/trigger" "^3.9.1"
"@rc-component/upload" "~1.1.0" "@rc-component/upload" "~1.1.1"
"@rc-component/util" "^1.11.0" "@rc-component/util" "^1.11.1"
clsx "^2.1.1" clsx "^2.1.1"
dayjs "^1.11.11" dayjs "^1.11.11"
scroll-into-view-if-needed "^3.1.0" scroll-into-view-if-needed "^3.1.0"
@@ -5688,10 +5698,10 @@ base64-js@^1.3.1, base64-js@^1.5.1:
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
baseline-browser-mapping@^2.10.34, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19: baseline-browser-mapping@^2.10.38, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19:
version "2.10.34" version "2.10.38"
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz#dedb606362446777cfe328d30d4ee15056d06303" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz#c84d093c4bf7325c5053c279d90f153c66526042"
integrity sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw== integrity sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==
batch@0.6.1: batch@0.6.1:
version "0.6.1" version "0.6.1"
@@ -5934,10 +5944,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2" lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0" lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001797: caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001799:
version "1.0.30001797" version "1.0.30001799"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz#1332709e1439f01ff92085dd17001e0a45897ec0" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz#5c909138c27f1a61219d3e092071c1cc7d32dc55"
integrity sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w== integrity sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==
ccount@^2.0.0: ccount@^2.0.0:
version "2.0.1" version "2.0.1"
@@ -7252,17 +7262,10 @@ domhandler@^5.0.2, domhandler@^5.0.3:
dependencies: dependencies:
domelementtype "^2.3.0" domelementtype "^2.3.0"
dompurify@^3.3.1: dompurify@^3.3.1, dompurify@^3.4.0:
version "3.4.2" version "3.4.11"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.2.tgz#f0ff81be682c485505097ba8195a058d8f575218" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.11.tgz#29c8ba496475f279ef4015784068452fb14a0680"
integrity sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA== integrity sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==
optionalDependencies:
"@types/trusted-types" "^2.0.7"
dompurify@^3.4.0:
version "3.4.1"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.1.tgz#521d04483ac12631b2aedf434a5f5390933b8789"
integrity sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==
optionalDependencies: optionalDependencies:
"@types/trusted-types" "^2.0.7" "@types/trusted-types" "^2.0.7"
@@ -8765,9 +8768,9 @@ http-parser-js@>=0.5.1:
integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==
http-proxy-middleware@^2.0.9: http-proxy-middleware@^2.0.9:
version "2.0.9" version "2.0.10"
resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz#b2df7b705203d7a8c269ac8450cf96b00c532f94"
integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== integrity sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==
dependencies: dependencies:
"@types/http-proxy" "^1.17.8" "@types/http-proxy" "^1.17.8"
http-proxy "^1.18.1" http-proxy "^1.18.1"
@@ -12270,10 +12273,10 @@ prettier-linter-helpers@^1.0.1:
dependencies: dependencies:
fast-diff "^1.1.2" fast-diff "^1.1.2"
prettier@^3.8.3: prettier@^3.8.4:
version "3.8.3" version "3.8.4"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.3.tgz#560f2de55bf01b4c0503bc629d5df99b9a1d09b0" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.4.tgz#f334f013ac04a96676f24dabc23c1c4ae1bae411"
integrity sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw== integrity sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==
pretty-error@^4.0.0: pretty-error@^4.0.0:
version "4.0.0" version "4.0.0"
@@ -14499,15 +14502,15 @@ types-ramda@^0.30.1:
dependencies: dependencies:
ts-toolbelt "^9.6.0" ts-toolbelt "^9.6.0"
typescript-eslint@^8.60.1: typescript-eslint@^8.61.1:
version "8.60.1" version "8.61.1"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.60.1.tgz#13db05c6eabb89669deec44545b788a0e9aee640" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.61.1.tgz#7c224a9a643b7f42d295c67a75c1e30fee8c3eaa"
integrity sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA== integrity sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==
dependencies: dependencies:
"@typescript-eslint/eslint-plugin" "8.60.1" "@typescript-eslint/eslint-plugin" "8.61.1"
"@typescript-eslint/parser" "8.60.1" "@typescript-eslint/parser" "8.61.1"
"@typescript-eslint/typescript-estree" "8.60.1" "@typescript-eslint/typescript-estree" "8.61.1"
"@typescript-eslint/utils" "8.60.1" "@typescript-eslint/utils" "8.61.1"
typescript@~6.0.3: typescript@~6.0.3:
version "6.0.3" version "6.0.3"
@@ -15006,9 +15009,9 @@ webpack-dev-middleware@^7.4.2:
schema-utils "^4.0.0" schema-utils "^4.0.0"
webpack-dev-server@^5.2.2: webpack-dev-server@^5.2.2:
version "5.2.4" version "5.2.5"
resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz#6e6306ce59848ed322c235e48b326632b1eed6d6" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.5.tgz#648fceaac6a5736b0935e5c1e55d6aa1d0626119"
integrity sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA== integrity sha512-4wZtCquSuv9CKX8oybo+mqxtxZqWz47uM1Ch94lxowBztOhWCbhqvRbfC/mODOwxgV2brY+JGZpHq58/SuVFYg==
dependencies: dependencies:
"@types/bonjour" "^3.5.13" "@types/bonjour" "^3.5.13"
"@types/connect-history-api-fallback" "^1.5.4" "@types/connect-history-api-fallback" "^1.5.4"
@@ -15243,15 +15246,10 @@ write-file-atomic@^3.0.3:
signal-exit "^3.0.2" signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5" typedarray-to-buffer "^3.1.5"
ws@^7.3.1: ws@^7.3.1, ws@^8.18.0, ws@^8.2.3, ws@^8.21.0:
version "7.5.10" version "8.21.0"
resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.0.tgz#012e413fc07429945121b0c153158c4343086951"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==
ws@^8.18.0, ws@^8.2.3:
version "8.20.1"
resolved "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz"
integrity sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==
wsl-utils@^0.1.0: wsl-utils@^0.1.0:
version "0.1.0" version "0.1.0"

View File

@@ -29,7 +29,7 @@ maintainers:
- name: craig-rueda - name: craig-rueda
email: craig@craigrueda.com email: craig@craigrueda.com
url: https://github.com/craig-rueda url: https://github.com/craig-rueda
version: 0.16.0 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details. version: 0.18.0 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details.
dependencies: dependencies:
- name: postgresql - name: postgresql
version: 16.7.27 version: 16.7.27

View File

@@ -23,7 +23,7 @@ NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs
# superset # superset
![Version: 0.16.0](https://img.shields.io/badge/Version-0.16.0-informational?style=flat-square) ![Version: 0.18.0](https://img.shields.io/badge/Version-0.18.0-informational?style=flat-square)
Apache Superset is a modern, enterprise-ready business intelligence web application Apache Superset is a modern, enterprise-ready business intelligence web application
@@ -88,6 +88,7 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
| ingress.path | string | `"/"` | | | ingress.path | string | `"/"` | |
| ingress.pathType | string | `"ImplementationSpecific"` | | | ingress.pathType | string | `"ImplementationSpecific"` | |
| ingress.tls | list | `[]` | | | ingress.tls | list | `[]` | |
| init.additionalPodSpec | object | `{}` | Custom pod spec to be added to init job |
| init.adminUser.email | string | `"admin@superset.com"` | | | init.adminUser.email | string | `"admin@superset.com"` | |
| init.adminUser.firstname | string | `"Superset"` | | | init.adminUser.firstname | string | `"Superset"` | |
| init.adminUser.lastname | string | `"Admin"` | | | init.adminUser.lastname | string | `"Admin"` | |
@@ -111,9 +112,6 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
| init.resources | object | `{}` | | | init.resources | object | `{}` | |
| init.tolerations | list | `[]` | | | init.tolerations | list | `[]` | |
| init.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to init job | | init.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to init job |
| initImage.pullPolicy | string | `"IfNotPresent"` | |
| initImage.repository | string | `"apache/superset"` | |
| initImage.tag | string | `"dockerize"` | |
| nameOverride | string | `nil` | Provide a name to override the name of the chart | | nameOverride | string | `nil` | Provide a name to override the name of the chart |
| nodeSelector | object | `{}` | | | nodeSelector | object | `{}` | |
| postgresql | object | see `values.yaml` | Configuration values for the postgresql dependency. ref: https://github.com/bitnami/charts/tree/main/bitnami/postgresql | | postgresql | object | see `values.yaml` | Configuration values for the postgresql dependency. ref: https://github.com/bitnami/charts/tree/main/bitnami/postgresql |
@@ -134,6 +132,7 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
| supersetCeleryBeat.affinity | object | `{}` | Affinity to be added to supersetCeleryBeat deployment | | supersetCeleryBeat.affinity | object | `{}` | Affinity to be added to supersetCeleryBeat deployment |
| supersetCeleryBeat.command | list | a `celery beat` command | Command | | supersetCeleryBeat.command | list | a `celery beat` command | Command |
| supersetCeleryBeat.containerSecurityContext | object | `{}` | | | supersetCeleryBeat.containerSecurityContext | object | `{}` | |
| supersetCeleryBeat.deploymentAdditionalPodSpec | object | `{}` | Custom pod spec to be added to supersetCeleryBeat deployment |
| supersetCeleryBeat.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryBeat deployment | | supersetCeleryBeat.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryBeat deployment |
| supersetCeleryBeat.enabled | bool | `false` | This is only required if you intend to use alerts and reports | | supersetCeleryBeat.enabled | bool | `false` | This is only required if you intend to use alerts and reports |
| supersetCeleryBeat.extraContainers | list | `[]` | Launch additional containers into supersetCeleryBeat pods | | supersetCeleryBeat.extraContainers | list | `[]` | Launch additional containers into supersetCeleryBeat pods |
@@ -152,6 +151,7 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
| supersetCeleryFlower.affinity | object | `{}` | Affinity to be added to supersetCeleryFlower deployment | | supersetCeleryFlower.affinity | object | `{}` | Affinity to be added to supersetCeleryFlower deployment |
| supersetCeleryFlower.command | list | a `celery flower` command | Command | | supersetCeleryFlower.command | list | a `celery flower` command | Command |
| supersetCeleryFlower.containerSecurityContext | object | `{}` | | | supersetCeleryFlower.containerSecurityContext | object | `{}` | |
| supersetCeleryFlower.deploymentAdditionalPodSpec | object | `{}` | Custom pod spec to be added to supersetCeleryFlower deployment |
| supersetCeleryFlower.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryFlower deployment | | supersetCeleryFlower.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryFlower deployment |
| supersetCeleryFlower.enabled | bool | `false` | Enables a Celery flower deployment (management UI to monitor celery jobs) WARNING: on superset 1.x, this requires a Superset image that has `flower<1.0.0` installed (which is NOT the case of the default images) flower>=1.0.0 requires Celery 5+ which Superset 1.5 does not support | | supersetCeleryFlower.enabled | bool | `false` | Enables a Celery flower deployment (management UI to monitor celery jobs) WARNING: on superset 1.x, this requires a Superset image that has `flower<1.0.0` installed (which is NOT the case of the default images) flower>=1.0.0 requires Celery 5+ which Superset 1.5 does not support |
| supersetCeleryFlower.extraContainers | list | `[]` | Launch additional containers into supersetCeleryFlower pods | | supersetCeleryFlower.extraContainers | list | `[]` | Launch additional containers into supersetCeleryFlower pods |
@@ -207,18 +207,21 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
| supersetNode.connections.db_user | string | `"superset"` | | | supersetNode.connections.db_user | string | `"superset"` | |
| supersetNode.connections.redis_cache_db | string | `"1"` | | | supersetNode.connections.redis_cache_db | string | `"1"` | |
| supersetNode.connections.redis_celery_db | string | `"0"` | | | supersetNode.connections.redis_celery_db | string | `"0"` | |
| supersetNode.connections.redis_driver | string | `""` | |
| supersetNode.connections.redis_host | string | `"{{ .Release.Name }}-redis-headless"` | Change in case of bringing your own redis and then also set redis.enabled:false | | supersetNode.connections.redis_host | string | `"{{ .Release.Name }}-redis-headless"` | Change in case of bringing your own redis and then also set redis.enabled:false |
| supersetNode.connections.redis_port | string | `"6379"` | | | supersetNode.connections.redis_port | string | `"6379"` | |
| supersetNode.connections.redis_ssl.enabled | bool | `false` | | | supersetNode.connections.redis_ssl.enabled | bool | `false` | |
| supersetNode.connections.redis_ssl.ssl_cert_reqs | string | `"CERT_NONE"` | | | supersetNode.connections.redis_ssl.ssl_cert_reqs | string | `"CERT_NONE"` | |
| supersetNode.connections.redis_user | string | `""` | | | supersetNode.connections.redis_user | string | `""` | |
| supersetNode.containerSecurityContext | object | `{}` | | | supersetNode.containerSecurityContext | object | `{}` | |
| supersetNode.deploymentAdditionalPodSpec | object | `{}` | Custom pod spec to be added to supersetNode deployment |
| supersetNode.deploymentAnnotations | object | `{}` | Annotations to be added to supersetNode deployment | | supersetNode.deploymentAnnotations | object | `{}` | Annotations to be added to supersetNode deployment |
| supersetNode.deploymentLabels | object | `{}` | Labels to be added to supersetNode deployment | | supersetNode.deploymentLabels | object | `{}` | Labels to be added to supersetNode deployment |
| supersetNode.env | object | `{}` | | | supersetNode.env | object | `{}` | |
| supersetNode.extraContainers | list | `[]` | Launch additional containers into supersetNode pod | | supersetNode.extraContainers | list | `[]` | Launch additional containers into supersetNode pod |
| supersetNode.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade | | supersetNode.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
| supersetNode.initContainers | list | a container waiting for postgres | Init containers | | supersetNode.initContainers | list | a container waiting for postgres | Init containers |
| supersetNode.lifecycle | object | `{}` | Container lifecycle hooks, e.g. a preStop sleep so the Service/Ingress stops routing to the pod before gunicorn receives SIGTERM |
| supersetNode.livenessProbe.failureThreshold | int | `3` | | | supersetNode.livenessProbe.failureThreshold | int | `3` | |
| supersetNode.livenessProbe.httpGet.path | string | `"/health"` | | | supersetNode.livenessProbe.httpGet.path | string | `"/health"` | |
| supersetNode.livenessProbe.httpGet.port | string | `"http"` | | | supersetNode.livenessProbe.httpGet.port | string | `"http"` | |
@@ -251,11 +254,13 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
| supersetNode.startupProbe.successThreshold | int | `1` | | | supersetNode.startupProbe.successThreshold | int | `1` | |
| supersetNode.startupProbe.timeoutSeconds | int | `1` | | | supersetNode.startupProbe.timeoutSeconds | int | `1` | |
| supersetNode.strategy | object | `{}` | | | supersetNode.strategy | object | `{}` | |
| supersetNode.terminationGracePeriodSeconds | string | `nil` | Pod termination grace period (seconds). Set greater than GUNICORN_TIMEOUT so in-flight requests can drain before SIGKILL |
| supersetNode.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetNode deployments | | supersetNode.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetNode deployments |
| supersetWebsockets.affinity | object | `{}` | Affinity to be added to supersetWebsockets deployment | | supersetWebsockets.affinity | object | `{}` | Affinity to be added to supersetWebsockets deployment |
| supersetWebsockets.command | list | `[]` | | | supersetWebsockets.command | list | `[]` | |
| supersetWebsockets.config | object | see `values.yaml` | The config.json to pass to the server, see https://github.com/apache/superset/tree/master/superset-websocket Note that the configuration can also read from environment variables (which will have priority), see https://github.com/apache/superset/blob/master/superset-websocket/src/config.ts for a list of supported variables | | supersetWebsockets.config | object | see `values.yaml` | The config.json to pass to the server, see https://github.com/apache/superset/tree/master/superset-websocket Note that the configuration can also read from environment variables (which will have priority), see https://github.com/apache/superset/blob/master/superset-websocket/src/config.ts for a list of supported variables |
| supersetWebsockets.containerSecurityContext | object | `{}` | | | supersetWebsockets.containerSecurityContext | object | `{}` | |
| supersetWebsockets.deploymentAdditionalPodSpec | object | `{}` | Custom pod spec to be added to supersetWebsockets deployment |
| supersetWebsockets.deploymentAnnotations | object | `{}` | | | supersetWebsockets.deploymentAnnotations | object | `{}` | |
| supersetWebsockets.enabled | bool | `false` | This is only required if you intend to use `GLOBAL_ASYNC_QUERIES` in `ws` mode see https://superset.apache.org/docs/contributing/misc#async-chart-queries | | supersetWebsockets.enabled | bool | `false` | This is only required if you intend to use `GLOBAL_ASYNC_QUERIES` in `ws` mode see https://superset.apache.org/docs/contributing/misc#async-chart-queries |
| supersetWebsockets.extraContainers | list | `[]` | Launch additional containers into supersetWebsockets pods | | supersetWebsockets.extraContainers | list | `[]` | Launch additional containers into supersetWebsockets pods |
@@ -309,11 +314,13 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
| supersetWorker.autoscaling.targetCPUUtilizationPercentage | int | `80` | | | supersetWorker.autoscaling.targetCPUUtilizationPercentage | int | `80` | |
| supersetWorker.command | list | a `celery worker` command | Worker startup command | | supersetWorker.command | list | a `celery worker` command | Worker startup command |
| supersetWorker.containerSecurityContext | object | `{}` | | | supersetWorker.containerSecurityContext | object | `{}` | |
| supersetWorker.deploymentAdditionalPodSpec | object | `{}` | Custom pod spec to be added to supersetWorker deployment |
| supersetWorker.deploymentAnnotations | object | `{}` | Annotations to be added to supersetWorker deployment | | supersetWorker.deploymentAnnotations | object | `{}` | Annotations to be added to supersetWorker deployment |
| supersetWorker.deploymentLabels | object | `{}` | Labels to be added to supersetWorker deployment | | supersetWorker.deploymentLabels | object | `{}` | Labels to be added to supersetWorker deployment |
| supersetWorker.extraContainers | list | `[]` | Launch additional containers into supersetWorker pod | | supersetWorker.extraContainers | list | `[]` | Launch additional containers into supersetWorker pod |
| supersetWorker.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade | | supersetWorker.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
| supersetWorker.initContainers | list | a container waiting for postgres and redis | Init container | | supersetWorker.initContainers | list | a container waiting for postgres and redis | Init container |
| supersetWorker.lifecycle | object | `{}` | Container lifecycle hooks for the worker pod |
| supersetWorker.livenessProbe.exec.command | list | a `celery inspect ping` command | Liveness probe command | | supersetWorker.livenessProbe.exec.command | list | a `celery inspect ping` command | Liveness probe command |
| supersetWorker.livenessProbe.failureThreshold | int | `3` | | | supersetWorker.livenessProbe.failureThreshold | int | `3` | |
| supersetWorker.livenessProbe.initialDelaySeconds | int | `120` | | | supersetWorker.livenessProbe.initialDelaySeconds | int | `120` | |
@@ -334,6 +341,7 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
| supersetWorker.resources | object | `{}` | Resource settings for the supersetWorker pods - these settings overwrite might existing values from the global resources object defined above. | | supersetWorker.resources | object | `{}` | Resource settings for the supersetWorker pods - these settings overwrite might existing values from the global resources object defined above. |
| supersetWorker.startupProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) | | supersetWorker.startupProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) |
| supersetWorker.strategy | object | `{}` | | | supersetWorker.strategy | object | `{}` | |
| supersetWorker.terminationGracePeriodSeconds | string | `nil` | Pod termination grace period (seconds) for the worker pod so in-flight tasks can drain before SIGKILL |
| supersetWorker.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetWorker deployments | | supersetWorker.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetWorker deployments |
| tolerations | list | `[]` | | | tolerations | list | `[]` | |
| topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to all deployments | | topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to all deployments |

View File

@@ -71,9 +71,9 @@ def env(key, default=None):
# Redis Base URL # Redis Base URL
{{- if .Values.supersetNode.connections.redis_password }} {{- if .Values.supersetNode.connections.redis_password }}
REDIS_BASE_URL=f"{env('REDIS_PROTO')}://{env('REDIS_USER', '')}:{env('REDIS_PASSWORD')}@{env('REDIS_HOST')}:{env('REDIS_PORT')}" REDIS_BASE_URL=f"{env('REDIS_DRIVER') or env('REDIS_PROTO')}://{env('REDIS_USER', '')}:{env('REDIS_PASSWORD')}@{env('REDIS_HOST')}:{env('REDIS_PORT')}"
{{- else }} {{- else }}
REDIS_BASE_URL=f"{env('REDIS_PROTO')}://{env('REDIS_HOST')}:{env('REDIS_PORT')}" REDIS_BASE_URL=f"{env('REDIS_DRIVER') or env('REDIS_PROTO')}://{env('REDIS_HOST')}:{env('REDIS_PORT')}"
{{- end }} {{- end }}
# Redis URL Params # Redis URL Params
@@ -108,8 +108,6 @@ else:
{{ fail (printf "Unsupported database type: %s. Please use 'postgresql' or 'mysql'." .Values.supersetNode.connections.db_type) }} {{ fail (printf "Unsupported database type: %s. Please use 'postgresql' or 'mysql'." .Values.supersetNode.connections.db_type) }}
{{- end }} {{- end }}
SQLALCHEMY_TRACK_MODIFICATIONS = True
class CeleryConfig: class CeleryConfig:
imports = ("superset.sql_lab", ) imports = ("superset.sql_lab", )
broker_url = CELERY_REDIS_URL broker_url = CELERY_REDIS_URL

View File

@@ -68,6 +68,9 @@ spec:
{{- toYaml .Values.supersetCeleryBeat.podLabels | nindent 8 }} {{- toYaml .Values.supersetCeleryBeat.podLabels | nindent 8 }}
{{- end }} {{- end }}
spec: spec:
{{- if .Values.supersetCeleryBeat.deploymentAdditionalPodSpec }}
{{- tpl (toYaml .Values.supersetCeleryBeat.deploymentAdditionalPodSpec) . | nindent 6 }}
{{- end }}
{{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }}
serviceAccountName: {{ template "superset.serviceAccountName" . }} serviceAccountName: {{ template "superset.serviceAccountName" . }}
{{- end }} {{- end }}
@@ -126,7 +129,7 @@ spec:
{{- toYaml .Values.resources | nindent 12 }} {{- toYaml .Values.resources | nindent 12 }}
{{- end }} {{- end }}
{{- if .Values.supersetCeleryBeat.extraContainers }} {{- if .Values.supersetCeleryBeat.extraContainers }}
{{- toYaml .Values.supersetCeleryBeat.extraContainers | nindent 8 }} {{- tpl (toYaml .Values.supersetCeleryBeat.extraContainers) . | nindent 8 }}
{{- end }} {{- end }}
{{- with .Values.nodeSelector }} {{- with .Values.nodeSelector }}
nodeSelector: {{- toYaml . | nindent 8 }} nodeSelector: {{- toYaml . | nindent 8 }}

View File

@@ -57,6 +57,9 @@ spec:
{{- toYaml .Values.supersetCeleryFlower.podLabels | nindent 8 }} {{- toYaml .Values.supersetCeleryFlower.podLabels | nindent 8 }}
{{- end }} {{- end }}
spec: spec:
{{- if .Values.supersetCeleryFlower.deploymentAdditionalPodSpec }}
{{- tpl (toYaml .Values.supersetCeleryFlower.deploymentAdditionalPodSpec) . | nindent 6 }}
{{- end }}
{{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }}
serviceAccountName: {{ template "superset.serviceAccountName" . }} serviceAccountName: {{ template "superset.serviceAccountName" . }}
{{- end }} {{- end }}
@@ -121,7 +124,7 @@ spec:
{{- toYaml .Values.resources | nindent 12 }} {{- toYaml .Values.resources | nindent 12 }}
{{- end }} {{- end }}
{{- if .Values.supersetCeleryFlower.extraContainers }} {{- if .Values.supersetCeleryFlower.extraContainers }}
{{- toYaml .Values.supersetCeleryFlower.extraContainers | nindent 8 }} {{- tpl (toYaml .Values.supersetCeleryFlower.extraContainers) . | nindent 8 }}
{{- end }} {{- end }}
{{- with .Values.nodeSelector }} {{- with .Values.nodeSelector }}
nodeSelector: {{- toYaml . | nindent 8 }} nodeSelector: {{- toYaml . | nindent 8 }}

View File

@@ -74,6 +74,9 @@ spec:
{{- toYaml .Values.supersetWorker.podLabels | nindent 8 }} {{- toYaml .Values.supersetWorker.podLabels | nindent 8 }}
{{- end }} {{- end }}
spec: spec:
{{- if .Values.supersetWorker.deploymentAdditionalPodSpec }}
{{- tpl (toYaml .Values.supersetWorker.deploymentAdditionalPodSpec) . | nindent 6 }}
{{- end }}
{{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }}
serviceAccountName: {{ template "superset.serviceAccountName" . }} serviceAccountName: {{ template "superset.serviceAccountName" . }}
{{- end }} {{- end }}
@@ -134,6 +137,9 @@ spec:
{{- if .Values.supersetWorker.livenessProbe }} {{- if .Values.supersetWorker.livenessProbe }}
livenessProbe: {{- .Values.supersetWorker.livenessProbe | toYaml | nindent 12 }} livenessProbe: {{- .Values.supersetWorker.livenessProbe | toYaml | nindent 12 }}
{{- end }} {{- end }}
{{- if .Values.supersetWorker.lifecycle }}
lifecycle: {{- .Values.supersetWorker.lifecycle | toYaml | nindent 12 }}
{{- end }}
resources: resources:
{{- if .Values.supersetWorker.resources }} {{- if .Values.supersetWorker.resources }}
{{- toYaml .Values.supersetWorker.resources | nindent 12 }} {{- toYaml .Values.supersetWorker.resources | nindent 12 }}
@@ -141,7 +147,7 @@ spec:
{{- toYaml .Values.resources | nindent 12 }} {{- toYaml .Values.resources | nindent 12 }}
{{- end }} {{- end }}
{{- if .Values.supersetWorker.extraContainers }} {{- if .Values.supersetWorker.extraContainers }}
{{- toYaml .Values.supersetWorker.extraContainers | nindent 8 }} {{- tpl (toYaml .Values.supersetWorker.extraContainers) . | nindent 8 }}
{{- end }} {{- end }}
{{- with .Values.nodeSelector }} {{- with .Values.nodeSelector }}
nodeSelector: {{- toYaml . | nindent 8 }} nodeSelector: {{- toYaml . | nindent 8 }}
@@ -170,6 +176,9 @@ spec:
{{- with .Values.tolerations }} {{- with .Values.tolerations }}
tolerations: {{- toYaml . | nindent 8 }} tolerations: {{- toYaml . | nindent 8 }}
{{- end }} {{- end }}
{{- if .Values.supersetWorker.terminationGracePeriodSeconds }}
terminationGracePeriodSeconds: {{ .Values.supersetWorker.terminationGracePeriodSeconds }}
{{- end }}
{{- if .Values.imagePullSecrets }} {{- if .Values.imagePullSecrets }}
imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }} imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }}
{{- end }} {{- end }}

View File

@@ -60,6 +60,9 @@ spec:
{{- toYaml .Values.supersetWebsockets.podLabels | nindent 8 }} {{- toYaml .Values.supersetWebsockets.podLabels | nindent 8 }}
{{- end }} {{- end }}
spec: spec:
{{- if .Values.supersetWebsockets.deploymentAdditionalPodSpec }}
{{- tpl (toYaml .Values.supersetWebsockets.deploymentAdditionalPodSpec) . | nindent 6 }}
{{- end }}
{{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }}
serviceAccountName: {{ template "superset.serviceAccountName" . }} serviceAccountName: {{ template "superset.serviceAccountName" . }}
{{- end }} {{- end }}
@@ -120,7 +123,7 @@ spec:
livenessProbe: {{- .Values.supersetWebsockets.livenessProbe | toYaml | nindent 12 }} livenessProbe: {{- .Values.supersetWebsockets.livenessProbe | toYaml | nindent 12 }}
{{- end }} {{- end }}
{{- if .Values.supersetWebsockets.extraContainers }} {{- if .Values.supersetWebsockets.extraContainers }}
{{- toYaml .Values.supersetWebsockets.extraContainers | nindent 8 }} {{- tpl (toYaml .Values.supersetWebsockets.extraContainers) . | nindent 8 }}
{{- end }} {{- end }}
{{- with .Values.nodeSelector }} {{- with .Values.nodeSelector }}
nodeSelector: {{- toYaml . | nindent 8 }} nodeSelector: {{- toYaml . | nindent 8 }}

View File

@@ -76,6 +76,9 @@ spec:
{{- toYaml .Values.supersetNode.podLabels | nindent 8 }} {{- toYaml .Values.supersetNode.podLabels | nindent 8 }}
{{- end }} {{- end }}
spec: spec:
{{- if .Values.supersetNode.deploymentAdditionalPodSpec }}
{{- tpl (toYaml .Values.supersetNode.deploymentAdditionalPodSpec) . | nindent 6 }}
{{- end }}
{{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }}
serviceAccountName: {{ template "superset.serviceAccountName" . }} serviceAccountName: {{ template "superset.serviceAccountName" . }}
{{- end }} {{- end }}
@@ -144,6 +147,9 @@ spec:
{{- if .Values.supersetNode.livenessProbe }} {{- if .Values.supersetNode.livenessProbe }}
livenessProbe: {{- .Values.supersetNode.livenessProbe | toYaml | nindent 12 }} livenessProbe: {{- .Values.supersetNode.livenessProbe | toYaml | nindent 12 }}
{{- end }} {{- end }}
{{- if .Values.supersetNode.lifecycle }}
lifecycle: {{- .Values.supersetNode.lifecycle | toYaml | nindent 12 }}
{{- end }}
resources: resources:
{{- if .Values.supersetNode.resources }} {{- if .Values.supersetNode.resources }}
{{- toYaml .Values.supersetNode.resources | nindent 12 }} {{- toYaml .Values.supersetNode.resources | nindent 12 }}
@@ -151,7 +157,7 @@ spec:
{{- toYaml .Values.resources | nindent 12 }} {{- toYaml .Values.resources | nindent 12 }}
{{- end }} {{- end }}
{{- if .Values.supersetNode.extraContainers }} {{- if .Values.supersetNode.extraContainers }}
{{- toYaml .Values.supersetNode.extraContainers | nindent 8 }} {{- tpl (toYaml .Values.supersetNode.extraContainers) . | nindent 8 }}
{{- end }} {{- end }}
{{- with .Values.nodeSelector }} {{- with .Values.nodeSelector }}
nodeSelector: {{- toYaml . | nindent 8 }} nodeSelector: {{- toYaml . | nindent 8 }}
@@ -180,6 +186,9 @@ spec:
{{- with .Values.tolerations }} {{- with .Values.tolerations }}
tolerations: {{- toYaml . | nindent 8 }} tolerations: {{- toYaml . | nindent 8 }}
{{- end }} {{- end }}
{{- if .Values.supersetNode.terminationGracePeriodSeconds }}
terminationGracePeriodSeconds: {{ .Values.supersetNode.terminationGracePeriodSeconds }}
{{- end }}
{{- if .Values.imagePullSecrets }} {{- if .Values.imagePullSecrets }}
imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }} imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }}
{{- end }} {{- end }}

View File

@@ -41,16 +41,21 @@ spec:
{{- if .Values.init.podAnnotations }} {{- if .Values.init.podAnnotations }}
annotations: {{- toYaml .Values.init.podAnnotations | nindent 8 }} annotations: {{- toYaml .Values.init.podAnnotations | nindent 8 }}
{{- end }} {{- end }}
{{- if or .Values.extraLabels .Values.init.podLabels }}
labels: labels:
app: {{ template "superset.name" . }}
chart: {{ template "superset.chart" . }}
release: {{ .Release.Name }}
job: {{ template "superset.fullname" . }}-init-db
{{- if .Values.extraLabels }} {{- if .Values.extraLabels }}
{{- toYaml .Values.extraLabels | nindent 8 }} {{- toYaml .Values.extraLabels | nindent 8 }}
{{- end }} {{- end }}
{{- if .Values.init.podLabels }} {{- if .Values.init.podLabels }}
{{- toYaml .Values.init.podLabels | nindent 8 }} {{- toYaml .Values.init.podLabels | nindent 8 }}
{{- end }} {{- end }}
{{- end }}
spec: spec:
{{- if .Values.init.additionalPodSpec }}
{{- tpl (toYaml .Values.init.additionalPodSpec) . | nindent 6 }}
{{- end }}
{{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }}
serviceAccountName: {{ template "superset.serviceAccountName" . }} serviceAccountName: {{ template "superset.serviceAccountName" . }}
{{- end }} {{- end }}
@@ -62,6 +67,9 @@ spec:
{{- if .Values.init.initContainers }} {{- if .Values.init.initContainers }}
initContainers: {{- tpl (toYaml .Values.init.initContainers) . | nindent 6 }} initContainers: {{- tpl (toYaml .Values.init.initContainers) . | nindent 6 }}
{{- end }} {{- end }}
{{- with .Values.hostAliases }}
hostAliases: {{- toYaml . | nindent 6 }}
{{- end }}
containers: containers:
- name: {{ template "superset.name" . }}-init-db - name: {{ template "superset.name" . }}-init-db
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
@@ -101,7 +109,7 @@ spec:
command: {{ tpl (toJson .Values.init.command) . }} command: {{ tpl (toJson .Values.init.command) . }}
resources: {{- toYaml .Values.init.resources | nindent 10 }} resources: {{- toYaml .Values.init.resources | nindent 10 }}
{{- if .Values.init.extraContainers }} {{- if .Values.init.extraContainers }}
{{- toYaml .Values.init.extraContainers | nindent 6 }} {{- tpl (toYaml .Values.init.extraContainers) . | nindent 6 }}
{{- end }} {{- end }}
{{- with .Values.nodeSelector }} {{- with .Values.nodeSelector }}
nodeSelector: {{- toYaml . | nindent 8 }} nodeSelector: {{- toYaml . | nindent 8 }}

View File

@@ -39,6 +39,7 @@ stringData:
{{- end }} {{- end }}
REDIS_PORT: {{ .Values.supersetNode.connections.redis_port | quote }} REDIS_PORT: {{ .Values.supersetNode.connections.redis_port | quote }}
REDIS_PROTO: {{ if .Values.supersetNode.connections.redis_ssl.enabled }}"rediss"{{ else }}"redis"{{ end }} REDIS_PROTO: {{ if .Values.supersetNode.connections.redis_ssl.enabled }}"rediss"{{ else }}"redis"{{ end }}
REDIS_DRIVER: {{ .Values.supersetNode.connections.redis_driver | quote }}
REDIS_DB: {{ .Values.supersetNode.connections.redis_cache_db | quote }} REDIS_DB: {{ .Values.supersetNode.connections.redis_cache_db | quote }}
REDIS_CELERY_DB: {{ .Values.supersetNode.connections.redis_celery_db | quote }} REDIS_CELERY_DB: {{ .Values.supersetNode.connections.redis_celery_db | quote }}
{{- if .Values.supersetNode.connections.redis_ssl.enabled }} {{- if .Values.supersetNode.connections.redis_ssl.enabled }}

View File

@@ -194,11 +194,6 @@ image:
imagePullSecrets: [] imagePullSecrets: []
initImage:
repository: apache/superset
tag: dockerize
pullPolicy: IfNotPresent
service: service:
type: ClusterIP type: ClusterIP
port: 8088 port: 8088
@@ -274,7 +269,7 @@ supersetNode:
command: command:
- "/bin/sh" - "/bin/sh"
- "-c" - "-c"
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; /usr/bin/run-server.sh" - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; exec /usr/bin/run-server.sh"
connections: connections:
# -- Change in case of bringing your own redis and then also set redis.enabled:false # -- Change in case of bringing your own redis and then also set redis.enabled:false
redis_host: "{{ .Release.Name }}-redis-headless" redis_host: "{{ .Release.Name }}-redis-headless"
@@ -288,6 +283,7 @@ supersetNode:
redis_ssl: redis_ssl:
enabled: false enabled: false
ssl_cert_reqs: CERT_NONE ssl_cert_reqs: CERT_NONE
redis_driver: ""
# You need to change below configuration incase bringing own PostgresSQL instance and also set postgresql.enabled:false # You need to change below configuration incase bringing own PostgresSQL instance and also set postgresql.enabled:false
# -- Database type for Superset metadata (Supported types: "postgresql", "mysql") # -- Database type for Superset metadata (Supported types: "postgresql", "mysql")
db_type: "postgresql" db_type: "postgresql"
@@ -303,15 +299,29 @@ supersetNode:
# @default -- a container waiting for postgres # @default -- a container waiting for postgres
initContainers: initContainers:
- name: wait-for-postgres - name: wait-for-postgres
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" imagePullPolicy: "{{ .Values.image.pullPolicy }}"
envFrom: envFrom:
- secretRef: - secretRef:
name: "{{ tpl .Values.envFromSecret . }}" name: "{{ tpl .Values.envFromSecret . }}"
command: command:
- /bin/sh - /bin/bash
- -c - -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s - |
# opening a /dev/tcp fd performs a TCP connect without sending any
# payload (avoids postgres "incomplete startup packet" log noise);
# no external `dockerize`, `nc`, or busybox needed. SECONDS-based
# deadline mirrors the prior `dockerize -timeout 120s` behaviour.
SECONDS=0
until (exec 3<>/dev/tcp/"$DB_HOST"/"$DB_PORT") 2>/dev/null; do
if [ "$SECONDS" -ge 120 ]; then
echo "timeout waiting for postgres at $DB_HOST:$DB_PORT after 120s" >&2
exit 1
fi
echo "waiting for postgres at $DB_HOST:$DB_PORT (elapsed ${SECONDS}s)"
sleep 2
done
echo "postgres at $DB_HOST:$DB_PORT is up"
resources: resources:
limits: limits:
memory: "256Mi" memory: "256Mi"
@@ -325,6 +335,8 @@ supersetNode:
deploymentAnnotations: {} deploymentAnnotations: {}
# -- Labels to be added to supersetNode deployment # -- Labels to be added to supersetNode deployment
deploymentLabels: {} deploymentLabels: {}
# -- Custom pod spec to be added to supersetNode deployment
deploymentAdditionalPodSpec: {}
# -- Affinity to be added to supersetNode deployment # -- Affinity to be added to supersetNode deployment
affinity: {} affinity: {}
# -- TopologySpreadConstrains to be added to supersetNode deployments # -- TopologySpreadConstrains to be added to supersetNode deployments
@@ -360,6 +372,12 @@ supersetNode:
failureThreshold: 3 failureThreshold: 3
periodSeconds: 15 periodSeconds: 15
successThreshold: 1 successThreshold: 1
# -- Container lifecycle hooks, e.g. a preStop sleep so the Service/Ingress
# stops routing to the pod before gunicorn receives SIGTERM
lifecycle: {}
# -- Pod termination grace period (seconds). Set greater than GUNICORN_TIMEOUT so
# in-flight requests can drain before SIGKILL
terminationGracePeriodSeconds: ~
# -- Resource settings for the supersetNode pods - these settings overwrite might existing values from the global resources object defined above. # -- Resource settings for the supersetNode pods - these settings overwrite might existing values from the global resources object defined above.
resources: {} resources: {}
# limits: # limits:
@@ -400,22 +418,38 @@ supersetWorker:
command: command:
- "/bin/sh" - "/bin/sh"
- "-c" - "-c"
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker" - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; exec celery --app=superset.tasks.celery_app:app worker"
# -- If true, forces deployment to reload on each upgrade # -- If true, forces deployment to reload on each upgrade
forceReload: false forceReload: false
# -- Init container # -- Init container
# @default -- a container waiting for postgres and redis # @default -- a container waiting for postgres and redis
initContainers: initContainers:
- name: wait-for-postgres-redis - name: wait-for-postgres-redis
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" imagePullPolicy: "{{ .Values.image.pullPolicy }}"
envFrom: envFrom:
- secretRef: - secretRef:
name: "{{ tpl .Values.envFromSecret . }}" name: "{{ tpl .Values.envFromSecret . }}"
command: command:
- /bin/sh - /bin/bash
- -c - -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s - |
# See supersetNode.initContainers for the rationale.
SECONDS=0
wait_for() {
local host=$1 port=$2 name=$3
until (exec 3<>/dev/tcp/"$host"/"$port") 2>/dev/null; do
if [ "$SECONDS" -ge 120 ]; then
echo "timeout waiting for $name at $host:$port after 120s" >&2
exit 1
fi
echo "waiting for $name at $host:$port (elapsed ${SECONDS}s)"
sleep 2
done
echo "$name at $host:$port is up"
}
wait_for "$DB_HOST" "$DB_PORT" postgres
wait_for "$REDIS_HOST" "$REDIS_PORT" redis
resources: resources:
limits: limits:
memory: "256Mi" memory: "256Mi"
@@ -428,6 +462,8 @@ supersetWorker:
deploymentAnnotations: {} deploymentAnnotations: {}
# -- Labels to be added to supersetWorker deployment # -- Labels to be added to supersetWorker deployment
deploymentLabels: {} deploymentLabels: {}
# -- Custom pod spec to be added to supersetWorker deployment
deploymentAdditionalPodSpec: {}
# -- Affinity to be added to supersetWorker deployment # -- Affinity to be added to supersetWorker deployment
affinity: {} affinity: {}
# -- TopologySpreadConstrains to be added to supersetWorker deployments # -- TopologySpreadConstrains to be added to supersetWorker deployments
@@ -464,6 +500,10 @@ supersetWorker:
failureThreshold: 3 failureThreshold: 3
periodSeconds: 60 periodSeconds: 60
successThreshold: 1 successThreshold: 1
# -- Container lifecycle hooks for the worker pod
lifecycle: {}
# -- Pod termination grace period (seconds) for the worker pod so in-flight tasks can drain before SIGKILL
terminationGracePeriodSeconds: ~
# -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) # -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic)
startupProbe: {} startupProbe: {}
# -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) # -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic)
@@ -488,22 +528,38 @@ supersetCeleryBeat:
command: command:
- "/bin/sh" - "/bin/sh"
- "-c" - "-c"
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid --schedule /tmp/celerybeat-schedule" - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; exec celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid --schedule /tmp/celerybeat-schedule"
# -- If true, forces deployment to reload on each upgrade # -- If true, forces deployment to reload on each upgrade
forceReload: false forceReload: false
# -- List of init containers # -- List of init containers
# @default -- a container waiting for postgres # @default -- a container waiting for postgres
initContainers: initContainers:
- name: wait-for-postgres-redis - name: wait-for-postgres-redis
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" imagePullPolicy: "{{ .Values.image.pullPolicy }}"
envFrom: envFrom:
- secretRef: - secretRef:
name: "{{ tpl .Values.envFromSecret . }}" name: "{{ tpl .Values.envFromSecret . }}"
command: command:
- /bin/sh - /bin/bash
- -c - -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s - |
# See supersetNode.initContainers for the rationale.
SECONDS=0
wait_for() {
local host=$1 port=$2 name=$3
until (exec 3<>/dev/tcp/"$host"/"$port") 2>/dev/null; do
if [ "$SECONDS" -ge 120 ]; then
echo "timeout waiting for $name at $host:$port after 120s" >&2
exit 1
fi
echo "waiting for $name at $host:$port (elapsed ${SECONDS}s)"
sleep 2
done
echo "$name at $host:$port is up"
}
wait_for "$DB_HOST" "$DB_PORT" postgres
wait_for "$REDIS_HOST" "$REDIS_PORT" redis
resources: resources:
limits: limits:
memory: "256Mi" memory: "256Mi"
@@ -514,6 +570,8 @@ supersetCeleryBeat:
extraContainers: [] extraContainers: []
# -- Annotations to be added to supersetCeleryBeat deployment # -- Annotations to be added to supersetCeleryBeat deployment
deploymentAnnotations: {} deploymentAnnotations: {}
# -- Custom pod spec to be added to supersetCeleryBeat deployment
deploymentAdditionalPodSpec: {}
# -- Affinity to be added to supersetCeleryBeat deployment # -- Affinity to be added to supersetCeleryBeat deployment
affinity: {} affinity: {}
# -- TopologySpreadConstrains to be added to supersetCeleryBeat deployments # -- TopologySpreadConstrains to be added to supersetCeleryBeat deployments
@@ -594,15 +652,31 @@ supersetCeleryFlower:
# @default -- a container waiting for postgres and redis # @default -- a container waiting for postgres and redis
initContainers: initContainers:
- name: wait-for-postgres-redis - name: wait-for-postgres-redis
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" imagePullPolicy: "{{ .Values.image.pullPolicy }}"
envFrom: envFrom:
- secretRef: - secretRef:
name: "{{ tpl .Values.envFromSecret . }}" name: "{{ tpl .Values.envFromSecret . }}"
command: command:
- /bin/sh - /bin/bash
- -c - -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s - |
# See supersetNode.initContainers for the rationale.
SECONDS=0
wait_for() {
local host=$1 port=$2 name=$3
until (exec 3<>/dev/tcp/"$host"/"$port") 2>/dev/null; do
if [ "$SECONDS" -ge 120 ]; then
echo "timeout waiting for $name at $host:$port after 120s" >&2
exit 1
fi
echo "waiting for $name at $host:$port (elapsed ${SECONDS}s)"
sleep 2
done
echo "$name at $host:$port is up"
}
wait_for "$DB_HOST" "$DB_PORT" postgres
wait_for "$REDIS_HOST" "$REDIS_PORT" redis
resources: resources:
limits: limits:
memory: "256Mi" memory: "256Mi"
@@ -613,6 +687,8 @@ supersetCeleryFlower:
extraContainers: [] extraContainers: []
# -- Annotations to be added to supersetCeleryFlower deployment # -- Annotations to be added to supersetCeleryFlower deployment
deploymentAnnotations: {} deploymentAnnotations: {}
# -- Custom pod spec to be added to supersetCeleryFlower deployment
deploymentAdditionalPodSpec: {}
# -- Affinity to be added to supersetCeleryFlower deployment # -- Affinity to be added to supersetCeleryFlower deployment
affinity: {} affinity: {}
# -- TopologySpreadConstrains to be added to supersetCeleryFlower deployments # -- TopologySpreadConstrains to be added to supersetCeleryFlower deployments
@@ -690,6 +766,8 @@ supersetWebsockets:
# -- Launch additional containers into supersetWebsockets pods # -- Launch additional containers into supersetWebsockets pods
extraContainers: [] extraContainers: []
deploymentAnnotations: {} deploymentAnnotations: {}
# -- Custom pod spec to be added to supersetWebsockets deployment
deploymentAdditionalPodSpec: {}
# -- Affinity to be added to supersetWebsockets deployment # -- Affinity to be added to supersetWebsockets deployment
affinity: {} affinity: {}
# -- TopologySpreadConstrains to be added to supersetWebsockets deployments # -- TopologySpreadConstrains to be added to supersetWebsockets deployments
@@ -752,6 +830,8 @@ init:
jobAnnotations: jobAnnotations:
"helm.sh/hook": post-install,post-upgrade "helm.sh/hook": post-install,post-upgrade
"helm.sh/hook-delete-policy": "before-hook-creation" "helm.sh/hook-delete-policy": "before-hook-creation"
# -- Custom pod spec to be added to init job
additionalPodSpec: {}
loadExamples: false loadExamples: false
createAdmin: true createAdmin: true
adminUser: adminUser:
@@ -764,15 +844,26 @@ init:
# @default -- a container waiting for postgres # @default -- a container waiting for postgres
initContainers: initContainers:
- name: wait-for-postgres - name: wait-for-postgres
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" imagePullPolicy: "{{ .Values.image.pullPolicy }}"
envFrom: envFrom:
- secretRef: - secretRef:
name: "{{ tpl .Values.envFromSecret . }}" name: "{{ tpl .Values.envFromSecret . }}"
command: command:
- /bin/sh - /bin/bash
- -c - -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s - |
# See supersetNode.initContainers for the rationale.
SECONDS=0
until (exec 3<>/dev/tcp/"$DB_HOST"/"$DB_PORT") 2>/dev/null; do
if [ "$SECONDS" -ge 120 ]; then
echo "timeout waiting for postgres at $DB_HOST:$DB_PORT after 120s" >&2
exit 1
fi
echo "waiting for postgres at $DB_HOST:$DB_PORT (elapsed ${SECONDS}s)"
sleep 2
done
echo "postgres at $DB_HOST:$DB_PORT is up"
resources: resources:
limits: limits:
memory: "256Mi" memory: "256Mi"

View File

@@ -38,14 +38,20 @@ dependencies = [
# no bounds for apache-superset-core until we have a stable version # no bounds for apache-superset-core until we have a stable version
"apache-superset-core", "apache-superset-core",
"backoff>=1.8.0", "backoff>=1.8.0",
# cachetools is used directly by ``superset.db_engine_specs.aws_iam`` (TTLCache).
# It used to be installed transitively via ``google-auth`` (<2.53), but
# ``google-auth`` 2.53+ dropped it, so Superset must declare it
# explicitly to keep fresh ``pip install apache-superset`` working
# without the ``base.txt`` lock file (#40962).
"cachetools>=6.2.1, <7",
"celery>=5.3.6, <6.0.0", "celery>=5.3.6, <6.0.0",
"click>=8.4.0", "click>=8.4.0",
"click-option-group", "click-option-group",
"colorama", "colorama",
"flask-cors>=6.0.0, <7.0", "flask-cors>=6.0.5, <7.0",
"croniter>=0.3.28", "croniter>=6.2.2",
"cron-descriptor", "cron-descriptor",
"cryptography>=42.0.4, <47.0.0", "cryptography>=48.0.0, <49.0.0",
"deprecation>=2.1.0, <2.2.0", "deprecation>=2.1.0, <2.2.0",
"flask>=2.2.5, <4.0.0", "flask>=2.2.5, <4.0.0",
"flask-appbuilder>=5.2.1, <6.0.0", "flask-appbuilder>=5.2.1, <6.0.0",
@@ -53,11 +59,11 @@ dependencies = [
"flask-compress>=1.13, <2.0", "flask-compress>=1.13, <2.0",
"flask-talisman>=1.0.0, <2.0", "flask-talisman>=1.0.0, <2.0",
"flask-login>=0.6.0, < 1.0", "flask-login>=0.6.0, < 1.0",
"flask-migrate>=3.1.0, <5.0", "flask-migrate>=4.1.0, <5.0",
"flask-session>=0.4.0, <1.0", "flask-session>=0.4.0, <1.0",
"flask-wtf>=1.3.0, <2.0", "flask-wtf>=1.3.0, <2.0",
"geopy", "geopy",
"greenlet>=3.0.3, <=3.5.0", "greenlet<=3.5.1, >=3.5.1",
"gunicorn>=25.3.0, <26; sys_platform != 'win32'", "gunicorn>=25.3.0, <26; sys_platform != 'win32'",
"hashids>=1.3.1, <2", "hashids>=1.3.1, <2",
# holidays>=0.45 required for security fix # holidays>=0.45 required for security fix
@@ -67,10 +73,12 @@ dependencies = [
"jsonpath-ng>=1.8.0, <2", "jsonpath-ng>=1.8.0, <2",
"Mako>=1.2.2", "Mako>=1.2.2",
"markdown>=3.10.2", "markdown>=3.10.2",
# marshmallow>=4 has issues: https://github.com/apache/superset/issues/33162 # marshmallow 4 compatibility: see superset/marshmallow_compatibility.py for a
"marshmallow>=3.0, <4", # Flask-AppBuilder workaround. Tracking issue:
# https://github.com/apache/superset/issues/33162
"marshmallow>=3.0, <5",
"marshmallow-union>=0.1", "marshmallow-union>=0.1",
"msgpack>=1.0.0, <1.2", "msgpack>=1.2.0, <1.3",
"nh3>=0.3.5, <0.4", "nh3>=0.3.5, <0.4",
"numpy>1.23.5, <2.3", "numpy>1.23.5, <2.3",
"packaging", "packaging",
@@ -90,17 +98,17 @@ dependencies = [
"python-dotenv", # optional dependencies for Flask but required for Superset, see https://flask.palletsprojects.com/en/stable/installation/#optional-dependencies "python-dotenv", # optional dependencies for Flask but required for Superset, see https://flask.palletsprojects.com/en/stable/installation/#optional-dependencies
"pygeohash", "pygeohash",
"pyarrow>=24.0.0, <25", # before upgrading pyarrow, check that all db dependencies support this, see e.g. https://github.com/apache/superset/pull/34693 "pyarrow>=24.0.0, <25", # before upgrading pyarrow, check that all db dependencies support this, see e.g. https://github.com/apache/superset/pull/34693
"pyyaml>=6.0.0, <7.0.0", "pyyaml>=6.0.3, <7.0.0",
"PyJWT>=2.4.0, <3.0", "PyJWT>=2.4.0, <3.0",
"redis>=5.0.0, <6.0", "redis>=5.0.0, <6.0",
"rison>=2.0.0, <3.0", "rison>=2.0.0, <3.0",
"selenium>=4.44.0, <5.0", "selenium>=4.44.0, <5.0",
"shillelagh[gsheetsapi]>=1.4.4, <2.0", "shillelagh[gsheetsapi]>=1.4.4, <2.0",
"sshtunnel>=0.4.0, <0.5", "sshtunnel>=0.4.0, <0.5",
"simplejson>=3.15.0", "simplejson>=4.1.1",
"slack_sdk>=3.19.0, <4", "slack_sdk>=3.19.0, <4",
"sqlalchemy>=1.4, <2", "sqlalchemy>=1.4, <2",
"sqlalchemy-utils>=0.38.0, <0.43", # expanding lowerbound to work with pydoris "sqlalchemy-utils>=0.42.1, <0.43", # expanding lowerbound to work with pydoris
"sqlglot>=30.8.0, <31", "sqlglot>=30.8.0, <31",
# newer pandas needs 0.9+ # newer pandas needs 0.9+
"tabulate>=0.10.0, <1.0", "tabulate>=0.10.0, <1.0",
@@ -139,12 +147,12 @@ denodo = ["denodo-sqlalchemy>=2.0.5,<2.1.0"]
dremio = ["sqlalchemy-dremio>=1.2.1, <4"] dremio = ["sqlalchemy-dremio>=1.2.1, <4"]
drill = ["sqlalchemy-drill>=1.1.10, <2"] drill = ["sqlalchemy-drill>=1.1.10, <2"]
druid = ["pydruid>=0.6.5,<0.7"] druid = ["pydruid>=0.6.5,<0.7"]
duckdb = ["duckdb>=1.5.2,<2", "duckdb-engine>=0.17.0"] duckdb = ["duckdb>=1.5.4,<2", "duckdb-engine>=0.17.0"]
dynamodb = ["pydynamodb>=0.4.2"] dynamodb = ["pydynamodb>=0.4.2"]
solr = ["sqlalchemy-solr >= 0.2.0"] solr = ["sqlalchemy-solr >= 0.2.4.3"]
elasticsearch = ["elasticsearch-dbapi>=0.2.13, <0.3.0"] elasticsearch = ["elasticsearch-dbapi>=0.2.13, <0.3.0"]
exasol = ["sqlalchemy-exasol>=2.4.0, <8.0"] exasol = ["sqlalchemy-exasol>=2.4.0, <8.0"]
excel = ["xlrd>=1.2.0, <1.3"] excel = ["xlrd>=2.0.2, <2.1"]
fastmcp = [ fastmcp = [
"fastmcp>=3.2.4,<4.0", "fastmcp>=3.2.4,<4.0",
# tiktoken backs the response-size-guard token estimator. Without # tiktoken backs the response-size-guard token estimator. Without
@@ -156,7 +164,7 @@ firebird = ["sqlalchemy-firebird>=0.7.0, <2.2"]
firebolt = ["firebolt-sqlalchemy>=1.0.0, <2"] firebolt = ["firebolt-sqlalchemy>=1.0.0, <2"]
gevent = ["gevent>=26.4.0"] gevent = ["gevent>=26.4.0"]
gsheets = ["shillelagh[gsheetsapi]>=1.4.4, <2"] gsheets = ["shillelagh[gsheetsapi]>=1.4.4, <2"]
hana = ["hdbcli==2.28.20", "sqlalchemy_hana==0.4.0"] hana = ["hdbcli==2.28.21", "sqlalchemy_hana==0.4.0"]
hive = [ hive = [
"pyhive[hive]>=0.6.5;python_version<'3.11'", "pyhive[hive]>=0.6.5;python_version<'3.11'",
"pyhive[hive_pure_sasl]>=0.7.0", "pyhive[hive_pure_sasl]>=0.7.0",
@@ -173,17 +181,17 @@ motherduck = ["apache-superset[duckdb]"]
mysql = ["mysqlclient>=2.1.0, <3"] mysql = ["mysqlclient>=2.1.0, <3"]
ocient = [ ocient = [
"sqlalchemy-ocient>=1.0.0", "sqlalchemy-ocient>=1.0.0",
"pyocient>=1.0.15, <2", "pyocient>=1.0.15, <4",
"shapely", "shapely",
"geojson", "geojson",
] ]
oracle = ["cx-Oracle>8.0.0, <8.4"] oracle = ["oracledb>=2.0.0, <5"]
parseable = ["sqlalchemy-parseable>=0.1.3,<0.2.0"] parseable = ["sqlalchemy-parseable>=0.1.3,<0.2.0"]
pinot = ["pinotdb>=5.0.0, <10.0.0"] pinot = ["pinotdb>=5.0.0, <10.0.0"]
playwright = ["playwright>=1.60.0, <2"] playwright = ["playwright>=1.60.0, <2"]
postgres = ["psycopg2-binary==2.9.12"] postgres = ["psycopg2-binary==2.9.12"]
presto = ["pyhive[presto]>=0.6.5"] presto = ["pyhive[presto]>=0.6.5"]
trino = ["trino>=0.328.0"] trino = ["trino>=0.337.0"]
prophet = ["prophet>=1.1.6, <2"] prophet = ["prophet>=1.1.6, <2"]
redshift = ["sqlalchemy-redshift>=0.8.1, <0.9"] redshift = ["sqlalchemy-redshift>=0.8.1, <0.9"]
risingwave = ["sqlalchemy-risingwave"] risingwave = ["sqlalchemy-risingwave"]
@@ -198,7 +206,7 @@ spark = [
"thrift>=0.23.0, <1", "thrift>=0.23.0, <1",
] ]
tdengine = [ tdengine = [
"taospy>=2.7.21", "taospy>=2.8.9",
"taos-ws-py>=0.6.9" "taos-ws-py>=0.6.9"
] ]
teradata = ["teradatasql>=16.20.0.23"] teradata = ["teradatasql>=16.20.0.23"]
@@ -208,7 +216,7 @@ netezza = ["nzalchemy>=11.0.2"]
starrocks = ["starrocks>=1.3.3, <2"] starrocks = ["starrocks>=1.3.3, <2"]
doris = ["pydoris>=1.0.0, <2.0.0"] doris = ["pydoris>=1.0.0, <2.0.0"]
oceanbase = ["oceanbase_py>=0.0.1.2"] oceanbase = ["oceanbase_py>=0.0.1.2"]
ydb = ["ydb-sqlalchemy>=0.1.2", "ydb-sqlglot-plugin>=0.2.5"] ydb = ["ydb-sqlalchemy>=0.1.22", "ydb-sqlglot-plugin>=0.2.5"]
development = [ development = [
# no bounds for apache-superset-extensions-cli until a stable version # no bounds for apache-superset-extensions-cli until a stable version
"apache-superset-extensions-cli", "apache-superset-extensions-cli",
@@ -216,7 +224,7 @@ development = [
"docker", "docker",
"flask-testing", "flask-testing",
"freezegun", "freezegun",
"grpcio>=1.55.3", "grpcio>=1.81.1",
"openapi-spec-validator", "openapi-spec-validator",
"parameterized", "parameterized",
"pip", "pip",
@@ -367,7 +375,6 @@ select = [
ignore = [ ignore = [
"S101", "S101",
"PT004", # Fixtures that don't return values - underscore prefix conflicts with pytest usage
"PT006", "PT006",
"T201", "T201",
"N999", "N999",

View File

@@ -18,5 +18,30 @@
testpaths = testpaths =
tests tests
python_files = *_test.py test_*.py *_tests.py *viz/utils.py python_files = *_test.py test_*.py *_tests.py *viz/utils.py
addopts = -p no:warnings # `-p no:warnings` temporarily disabled in favor of more finely tuned `filterwarnings`.
#addopts = -p no:warnings
asyncio_mode = auto asyncio_mode = auto
# `ignore` is effectively equivalent to `-p no:warnings`.
# Always print RemovedIn20Warning when SQLALCHEMY_WARN_20=1.
# Additionally, raise errors for refactored RemovedIn20Warning cases to prevent regression.
filterwarnings =
ignore
always::sqlalchemy.exc.RemovedIn20Warning
error:Passing a string to Connection.execute\(\) is deprecated:sqlalchemy.exc.RemovedIn20Warning
# error:"Query" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
# error:"SavedQuery" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
# error:"SqlaTable" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
# error:"SqlMetric" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
# error:"TableColumn" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
# error:"TaggedObject" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
# error:The ``as_declarative\(\)`` function is now available:sqlalchemy.exc.RemovedIn20Warning
# error:The autoload parameter is deprecated:sqlalchemy.exc.RemovedIn20Warning
# error:The connection.execute\(\) method:sqlalchemy.exc.RemovedIn20Warning
# error:The current statement is being autocommitted using implicit autocommit:sqlalchemy.exc.RemovedIn20Warning
# error:The `database` package is deprecated:sqlalchemy.exc.RemovedIn20Warning
# error:The ``declarative_base\(\)`` function is now available:sqlalchemy.exc.RemovedIn20Warning
# error:The Engine.execute\(\) method is considered legacy:sqlalchemy.exc.RemovedIn20Warning
error:The legacy calling style of select\(\) is deprecated:sqlalchemy.exc.RemovedIn20Warning
error:The "whens" argument to case:sqlalchemy.exc.RemovedIn20Warning
# error:"User" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning

View File

@@ -26,7 +26,7 @@ filelock>=3.20.3,<4.0.0
brotli>=1.2.0,<2.0.0 brotli>=1.2.0,<2.0.0
numexpr>=2.9.0 numexpr>=2.9.0
# Security: CVE-2026-34073 (MEDIUM) - Improper Certificate Validation # Security: CVE-2026-34073 (MEDIUM) - Improper Certificate Validation
cryptography>=46.0.7,<47.0.0 cryptography>=48.0.0,<49.0.0
# Security: Snyk - XSS vulnerability in Mako templates # Security: Snyk - XSS vulnerability in Mako templates
mako>=1.3.11,<2.0.0 mako>=1.3.11,<2.0.0
# Security: CVE-2024-52338 (CRITICAL) - Deserialization of untrusted data in IPC/Parquet readers # Security: CVE-2024-52338 (CRITICAL) - Deserialization of untrusted data in IPC/Parquet readers
@@ -44,11 +44,10 @@ async_timeout>=4.0.0,<5.0.0
# a bit of attention to bump. # a bit of attention to bump.
apispec>=6.0.0,<6.7.0 apispec>=6.0.0,<6.7.0
# 1.4.1 appears to use much more memory, where the python test suite runs out of memory # 1.4.1 introduced a memory regression that exhausts memory in the test suite
# causing CI to fail. 1.4.0 is the last version that works. # (https://github.com/marshmallow-code/marshmallow-sqlalchemy/issues/665). 1.4.2
# https://marshmallow-sqlalchemy.readthedocs.io/en/latest/changelog.html#id3 # claimed a fix but did not address the root cause; only 1.5.0 actually fixes it.
# Opened this issue https://github.com/marshmallow-code/marshmallow-sqlalchemy/issues/665 marshmallow-sqlalchemy>=1.5.0
marshmallow-sqlalchemy>=1.3.0,<1.4.1
# needed for python 3.12 support # needed for python 3.12 support
openapi-schema-validator>=0.6.3 openapi-schema-validator>=0.6.3
@@ -58,3 +57,9 @@ openapi-schema-validator>=0.6.3
# Known affected packages: Preset's 'clients' package # Known affected packages: Preset's 'clients' package
# See docs/docs/contributing/pkg-resources-migration.md for details # See docs/docs/contributing/pkg-resources-migration.md for details
setuptools<81 setuptools<81
# google-auth 2.53+ dropped its transitive dependency on cachetools, which is
# imported directly by superset.db_engine_specs.aws_iam. We declare cachetools
# explicitly in pyproject.toml and pin google-auth to the post-drop range so
# the install path is internally consistent (#40962).
google-auth>=2.53.0,<3.0.0

View File

@@ -45,7 +45,7 @@ cachelib==0.13.0
# flask-caching # flask-caching
# flask-session # flask-session
cachetools==6.2.1 cachetools==6.2.1
# via google-auth # via apache-superset (pyproject.toml)
cattrs==25.1.1 cattrs==25.1.1
# via requests-cache # via requests-cache
celery==5.5.2 celery==5.5.2
@@ -84,12 +84,13 @@ colorama==0.4.6
# flask-appbuilder # flask-appbuilder
cron-descriptor==1.4.5 cron-descriptor==1.4.5
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
croniter==6.0.0 croniter==6.2.2
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
cryptography==46.0.7 cryptography==48.0.1
# via # via
# -r requirements/base.in # -r requirements/base.in
# apache-superset (pyproject.toml) # apache-superset (pyproject.toml)
# google-auth
# paramiko # paramiko
# pyopenssl # pyopenssl
defusedxml==0.7.1 defusedxml==0.7.1
@@ -131,7 +132,7 @@ flask-caching==2.3.1
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
flask-compress==1.17 flask-compress==1.17
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
flask-cors==6.0.2 flask-cors==6.0.5
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
flask-jwt-extended==4.7.1 flask-jwt-extended==4.7.1
# via flask-appbuilder # via flask-appbuilder
@@ -141,7 +142,7 @@ flask-login==0.6.3
# via # via
# apache-superset (pyproject.toml) # apache-superset (pyproject.toml)
# flask-appbuilder # flask-appbuilder
flask-migrate==3.1.0 flask-migrate==4.1.0
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
flask-session==0.8.0 flask-session==0.8.0
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
@@ -159,9 +160,11 @@ geographiclib==2.0
# via geopy # via geopy
geopy==2.4.1 geopy==2.4.1
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
google-auth==2.43.0 google-auth==2.53.0
# via shillelagh # via
greenlet==3.5.0 # -r requirements/base.in
# shillelagh
greenlet==3.5.1
# via # via
# apache-superset (pyproject.toml) # apache-superset (pyproject.toml)
# shillelagh # shillelagh
@@ -223,13 +226,13 @@ markupsafe==3.0.2
# mako # mako
# werkzeug # werkzeug
# wtforms # wtforms
marshmallow==3.26.2 marshmallow==4.3.0
# via # via
# apache-superset (pyproject.toml) # apache-superset (pyproject.toml)
# flask-appbuilder # flask-appbuilder
# marshmallow-sqlalchemy # marshmallow-sqlalchemy
# marshmallow-union # marshmallow-union
marshmallow-sqlalchemy==1.4.0 marshmallow-sqlalchemy==1.5.0
# via # via
# -r requirements/base.in # -r requirements/base.in
# flask-appbuilder # flask-appbuilder
@@ -237,7 +240,7 @@ marshmallow-union==0.1.15
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
mdurl==0.1.2 mdurl==0.1.2
# via markdown-it-py # via markdown-it-py
msgpack==1.0.8 msgpack==1.2.1
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
msgspec==0.19.0 msgspec==0.19.0
# via flask-session # via flask-session
@@ -270,7 +273,6 @@ packaging==25.0
# deprecation # deprecation
# gunicorn # gunicorn
# limits # limits
# marshmallow
# shillelagh # shillelagh
pandas==2.1.4 pandas==2.1.4
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
@@ -298,9 +300,7 @@ pyarrow==24.0.0
# apache-superset (pyproject.toml) # apache-superset (pyproject.toml)
# apache-superset-core # apache-superset-core
pyasn1==0.6.3 pyasn1==0.6.3
# via # via pyasn1-modules
# pyasn1-modules
# rsa
pyasn1-modules==0.4.2 pyasn1-modules==0.4.2
# via google-auth # via google-auth
pycparser==2.22 pycparser==2.22
@@ -315,7 +315,7 @@ pygeohash==3.2.2
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
pygments==2.20.0 pygments==2.20.0
# via rich # via rich
pyjwt==2.12.0 pyjwt==2.13.0
# via # via
# apache-superset (pyproject.toml) # apache-superset (pyproject.toml)
# flask-appbuilder # flask-appbuilder
@@ -323,7 +323,7 @@ pyjwt==2.12.0
# redis # redis
pynacl==1.6.2 pynacl==1.6.2
# via paramiko # via paramiko
pyopenssl==26.0.0 pyopenssl==26.2.0
# via # via
# -r requirements/base.in # -r requirements/base.in
# shillelagh # shillelagh
@@ -344,12 +344,11 @@ python-dotenv==1.2.2
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
pytz==2025.2 pytz==2025.2
# via # via
# croniter
# flask-babel # flask-babel
# pandas # pandas
pyxlsb==1.0.10 pyxlsb==1.0.10
# via pandas # via pandas
pyyaml==6.0.2 pyyaml==6.0.3
# via # via
# apache-superset (pyproject.toml) # apache-superset (pyproject.toml)
# apispec # apispec
@@ -376,15 +375,13 @@ rpds-py==0.25.0
# via # via
# jsonschema # jsonschema
# referencing # referencing
rsa==4.9.1
# via google-auth
selenium==4.44.0 selenium==4.44.0
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
setuptools==80.9.0 setuptools==80.9.0
# via -r requirements/base.in # via -r requirements/base.in
shillelagh==1.4.4 shillelagh==1.4.4
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
simplejson==3.20.1 simplejson==4.1.1
# via apache-superset (pyproject.toml) # via apache-superset (pyproject.toml)
six==1.17.0 six==1.17.0
# via # via
@@ -408,7 +405,7 @@ sqlalchemy==1.4.54
# marshmallow-sqlalchemy # marshmallow-sqlalchemy
# shillelagh # shillelagh
# sqlalchemy-utils # sqlalchemy-utils
sqlalchemy-utils==0.42.0 sqlalchemy-utils==0.42.1
# via # via
# apache-superset (pyproject.toml) # apache-superset (pyproject.toml)
# apache-superset-core # apache-superset-core

View File

@@ -100,7 +100,7 @@ cachelib==0.13.0
cachetools==6.2.1 cachetools==6.2.1
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# google-auth # apache-superset
# py-key-value-aio # py-key-value-aio
caio==0.9.25 caio==0.9.25
# via aiofile # via aiofile
@@ -174,15 +174,16 @@ cron-descriptor==1.4.5
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
croniter==6.0.0 croniter==6.2.2
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
cryptography==46.0.7 cryptography==48.0.1
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
# authlib # authlib
# google-auth
# paramiko # paramiko
# pyjwt # pyjwt
# pyopenssl # pyopenssl
@@ -219,7 +220,7 @@ docstring-parser==0.17.0
# via cyclopts # via cyclopts
docutils==0.22.2 docutils==0.22.2
# via rich-rst # via rich-rst
duckdb==1.5.3 duckdb==1.5.4
# via # via
# apache-superset # apache-superset
# duckdb-engine # duckdb-engine
@@ -276,7 +277,7 @@ flask-compress==1.17
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
flask-cors==6.0.2 flask-cors==6.0.5
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
@@ -293,7 +294,7 @@ flask-login==0.6.3
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
# flask-appbuilder # flask-appbuilder
flask-migrate==3.1.0 flask-migrate==4.1.0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
@@ -340,7 +341,7 @@ google-api-core==2.23.0
# google-cloud-core # google-cloud-core
# pandas-gbq # pandas-gbq
# sqlalchemy-bigquery # sqlalchemy-bigquery
google-auth==2.43.0 google-auth==2.53.0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# google-api-core # google-api-core
@@ -373,7 +374,7 @@ googleapis-common-protos==1.66.0
# via # via
# google-api-core # google-api-core
# grpcio-status # grpcio-status
greenlet==3.5.0 greenlet==3.5.1
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
@@ -382,7 +383,7 @@ greenlet==3.5.0
# sqlalchemy # sqlalchemy
griffelib==2.0.2 griffelib==2.0.2
# via fastmcp # via fastmcp
grpcio==1.71.0 grpcio==1.81.1
# via # via
# apache-superset # apache-superset
# google-api-core # google-api-core
@@ -507,6 +508,8 @@ limits==5.1.0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# flask-limiter # flask-limiter
lz4==4.4.5
# via trino
mako==1.3.12 mako==1.3.12
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
@@ -527,14 +530,14 @@ markupsafe==3.0.2
# mako # mako
# werkzeug # werkzeug
# wtforms # wtforms
marshmallow==3.26.2 marshmallow==4.3.0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
# flask-appbuilder # flask-appbuilder
# marshmallow-sqlalchemy # marshmallow-sqlalchemy
# marshmallow-union # marshmallow-union
marshmallow-sqlalchemy==1.4.0 marshmallow-sqlalchemy==1.5.0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# flask-appbuilder # flask-appbuilder
@@ -556,7 +559,7 @@ more-itertools==10.8.0
# via # via
# jaraco-classes # jaraco-classes
# jaraco-functools # jaraco-functools
msgpack==1.0.8 msgpack==1.2.1
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
@@ -608,6 +611,8 @@ ordered-set==4.1.0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# flask-limiter # flask-limiter
orjson==3.11.9
# via trino
outcome==1.3.0.post0 outcome==1.3.0.post0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
@@ -626,7 +631,6 @@ packaging==25.0
# google-cloud-bigquery # google-cloud-bigquery
# gunicorn # gunicorn
# limits # limits
# marshmallow
# matplotlib # matplotlib
# pytest # pytest
# shillelagh # shillelagh
@@ -723,7 +727,6 @@ pyasn1==0.6.3
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# pyasn1-modules # pyasn1-modules
# python-ldap # python-ldap
# rsa
pyasn1-modules==0.4.2 pyasn1-modules==0.4.2
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
@@ -766,7 +769,7 @@ pyhive==0.7.0
# via apache-superset # via apache-superset
pyinstrument==5.1.2 pyinstrument==5.1.2
# via apache-superset # via apache-superset
pyjwt==2.12.0 pyjwt==2.13.0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
@@ -780,7 +783,7 @@ pynacl==1.6.2
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# paramiko # paramiko
pyopenssl==26.0.0 pyopenssl==26.2.0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# shillelagh # shillelagh
@@ -841,7 +844,6 @@ python-multipart==0.0.29
pytz==2025.2 pytz==2025.2
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# croniter
# flask-babel # flask-babel
# pandas # pandas
# trino # trino
@@ -849,7 +851,7 @@ pyxlsb==1.0.10
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# pandas # pandas
pyyaml==6.0.2 pyyaml==6.0.3
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
@@ -911,10 +913,6 @@ rpds-py==0.25.0
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# jsonschema # jsonschema
# referencing # referencing
rsa==4.9.1
# via
# -c requirements/base-constraint.txt
# google-auth
ruff==0.9.7 ruff==0.9.7
# via apache-superset # via apache-superset
s3transfer==0.16.0 s3transfer==0.16.0
@@ -939,7 +937,7 @@ shillelagh==1.4.4
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
simplejson==3.20.1 simplejson==4.1.1
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
@@ -978,7 +976,7 @@ sqlalchemy==1.4.54
# sqlalchemy-utils # sqlalchemy-utils
sqlalchemy-bigquery==1.17.0 sqlalchemy-bigquery==1.17.0
# via apache-superset # via apache-superset
sqlalchemy-utils==0.42.0 sqlalchemy-utils==0.42.1
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# apache-superset # apache-superset
@@ -1017,7 +1015,7 @@ tqdm==4.67.1
# via # via
# cmdstanpy # cmdstanpy
# prophet # prophet
trino==0.330.0 trino==0.337.0
# via apache-superset # via apache-superset
trio==0.33.0 trio==0.33.0
# via # via
@@ -1037,6 +1035,7 @@ typing-extensions==4.15.0
# apache-superset-core # apache-superset-core
# cattrs # cattrs
# exceptiongroup # exceptiongroup
# grpcio
# limits # limits
# mcp # mcp
# opentelemetry-api # opentelemetry-api
@@ -1151,3 +1150,4 @@ zstandard==0.23.0
# via # via
# -c requirements/base-constraint.txt # -c requirements/base-constraint.txt
# flask-compress # flask-compress
# trino

View File

@@ -30,7 +30,7 @@ from flask import current_app
from flask_appbuilder import Model from flask_appbuilder import Model
from flask_migrate import downgrade, upgrade from flask_migrate import downgrade, upgrade
from progress.bar import ChargingBar from progress.bar import ChargingBar
from sqlalchemy import create_engine, inspect from sqlalchemy import create_engine, inspect, text
from sqlalchemy.ext.automap import automap_base from sqlalchemy.ext.automap import automap_base
from superset import db from superset import db
@@ -154,7 +154,7 @@ def main( # noqa: C901
print(f"Migration goes from {down_revision} to {revision}") print(f"Migration goes from {down_revision} to {revision}")
current_revision = db.engine.execute( current_revision = db.engine.execute(
"SELECT version_num FROM alembic_version" text("SELECT version_num FROM alembic_version")
).scalar() ).scalar()
print(f"Current version of the DB is {current_revision}") print(f"Current version of the DB is {current_revision}")

View File

@@ -106,6 +106,7 @@ LANGUAGE_NAMES: dict[str, str] = {
"ru": "Russian", "ru": "Russian",
"sk": "Slovak", "sk": "Slovak",
"sl": "Slovenian", "sl": "Slovenian",
"sr": "Serbian",
"tr": "Turkish", "tr": "Turkish",
"uk": "Ukrainian", "uk": "Ukrainian",
"zh": "Chinese (Simplified)", "zh": "Chinese (Simplified)",

View File

@@ -86,7 +86,19 @@ def build_index(translations_dir: Path) -> dict[str, Any]:
for lang in langs: for lang in langs:
po_path = translations_dir / lang / "LC_MESSAGES" / "messages.po" po_path = translations_dir / lang / "LC_MESSAGES" / "messages.po"
cat = polib.pofile(str(po_path)) try:
cat = polib.pofile(str(po_path))
except (OSError, UnicodeDecodeError) as exc:
# A single malformed catalog shouldn't block backfilling every
# other language. polib raises OSError on syntax errors (e.g. an
# unescaped quote) and UnicodeDecodeError on bad encoding; skip
# either with a loud warning so the corrupt file gets fixed
# separately.
print(
f"WARNING: skipping {lang} — could not parse {po_path}: {exc}",
file=sys.stderr,
)
continue
for entry in cat: for entry in cat:
if not entry.msgid: if not entry.msgid:
continue # skip header entry continue # skip header entry

View File

@@ -1 +0,0 @@
v24.16.0

View File

@@ -0,0 +1 @@
../superset-frontend/.nvmrc

View File

@@ -32,6 +32,7 @@ and therefore are not easily unit-testable. We have instead opted to test the sd
This way, the tests can assert that the sdk actually mounts the iframe and communicates with it correctly. This way, the tests can assert that the sdk actually mounts the iframe and communicates with it correctly.
At time of writing, these tests are not written yet, because we haven't yet put together the demo app that they will leverage. At time of writing, these tests are not written yet, because we haven't yet put together the demo app that they will leverage.
### Things to e2e test once we have a demo app: ### Things to e2e test once we have a demo app:
**happy path:** **happy path:**

View File

@@ -41,12 +41,12 @@ npm install --save @superset-ui/embedded-sdk
``` ```
```js ```js
import { embedDashboard } from '@superset-ui/embedded-sdk'; import { embedDashboard } from "@superset-ui/embedded-sdk";
embedDashboard({ embedDashboard({
id: 'abc123', // given by the Superset embedding UI id: "abc123", // given by the Superset embedding UI
supersetDomain: 'https://superset.example.com', supersetDomain: "https://superset.example.com",
mountPoint: document.getElementById('my-superset-container'), // any html element that can contain an iframe mountPoint: document.getElementById("my-superset-container"), // any html element that can contain an iframe
fetchGuestToken: () => fetchGuestTokenFromBackend(), fetchGuestToken: () => fetchGuestTokenFromBackend(),
dashboardUiConfig: { dashboardUiConfig: {
// dashboard UI config: hideTitle, hideTab, hideChartControls, filters.visible, filters.expanded (optional), urlParams (optional) // dashboard UI config: hideTitle, hideTab, hideChartControls, filters.visible, filters.expanded (optional), urlParams (optional)
@@ -55,21 +55,21 @@ embedDashboard({
expanded: true, expanded: true,
}, },
urlParams: { urlParams: {
foo: 'value1', foo: "value1",
bar: 'value2', bar: "value2",
// themeMode: 'dark', // set the initial theme: 'dark' | 'system' | 'default' (default: 'default') // themeMode: 'dark', // set the initial theme: 'dark' | 'system' | 'default' (default: 'default')
// ... // ...
}, },
}, },
// optional additional iframe sandbox attributes // optional additional iframe sandbox attributes
iframeSandboxExtras: [ iframeSandboxExtras: [
'allow-top-navigation', "allow-top-navigation",
'allow-popups-to-escape-sandbox', "allow-popups-to-escape-sandbox",
], ],
// optional Permissions Policy features // optional Permissions Policy features
iframeAllowExtras: ['clipboard-write', 'fullscreen'], iframeAllowExtras: ["clipboard-write", "fullscreen"],
// optional config to enforce a particular referrerPolicy // optional config to enforce a particular referrerPolicy
referrerPolicy: 'same-origin', referrerPolicy: "same-origin",
// optional callback to customize permalink URLs // optional callback to customize permalink URLs
resolvePermalinkUrl: ({ key }) => `https://my-app.com/analytics/share/${key}`, resolvePermalinkUrl: ({ key }) => `https://my-app.com/analytics/share/${key}`,
}); });
@@ -163,13 +163,13 @@ Use the `themeMode` URL parameter to control the embedded dashboard's initial co
```js ```js
embedDashboard({ embedDashboard({
id: 'abc123', id: "abc123",
supersetDomain: 'https://superset.example.com', supersetDomain: "https://superset.example.com",
mountPoint: document.getElementById('my-superset-container'), mountPoint: document.getElementById("my-superset-container"),
fetchGuestToken: () => fetchGuestTokenFromBackend(), fetchGuestToken: () => fetchGuestTokenFromBackend(),
dashboardUiConfig: { dashboardUiConfig: {
urlParams: { urlParams: {
themeMode: 'dark', // 'dark' | 'system' | 'default' (default: 'default') themeMode: "dark", // 'dark' | 'system' | 'default' (default: 'default')
}, },
}, },
}); });
@@ -193,7 +193,7 @@ To pass additional sandbox attributes you can use `iframeSandboxExtras`:
```js ```js
// optional additional iframe sandbox attributes // optional additional iframe sandbox attributes
iframeSandboxExtras: ['allow-top-navigation', 'allow-popups-to-escape-sandbox']; iframeSandboxExtras: ["allow-top-navigation", "allow-popups-to-escape-sandbox"];
``` ```
### Permissions Policy ### Permissions Policy
@@ -202,7 +202,7 @@ To enable specific browser features within the embedded iframe, use `iframeAllow
```js ```js
// optional Permissions Policy features // optional Permissions Policy features
iframeAllowExtras: ['clipboard-write', 'fullscreen']; iframeAllowExtras: ["clipboard-write", "fullscreen"];
``` ```
Common permissions you might need: Common permissions you might need:
@@ -225,9 +225,9 @@ When users click share buttons inside an embedded dashboard, Superset generates
```js ```js
embedDashboard({ embedDashboard({
id: 'abc123', id: "abc123",
supersetDomain: 'https://superset.example.com', supersetDomain: "https://superset.example.com",
mountPoint: document.getElementById('my-superset-container'), mountPoint: document.getElementById("my-superset-container"),
fetchGuestToken: () => fetchGuestTokenFromBackend(), fetchGuestToken: () => fetchGuestTokenFromBackend(),
// Customize permalink URLs // Customize permalink URLs
@@ -245,9 +245,9 @@ To restore the dashboard state from a permalink in your app:
const permalinkKey = routeParams.key; const permalinkKey = routeParams.key;
embedDashboard({ embedDashboard({
id: 'abc123', id: "abc123",
supersetDomain: 'https://superset.example.com', supersetDomain: "https://superset.example.com",
mountPoint: document.getElementById('my-superset-container'), mountPoint: document.getElementById("my-superset-container"),
fetchGuestToken: () => fetchGuestTokenFromBackend(), fetchGuestToken: () => fetchGuestTokenFromBackend(),
resolvePermalinkUrl: ({ key }) => `https://my-app.com/analytics/share/${key}`, resolvePermalinkUrl: ({ key }) => `https://my-app.com/analytics/share/${key}`,
dashboardUiConfig: { dashboardUiConfig: {

View File

@@ -18,9 +18,6 @@
*/ */
module.exports = { module.exports = {
presets: [ presets: ["@babel/preset-typescript", "@babel/preset-env"],
"@babel/preset-typescript",
"@babel/preset-env"
],
sourceMaps: true, sourceMaps: true,
}; };

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "@superset-ui/embedded-sdk", "name": "@superset-ui/embedded-sdk",
"version": "0.3.0", "version": "0.4.0",
"description": "SDK for embedding resources from Superset into your own application", "description": "SDK for embedding resources from Superset into your own application",
"access": "public", "access": "public",
"keywords": [ "keywords": [
@@ -24,7 +24,7 @@
"scripts": { "scripts": {
"build": "tsc && babel src --out-dir lib --extensions '.ts,.tsx' && webpack --mode production", "build": "tsc && babel src --out-dir lib --extensions '.ts,.tsx' && webpack --mode production",
"ci:release": "node ./release-if-necessary.js", "ci:release": "node ./release-if-necessary.js",
"test": "jest" "test": "vitest --run --dir src"
}, },
"browserslist": [ "browserslist": [
"last 3 chrome versions", "last 3 chrome versions",
@@ -41,12 +41,11 @@
"@babel/core": "^7.25.2", "@babel/core": "^7.25.2",
"@babel/preset-env": "^7.25.4", "@babel/preset-env": "^7.25.4",
"@babel/preset-typescript": "^7.24.7", "@babel/preset-typescript": "^7.24.7",
"@types/jest": "^29.5.12", "@types/node": "^25.4.0",
"@types/node": "^22.5.4",
"babel-loader": "^9.1.3", "babel-loader": "^9.1.3",
"jest": "^29.7.0",
"tscw-config": "^1.1.2", "tscw-config": "^1.1.2",
"typescript": "^5.6.2", "typescript": "^5.9.3",
"vitest": "^4.0.18",
"webpack": "^5.94.0", "webpack": "^5.94.0",
"webpack-cli": "^5.1.4" "webpack-cli": "^5.1.4"
}, },

View File

@@ -17,15 +17,15 @@
* under the License. * under the License.
*/ */
const { execSync } = require('child_process'); const { execSync } = require("child_process");
const { name, version } = require('./package.json'); const { name, version } = require("./package.json");
function log(...args) { function log(...args) {
console.log('[embedded-sdk-release]', ...args); console.log("[embedded-sdk-release]", ...args);
} }
function logError(...args) { function logError(...args) {
console.error('[embedded-sdk-release]', ...args); console.error("[embedded-sdk-release]", ...args);
} }
(async () => { (async () => {
@@ -38,17 +38,21 @@ function logError(...args) {
const { status } = await fetch(packageUrl); const { status } = await fetch(packageUrl);
if (status === 200) { if (status === 200) {
log('version already exists on npm, exiting'); log("version already exists on npm, exiting");
} else if (status === 404) { } else if (status === 404) {
log('release required, building'); log("release required, building");
try { try {
execSync('npm run build', { stdio: 'pipe' }); execSync("npm run build", { stdio: "pipe" });
log('build successful, publishing') log("build successful, publishing");
execSync('npm publish --access public', { stdio: 'pipe' }); execSync("npm publish --access public", { stdio: "pipe" });
log(`published ${version} to npm`); log(`published ${version} to npm`);
} catch (err) { } catch (err) {
console.error(String(err.stdout)); // npm writes failure details to stderr (auth/permission/registry
logError('Encountered an error, details should be above'); // errors in particular), so surface both streams to avoid masking
// the real cause in CI logs.
if (err.stdout) console.error(String(err.stdout));
if (err.stderr) console.error(String(err.stderr));
logError("Encountered an error, details should be above");
process.exitCode = 1; process.exitCode = 1;
} }
} else { } else {

View File

@@ -18,7 +18,9 @@
*/ */
export const IFRAME_COMMS_MESSAGE_TYPE = "__embedded_comms__"; export const IFRAME_COMMS_MESSAGE_TYPE = "__embedded_comms__";
export const DASHBOARD_UI_FILTER_CONFIG_URL_PARAM_KEY: { [index: string]: any } = { export const DASHBOARD_UI_FILTER_CONFIG_URL_PARAM_KEY: {
[index: string]: any;
} = {
visible: "show_filters", visible: "show_filters",
expanded: "expand_filters", expanded: "expand_filters",
} };

View File

@@ -24,22 +24,23 @@ import {
DEFAULT_TOKEN_EXP_MS, DEFAULT_TOKEN_EXP_MS,
DEFAULT_TOKEN_REFRESH_RETRY_MS, DEFAULT_TOKEN_REFRESH_RETRY_MS,
} from "./guestTokenRefresh"; } from "./guestTokenRefresh";
import { afterAll, beforeAll, it, expect, describe, vi } from "vitest";
describe("guest token refresh", () => { describe("guest token refresh", () => {
beforeAll(() => { beforeAll(() => {
jest.useFakeTimers(); vi.useFakeTimers();
jest.setSystemTime(new Date("2022-03-03 01:00")); vi.setSystemTime(new Date("2022-03-03 01:00"));
jest.spyOn(global, "setTimeout"); vi.spyOn(globalThis, "setTimeout");
}); });
afterAll(() => { afterAll(() => {
jest.useRealTimers(); vi.useRealTimers();
}); });
function makeFakeJWT(claims: any) { function makeFakeJWT(claims: any) {
// not a valid jwt, but close enough for this code // not a valid jwt, but close enough for this code
const tokenifiedClaims = Buffer.from(JSON.stringify(claims)).toString( const tokenifiedClaims = Buffer.from(JSON.stringify(claims)).toString(
"base64" "base64",
); );
return `abc.${tokenifiedClaims}.xyz`; return `abc.${tokenifiedClaims}.xyz`;
} }

View File

@@ -18,17 +18,23 @@
*/ */
import { jwtDecode } from "jwt-decode"; import { jwtDecode } from "jwt-decode";
export const REFRESH_TIMING_BUFFER_MS = 5000 // refresh guest token early to avoid failed superset requests export const REFRESH_TIMING_BUFFER_MS = 5000; // refresh guest token early to avoid failed superset requests
export const MIN_REFRESH_WAIT_MS = 10000 // avoid blasting requests as fast as the cpu can handle export const MIN_REFRESH_WAIT_MS = 10000; // avoid blasting requests as fast as the cpu can handle
export const DEFAULT_TOKEN_EXP_MS = 300000 // (5 min) used only when parsing guest token exp fails export const DEFAULT_TOKEN_EXP_MS = 300000; // (5 min) used only when parsing guest token exp fails
export const DEFAULT_TOKEN_REFRESH_RETRY_MS = 10000 // wait before retrying a failed/timed-out token refresh export const DEFAULT_TOKEN_REFRESH_RETRY_MS = 10000; // wait before retrying a failed/timed-out token refresh
// when do we refresh the guest token? // when do we refresh the guest token?
export function getGuestTokenRefreshTiming(currentGuestToken: string) { export function getGuestTokenRefreshTiming(currentGuestToken: string) {
const parsedJwt = jwtDecode<Record<string, any>>(currentGuestToken); const parsedJwt = jwtDecode<Record<string, any>>(currentGuestToken);
// if exp is int, it is in seconds, but Date() takes milliseconds // if exp is int, it is in seconds, but Date() takes milliseconds
const exp = new Date(/[^0-9\.]/g.test(parsedJwt.exp) ? parsedJwt.exp : parseFloat(parsedJwt.exp) * 1000); const exp = new Date(
const isValidDate = exp.toString() !== 'Invalid Date'; /[^0-9\.]/g.test(parsedJwt.exp)
const ttl = isValidDate ? Math.max(MIN_REFRESH_WAIT_MS, exp.getTime() - Date.now()) : DEFAULT_TOKEN_EXP_MS; ? parsedJwt.exp
: parseFloat(parsedJwt.exp) * 1000,
);
const isValidDate = exp.toString() !== "Invalid Date";
const ttl = isValidDate
? Math.max(MIN_REFRESH_WAIT_MS, exp.getTime() - Date.now())
: DEFAULT_TOKEN_EXP_MS;
return ttl - REFRESH_TIMING_BUFFER_MS; return ttl - REFRESH_TIMING_BUFFER_MS;
} }

View File

@@ -20,15 +20,15 @@
import { import {
DASHBOARD_UI_FILTER_CONFIG_URL_PARAM_KEY, DASHBOARD_UI_FILTER_CONFIG_URL_PARAM_KEY,
IFRAME_COMMS_MESSAGE_TYPE, IFRAME_COMMS_MESSAGE_TYPE,
} from './const'; } from "./const";
// We can swap this out for the actual switchboard package once it gets published // We can swap this out for the actual switchboard package once it gets published
import { Switchboard } from '@superset-ui/switchboard'; import { Switchboard } from "@superset-ui/switchboard";
import { import {
getGuestTokenRefreshTiming, getGuestTokenRefreshTiming,
DEFAULT_TOKEN_REFRESH_RETRY_MS, DEFAULT_TOKEN_REFRESH_RETRY_MS,
} from './guestTokenRefresh'; } from "./guestTokenRefresh";
import { withTimeout } from './withTimeout'; import { withTimeout } from "./withTimeout";
/** /**
* The function to fetch a guest token from your Host App's backend server. * The function to fetch a guest token from your Host App's backend server.
@@ -97,7 +97,7 @@ export type ObserveDataMaskCallbackFn = (
nativeFiltersChanged: boolean; nativeFiltersChanged: boolean;
}, },
) => void; ) => void;
export type ThemeMode = 'default' | 'dark' | 'system'; export type ThemeMode = "default" | "dark" | "system";
/** /**
* Callback to resolve permalink URLs. * Callback to resolve permalink URLs.
@@ -113,12 +113,12 @@ export type EmbeddedDashboard = {
unmount: () => void; unmount: () => void;
getDashboardPermalink: (anchor: string) => Promise<string>; getDashboardPermalink: (anchor: string) => Promise<string>;
getActiveTabs: () => Promise<string[]>; getActiveTabs: () => Promise<string[]>;
observeDataMask: ( observeDataMask: (callbackFn: ObserveDataMaskCallbackFn) => void;
callbackFn: ObserveDataMaskCallbackFn,
) => void;
getDataMask: () => Promise<Record<string, any>>; getDataMask: () => Promise<Record<string, any>>;
getChartStates: () => Promise<Record<string, any>>; getChartStates: () => Promise<Record<string, any>>;
getChartDataPayloads: (params?: { chartId?: number }) => Promise<Record<string, any>>; getChartDataPayloads: (params?: {
chartId?: number;
}) => Promise<Record<string, any>>;
setThemeConfig: (themeConfig: Record<string, any>) => void; setThemeConfig: (themeConfig: Record<string, any>) => void;
setThemeMode: (mode: ThemeMode) => void; setThemeMode: (mode: ThemeMode) => void;
}; };
@@ -133,7 +133,7 @@ export async function embedDashboard({
fetchGuestToken, fetchGuestToken,
dashboardUiConfig, dashboardUiConfig,
debug = false, debug = false,
iframeTitle = 'Embedded Dashboard', iframeTitle = "Embedded Dashboard",
iframeSandboxExtras = [], iframeSandboxExtras = [],
iframeAllowExtras = [], iframeAllowExtras = [],
referrerPolicy, referrerPolicy,
@@ -152,13 +152,13 @@ export async function embedDashboard({
return withTimeout( return withTimeout(
fetchGuestToken(), fetchGuestToken(),
guestTokenFetchTimeoutMs, guestTokenFetchTimeoutMs,
'fetchGuestToken', "fetchGuestToken",
); );
} }
log('embedding'); log("embedding");
if (supersetDomain.endsWith('/')) { if (supersetDomain.endsWith("/")) {
supersetDomain = supersetDomain.slice(0, -1); supersetDomain = supersetDomain.slice(0, -1);
} }
@@ -185,15 +185,15 @@ export async function embedDashboard({
} }
async function mountIframe(): Promise<Switchboard> { async function mountIframe(): Promise<Switchboard> {
return new Promise(resolve => { return new Promise((resolve) => {
const iframe = document.createElement('iframe'); const iframe = document.createElement("iframe");
const dashboardConfigUrlParams = dashboardUiConfig const dashboardConfigUrlParams = dashboardUiConfig
? { uiConfig: `${calculateConfig()}` } ? { uiConfig: `${calculateConfig()}` }
: undefined; : undefined;
const filterConfig = dashboardUiConfig?.filters || {}; const filterConfig = dashboardUiConfig?.filters || {};
const filterConfigKeys = Object.keys(filterConfig); const filterConfigKeys = Object.keys(filterConfig);
const filterConfigUrlParams = Object.fromEntries( const filterConfigUrlParams = Object.fromEntries(
filterConfigKeys.map(key => [ filterConfigKeys.map((key) => [
DASHBOARD_UI_FILTER_CONFIG_URL_PARAM_KEY[key], DASHBOARD_UI_FILTER_CONFIG_URL_PARAM_KEY[key],
filterConfig[key], filterConfig[key],
]), ]),
@@ -206,16 +206,16 @@ export async function embedDashboard({
...dashboardUiConfig?.urlParams, ...dashboardUiConfig?.urlParams,
}; };
const urlParamsString = Object.keys(urlParams).length const urlParamsString = Object.keys(urlParams).length
? '?' + new URLSearchParams(urlParams).toString() ? "?" + new URLSearchParams(urlParams).toString()
: ''; : "";
// set up the iframe's sandbox configuration // set up the iframe's sandbox configuration
iframe.sandbox.add('allow-same-origin'); // needed for postMessage to work iframe.sandbox.add("allow-same-origin"); // needed for postMessage to work
iframe.sandbox.add('allow-scripts'); // obviously the iframe needs scripts iframe.sandbox.add("allow-scripts"); // obviously the iframe needs scripts
iframe.sandbox.add('allow-presentation'); // for fullscreen charts iframe.sandbox.add("allow-presentation"); // for fullscreen charts
iframe.sandbox.add('allow-downloads'); // for downloading charts as image iframe.sandbox.add("allow-downloads"); // for downloading charts as image
iframe.sandbox.add('allow-forms'); // for forms to submit iframe.sandbox.add("allow-forms"); // for forms to submit
iframe.sandbox.add('allow-popups'); // for exporting charts as csv iframe.sandbox.add("allow-popups"); // for exporting charts as csv
// additional sandbox props // additional sandbox props
iframeSandboxExtras.forEach((key: string) => { iframeSandboxExtras.forEach((key: string) => {
iframe.sandbox.add(key); iframe.sandbox.add(key);
@@ -226,7 +226,7 @@ export async function embedDashboard({
} }
// add the event listener before setting src, to be 100% sure that we capture the load event // add the event listener before setting src, to be 100% sure that we capture the load event
iframe.addEventListener('load', () => { iframe.addEventListener("load", () => {
// MessageChannel allows us to send and receive messages smoothly between our window and the iframe // MessageChannel allows us to send and receive messages smoothly between our window and the iframe
// See https://developer.mozilla.org/en-US/docs/Web/API/Channel_Messaging_API // See https://developer.mozilla.org/en-US/docs/Web/API/Channel_Messaging_API
const commsChannel = new MessageChannel(); const commsChannel = new MessageChannel();
@@ -237,35 +237,35 @@ export async function embedDashboard({
// See https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage // See https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
// we know the content window isn't null because we are in the load event handler. // we know the content window isn't null because we are in the load event handler.
iframe.contentWindow!.postMessage( iframe.contentWindow!.postMessage(
{ type: IFRAME_COMMS_MESSAGE_TYPE, handshake: 'port transfer' }, { type: IFRAME_COMMS_MESSAGE_TYPE, handshake: "port transfer" },
supersetDomain, supersetDomain,
[theirPort], [theirPort],
); );
log('sent message channel to the iframe'); log("sent message channel to the iframe");
// return our port from the promise // return our port from the promise
resolve( resolve(
new Switchboard({ new Switchboard({
port: ourPort, port: ourPort,
name: 'superset-embedded-sdk', name: "superset-embedded-sdk",
debug, debug,
}), }),
); );
}); });
iframe.src = `${supersetDomain}/embedded/${id}${urlParamsString}`; iframe.src = `${supersetDomain}/embedded/${id}${urlParamsString}`;
iframe.title = iframeTitle; iframe.title = iframeTitle;
iframe.style.background = 'transparent'; iframe.style.background = "transparent";
// Permissions Policy features the embedded dashboard relies on. Modern // Permissions Policy features the embedded dashboard relies on. Modern
// browsers gate these APIs on the iframe's `allow` attribute regardless // browsers gate these APIs on the iframe's `allow` attribute regardless
// of sandbox flags, so we include them by default. Host apps can extend // of sandbox flags, so we include them by default. Host apps can extend
// the list via `iframeAllowExtras`. // the list via `iframeAllowExtras`.
const allowFeatures = Array.from( const allowFeatures = Array.from(
new Set(['fullscreen', 'clipboard-write', ...iframeAllowExtras]), new Set(["fullscreen", "clipboard-write", ...iframeAllowExtras]),
); );
iframe.setAttribute('allow', allowFeatures.join('; ')); iframe.setAttribute("allow", allowFeatures.join("; "));
//@ts-ignore //@ts-ignore
mountPoint.replaceChildren(iframe); mountPoint.replaceChildren(iframe);
log('placed the iframe'); log("placed the iframe");
}); });
} }
@@ -285,8 +285,8 @@ export async function embedDashboard({
throw err; throw err;
} }
ourPort.emit('guestToken', { guestToken }); ourPort.emit("guestToken", { guestToken });
log('sent guest token'); log("sent guest token");
// Track the pending refresh timer so it can be cancelled on unmount, and // Track the pending refresh timer so it can be cancelled on unmount, and
// stop the cycle once unmounted so it cannot leak across mount/unmount cycles. // stop the cycle once unmounted so it cannot leak across mount/unmount cycles.
@@ -298,7 +298,7 @@ export async function embedDashboard({
try { try {
const newGuestToken = await fetchGuestTokenWithTimeout(); const newGuestToken = await fetchGuestTokenWithTimeout();
if (unmounted) return; if (unmounted) return;
ourPort.emit('guestToken', { guestToken: newGuestToken }); ourPort.emit("guestToken", { guestToken: newGuestToken });
refreshTimer = setTimeout( refreshTimer = setTimeout(
refreshGuestToken, refreshGuestToken,
getGuestTokenRefreshTiming(newGuestToken), getGuestTokenRefreshTiming(newGuestToken),
@@ -307,7 +307,7 @@ export async function embedDashboard({
// A transient fetch failure or timeout must not permanently stop the // A transient fetch failure or timeout must not permanently stop the
// refresh cycle. Log it and retry so the session can recover once the // refresh cycle. Log it and retry so the session can recover once the
// host callback succeeds again. // host callback succeeds again.
log('failed to refresh guest token, will retry:', err); log("failed to refresh guest token, will retry:", err);
if (unmounted) return; if (unmounted) return;
refreshTimer = setTimeout( refreshTimer = setTimeout(
refreshGuestToken, refreshGuestToken,
@@ -325,7 +325,7 @@ export async function embedDashboard({
// Returns null if no callback provided or on error, allowing iframe to use default URL // Returns null if no callback provided or on error, allowing iframe to use default URL
ourPort.start(); ourPort.start();
ourPort.defineMethod( ourPort.defineMethod(
'resolvePermalinkUrl', "resolvePermalinkUrl",
async ({ key }: { key: string }): Promise<string | null> => { async ({ key }: { key: string }): Promise<string | null> => {
if (!resolvePermalinkUrl) { if (!resolvePermalinkUrl) {
return null; return null;
@@ -333,14 +333,14 @@ export async function embedDashboard({
try { try {
return await resolvePermalinkUrl({ key }); return await resolvePermalinkUrl({ key });
} catch (error) { } catch (error) {
log('Error in resolvePermalinkUrl callback:', error); log("Error in resolvePermalinkUrl callback:", error);
return null; return null;
} }
}, },
); );
function unmount() { function unmount() {
log('unmounting'); log("unmounting");
unmounted = true; unmounted = true;
if (refreshTimer !== undefined) { if (refreshTimer !== undefined) {
clearTimeout(refreshTimer); clearTimeout(refreshTimer);
@@ -350,24 +350,25 @@ export async function embedDashboard({
mountPoint.replaceChildren(); mountPoint.replaceChildren();
} }
const getScrollSize = () => ourPort.get<Size>('getScrollSize'); const getScrollSize = () => ourPort.get<Size>("getScrollSize");
const getDashboardPermalink = (anchor: string) => const getDashboardPermalink = (anchor: string) =>
ourPort.get<string>('getDashboardPermalink', { anchor }); ourPort.get<string>("getDashboardPermalink", { anchor });
const getActiveTabs = () => ourPort.get<string[]>('getActiveTabs'); const getActiveTabs = () => ourPort.get<string[]>("getActiveTabs");
const getDataMask = () => ourPort.get<Record<string, any>>('getDataMask'); const getDataMask = () => ourPort.get<Record<string, any>>("getDataMask");
const getChartStates = () => ourPort.get<Record<string, any>>('getChartStates'); const getChartStates = () =>
ourPort.get<Record<string, any>>("getChartStates");
const getChartDataPayloads = (params?: { chartId?: number }) => const getChartDataPayloads = (params?: { chartId?: number }) =>
ourPort.get<Record<string, any>>('getChartDataPayloads', params); ourPort.get<Record<string, any>>("getChartDataPayloads", params);
const observeDataMask = ( const observeDataMask = (callbackFn: ObserveDataMaskCallbackFn) => {
callbackFn: ObserveDataMaskCallbackFn, ourPort.defineMethod("observeDataMask", callbackFn);
) => {
ourPort.defineMethod('observeDataMask', callbackFn);
}; };
// TODO: Add proper types once theming branch is merged // TODO: Add proper types once theming branch is merged
const setThemeConfig = async (themeConfig: Record<string, any>): Promise<void> => { const setThemeConfig = async (
themeConfig: Record<string, any>,
): Promise<void> => {
try { try {
ourPort.emit('setThemeConfig', { themeConfig }); ourPort.emit("setThemeConfig", { themeConfig });
log('Theme config sent successfully (or at least message dispatched)'); log("Theme config sent successfully (or at least message dispatched)");
} catch (error) { } catch (error) {
log( log(
'Error sending theme config. Ensure the iframe side implements the "setThemeConfig" method.', 'Error sending theme config. Ensure the iframe side implements the "setThemeConfig" method.',
@@ -378,7 +379,7 @@ export async function embedDashboard({
const setThemeMode = (mode: ThemeMode): void => { const setThemeMode = (mode: ThemeMode): void => {
try { try {
ourPort.emit('setThemeMode', { mode }); ourPort.emit("setThemeMode", { mode });
log(`Theme mode set to: ${mode}`); log(`Theme mode set to: ${mode}`);
} catch (error) { } catch (error) {
log( log(

View File

@@ -18,22 +18,23 @@
*/ */
import { withTimeout } from "./withTimeout"; import { withTimeout } from "./withTimeout";
import { test, expect } from "vitest";
test("resolves with the value when the promise settles in time", async () => { test("resolves with the value when the promise settles in time", async () => {
await expect(withTimeout(Promise.resolve("ok"), 1000, "fetch")).resolves.toBe( await expect(withTimeout(Promise.resolve("ok"), 1000, "fetch")).resolves.toBe(
"ok" "ok",
); );
}); });
test("rejects when the promise does not settle within the timeout", async () => { test("rejects when the promise does not settle within the timeout", async () => {
const never = new Promise<string>(() => {}); const never = new Promise<string>(() => {});
await expect(withTimeout(never, 10, "fetch")).rejects.toThrow( await expect(withTimeout(never, 10, "fetch")).rejects.toThrow(
/fetch did not resolve within 10ms/ /fetch did not resolve within 10ms/,
); );
}); });
test("passes the promise through unchanged when the timeout is disabled", async () => { test("passes the promise through unchanged when the timeout is disabled", async () => {
await expect(withTimeout(Promise.resolve("ok"), 0, "fetch")).resolves.toBe( await expect(withTimeout(Promise.resolve("ok"), 0, "fetch")).resolves.toBe(
"ok" "ok",
); );
}); });

Some files were not shown because too many files have changed in this diff Show More