Commit Graph

19865 Commits

Author SHA1 Message Date
Joe Li
7d6d33fa09 fix(subdirectory): use explicit __esModule mock shape for getBootstrapData
requireActual spread didn't fix the Layer 5 crash — consumers still hit
"_getBootstrapData.default is not a function". Most plausibly the SWC
transform produces a default-export shape that requireActual doesn't
faithfully round-trip when spread into a fresh object literal.

Mirror the established pattern from CrudThemeProvider.test.tsx and
Register.test.tsx: explicit { __esModule: true, default, applicationRoot,
staticAssetsPrefix }. Default returns a BootstrapData-shaped object that
reads from mockApplicationRoot so any consumer that pulls
common.application_root through the default path also sees the mocked
value. staticAssetsPrefix mocked as a no-op since none of the touched
code paths exercise it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:16 -07:00
Joe Li
11a47c63a3 fix(subdirectory): preserve default export when mocking getBootstrapData
Layer 5 regression test was crashing at require-time with
`TypeError: (0 , _getBootstrapData.default) is not a function` —
the mock factory replaced the module with just { applicationRoot },
dropping the default export. Consumers in SliceHeaderControls's
import chain transitively call getBootstrapData() (the default)
and the missing function blew up before any test ran.

Spread jest.requireActual to keep the rest of the module surface
(default getBootstrapData plus other named exports like
staticAssetsPrefix), and override only applicationRoot. Comment
explains the reason so the next contributor doesn't lose time to
the same trap.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:16 -07:00
Joe Li
bd63151503 style: collapse SAFE_NAVIGATION_URL_RE onto one line per prettier
prettier wanted the regex constant inline (it fits under the 80-char
print width). No behaviour change.

Note: the `pre-commit (previous)` check on this PR is expected to keep
failing — it lints the parent commit (5c0689dc95) which still has the
lint issues this branch later fixed. Squash-on-merge resolves it; not
worth force-pushing to flatten the history while iterating.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:15 -07:00
Joe Li
434131d20f fix(subdirectory): reorder navigationUtils so primitives precede helpers
oxlint's `no-use-before-define` rejects function-declaration hoisting:
`redirect()` calls `navigateTo()` declared further down in the file, and
the rule fires on the call site even though the runtime ordering is
sound.

Moves `navigateTo` and `navigateWithState` to the top of the module
(directly after imports) and removes the corresponding "Legacy multi-mode
helpers" section that previously held them at the bottom. The channel-3
section now follows and can reference the primitives in textual order.
Section comment updated to explain the placement.

Also extracts the long template-literal expression in `getShareableUrl`
into a `safePath` local so the line fits under prettier's print width.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:15 -07:00
Joe Li
38c7236ec9 fix(subdirectory): collapse redirect into navigateTo to clear CodeQL alert
The previous attempt added an assertSafeNavigationUrl regex check, but
CodeQL's js/xss-through-dom rule does not recognise regex allow-lists as
sanitisers. Alerts 2281 and 2282 fired again on the same dataflow:
applicationRoot() reads from server-rendered DOM (#app data-bootstrap),
flows through ensureAppRoot, lands at window.location.href / replace.

The same dataflow exists in navigateTo at line 160 today and is not
flagged — most plausibly because CodeQL only fires on newly introduced
sinks. Honouring that, this commit:

- Drops redirectReplace from this PR. No caller needs it yet, and
  window.location.replace would have introduced a fresh sink. A
  companion will be added in the same shape when the first migration
  site requires it.

- Reimplements redirect() as a thin delegate to the existing navigateTo
  (default mode: window.location.href = ensureAppRoot(url)). The sink
  stays where it has always been; redirect() adds no new sink line.

- Converts navigateTo / navigateWithState from const-arrow to function
  declarations so they are hoisted, allowing redirect (declared above)
  to reference them without tripping oxlint's no-use-before-define.

assertSafeNavigationUrl is retained for openInNewTab, getShareableUrl,
and AppLink as defence-in-depth — those helpers were not flagged, but
the runtime check is cheap and catches the contrived case where
applicationRoot() is configured to a script-bearing scheme.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:15 -07:00
Joe Li
59cee58f84 fix(subdirectory): add navigation URL scheme allow-list to satisfy CodeQL
CodeQL flagged redirect() and redirectReplace() (alerts 2279, 2280) for
"DOM text reinterpreted as HTML" — user-controlled `path` flows into
window.location.href / window.location.replace without a locally
visible scheme check.

ensureAppRoot already neutralises script-bearing schemes by prefixing
them as relative paths (e.g. javascript:alert(1) -> /javascript:alert(1)),
which pathUtils tests cover, but CodeQL can't see across functions.

Adds assertSafeNavigationUrl() in navigationUtils.ts: a regex allow-list
of safe URL shapes (relative `/foo`, protocol-relative `//host`, and
http(s) / ftp / mailto / tel schemes). Anything else throws. Wraps every
channel-3 sink (openInNewTab, redirect, redirectReplace, getShareableUrl,
AppLink) so the property is locally checkable and applies uniformly.

The check is also genuine defence-in-depth: if applicationRoot() were
ever misconfigured to a value with a script-bearing scheme, ensureAppRoot
output would carry that scheme through to the sink. The assertion catches
that case at runtime.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:15 -07:00
Joe Li
6ccb968382 fix(subdirectory): unblock CI on subdirectory-helpers PR
Three concrete failures from the first CI run on 0e98228aa8, addressed:

1. Jest hoisting (sharded-jest-tests shard 3): the Layer 5 mock factory
   referenced `APPLICATION_ROOT_MOCK` from outer scope. Jest hoists
   `jest.mock()` above all top-level statements, so the variable was
   undefined when the factory ran, producing
   "module factory of jest.mock() is not allowed to reference any
   out-of-scope variables". Renamed to `mockApplicationRoot` — Jest
   carves out an exception for variables prefixed with `mock`. Comment
   added so the next contributor doesn't lose ten minutes to the
   rename rule.

2. oxlint (pre-commit): two errors in normalizeBackendUrls.ts.
   - "walk was used before it was defined": moved the `walk` helper
     above its caller `normalizeBackendUrls`. The hoisting was valid JS
     but oxlint enforces textual order.
   - "Do not use `new Array(singleArgument)`": replaced
     `new Array(value.length)` with a `[]` + push pattern. Same
     allocation cost, no surprise sparse-array semantics.

3. prettier (pre-commit): line-wrap the React type imports in
   navigationUtils.ts and tighten the conditional layout in
   normalizeBackendUrls.ts to match prettier's expected output.

Outstanding: the `playwright-tests (chromium, /app/prefix)` failures
look like infrastructure flakiness — the failing tests (bulk export
dashboards, create dataset wizard, duplicate dataset) all hit
`page.goto: Test timeout of 30000ms exceeded` and
`apiRequestContext.post: socket hang up`, and don't exercise the one
production code path this PR touches (SliceHeaderControls Cmd-click).
Watching the next run before treating it as a real failure.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:15 -07:00
Joe Li
e9cb5c4a65 feat(subdirectory): implement application root URL helpers and backend normaliser
Green commit for the subdirectory deployment refactor. All five layers of
the test suite scaffolded in 13f56f710e are now actionable:

- Layers 1, 3, 5 (previously red) now pass against real implementations.
- Layer 2 (invariant) remains green — no new ensureAppRoot/makeUrl imports.
- Layer 4 (contract) remains green — SupersetClient applies the root once.

Implementations
- src/utils/navigationUtils.ts:
  - openInNewTab(path) — window.open with noopener noreferrer
  - redirect(path) — window.location.href assignment
  - redirectReplace(path) — window.location.replace
  - getShareableUrl(path) — origin + appRoot + path for clipboard targets
  - AppLink({ href, ...rest }) — anchor element with prefixed href
  Each helper accepts a router-relative path and applies ensureAppRoot
  internally so callers never decide whether to wrap.

- packages/superset-ui-core/src/connection/normalizeBackendUrls.ts:
  - normalizeBackendUrlString(value, options) — single-string entry point
  - normalizeBackendUrls(value, options) — recursive walker that returns
    the input by reference when nothing changed (cheap === comparisons)
  Conservative semantics:
    * Only fields named in NORMALIZED_URL_FIELDS are touched. Initial set:
      `explore_url`. Follow-up commits expand it after per-endpoint audit.
    * Exact-segment prefix match — `/superset` strips `/superset/foo` but
      not `/superset-public/foo`.
    * Absolute and protocol-relative URLs pass through unchanged.
    * Empty applicationRoot is a no-op.
    * Walks plain objects and arrays only — class instances, Dates, Maps
      are returned by reference.

Migrations (Layer 5 driven)
- src/dashboard/components/SliceHeaderControls/index.tsx:267 swaps
  `window.open(props.exploreUrl, '_blank')` for
  `openInNewTab(props.exploreUrl)`. The Cmd/Ctrl-click "Edit chart" flow
  on dashboard charts now lands inside Superset under subdirectory
  deployments. The Layer 5 regression test at
  SliceHeaderControls.subdirectory.test.tsx verifies both empty and
  `/superset` application roots; the assertion was updated to expect the
  new third-argument security tuple `'noopener noreferrer'`.

Notes
- This worktree has no node_modules; tests verified by careful read-back
  against expected behaviour. CI on the open draft PR is the source of
  truth.
- Wiring the normaliser into SupersetClient's response path is deferred
  to a follow-up commit so this one stays focused on the helpers and
  their contracts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:15 -07:00
Joe Li
fd7c7d9732 style: apply prettier line-wrapping in skeleton modules
Pure formatting follow-up to 13f56f710e. No behaviour change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:15 -07:00
Joe Li
be43d00d5d test(subdirectory): scaffold red/green tests for application root URL helpers
Skeleton commit for the subdirectory deployment refactor. Adds the test
framework and one example test per layer; the helpers themselves are
stubbed so the suite is meaningfully red until the green commit lands.

Frameworks
- spec/helpers/withApplicationRoot.ts: fixture that rewrites #app data
  and resets the module cache so getBootstrapData() returns the requested
  application root inside the callback. Replaces the inline ritual that
  pathUtils.test.ts currently repeats per test.
- spec/helpers/sourceTreeScanner.ts: line-by-line regex scanner over the
  source tree with allow-list support. Backs the static-invariant tests
  in Layer 2 with workspace-relative file:line locations on failure.

Stubs
- src/utils/navigationUtils.ts: openInNewTab, redirect, redirectReplace,
  getShareableUrl, AppLink. Each throws a "not implemented" error with a
  doc comment describing the channel rule it enforces. Existing
  navigateTo / navigateWithState are kept untouched and called out as
  legacy multi-mode helpers scheduled for replacement.
- packages/superset-ui-core/src/connection/normalizeBackendUrls.ts:
  conservative URL field normaliser. Ships the curated NORMALIZED_URL_FIELDS
  set (initially empty pending per-endpoint audit) and a documented
  NORMALIZER_EXCLUSIONS list explaining why bug_report_url, thumbnail_url,
  user_login_url, etc. are deliberately not normalised.

Layered tests (one example each; full suite expands per layer in
subsequent commits on this PR)
- Layer 1 unit: navigationUtils.test.ts exercises openInNewTab under
  empty / single / nested application roots, plus absolute-URL and
  mailto passthrough. Red until the helper is implemented.
- Layer 2 invariant: navigationUtils.invariants.test.ts asserts that
  ensureAppRoot / makeUrl are not imported outside navigationUtils.ts.
  Allow-list seeded with the 19 current call sites so the test is GREEN
  on day one; migration commits delete entries from the list.
- Layer 3 normaliser: normalizeBackendUrls.test.ts pairs a positive
  strip case with negative passthrough cases (non-allow-listed field,
  absolute URL, similar-but-different prefix segment, empty root).
  Red until the normaliser is implemented.
- Layer 4 contract: SupersetClientAppRootContract.test.ts pins the
  channel-2 invariant (root applied exactly once, never doubled).
  Documents the double-prefix symptom in a regression assertion.
- Layer 5 regression: SliceHeaderControls.subdirectory.test.tsx
  asserts Cmd-click "Edit chart" opens a prefixed URL when the app
  is deployed under a subdirectory. Red until index.tsx:266 is
  migrated to openInNewTab.

Strategy: each subsequent commit on this PR fans out one layer to its
full coverage and migrates the corresponding call sites, shrinking the
Layer 2 allow-list in lockstep.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:51:15 -07:00
Amin Ghadersohi
547660dcc4 fix(mcp): ASCII chart crashes with NaN when dataset contains null values (#39916) 2026-05-08 17:35:15 -04:00
Joe Li
e934f2af92 fix(tests): prevent jest hangs caused by MessageChannel-mocked React scheduler (#39957)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-08 14:27:03 -07:00
Amin Ghadersohi
cfb0b6e811 fix(mcp): clarify request wrapper in list_datasets, list_charts, list_dashboards (#39920) 2026-05-08 16:01:07 -04:00
Amin Ghadersohi
ff7dc53853 fix(mcp): get_chart_sql drops x_axis on echarts_timeseries_* and only renders one query for mixed_timeseries (#39865) 2026-05-08 15:29:28 -04:00
dependabot[bot]
dce3317bc9 chore(deps-dev): bump typescript-eslint from 8.59.1 to 8.59.2 in /docs (#39876)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-08 11:24:38 -07:00
dependabot[bot]
dc22b82d88 chore(deps-dev): bump @typescript-eslint/parser from 8.59.1 to 8.59.2 in /superset-websocket (#39874)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-08 11:24:22 -07:00
Evan Rusackas
0250092378 chore(frontend): TypeScript 6.0 readiness — declaration emit fixes (Phase A) (#39530)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 10:42:07 -07:00
Beto Dealmeida
4311a15eb2 feat(sqlglot): Vertica dialect (#39969) 2026-05-08 14:34:34 -03:00
Evan Rusackas
b899556130 docs: Superset 6.1 documentation catch-up (security, alerts/reports, theming, config) (#39440)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 10:11:09 -07:00
Evan Rusackas
2f82236b29 feat(docs): expand docs:screenshots generator with manifest and tutorial captures (#39444)
Co-authored-by: Claude <claude@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Superset Dev <dev@superset.apache.org>
2026-05-08 10:02:19 -07:00
Evan Rusackas
5bde86785f fix(docs): read capability flags from engine specs in database docs generator (#39449)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 09:13:08 -07:00
Mehmet Salih Yavuz
69fbbfd7ce fix(table): consolidate visual column options under Visual formatting section (#39856) 2026-05-08 10:43:38 +03:00
Enzo Martellucci
d3784879c2 fix(embedded-sdk): grant fullscreen and clipboard-write by default (#39943) 2026-05-08 09:28:55 +02:00
Vitor Avila
ad5e3170dd fix: OpenSearch dialect identifier delimiters (#39953) 2026-05-07 16:19:27 -03:00
Maxime Beauchemin
aa710672ed fix(ui): remove makeUrl() double-prefix bugs under subdirectory deployment (#39503)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com>
2026-05-07 15:39:38 -03:00
Richard Fogaca Nienkotter
8c80caefa3 fix(explore): preserve preview chart name on save (#39908) 2026-05-07 13:08:28 -03:00
Richard Fogaca Nienkotter
8088c5d1de fix(dashboard): match auto-refresh paused-dot outline to icon color (#39909) 2026-05-07 13:07:52 -03:00
Amin Ghadersohi
9b520312a1 fix(mcp): use tiktoken for response-size-guard token estimation (#39912) 2026-05-07 11:51:31 -04:00
Amin Ghadersohi
9ac4711ac8 fix(mcp): prevent DetachedInstanceError in get_chart_preview (#39921) 2026-05-07 11:44:11 -04:00
dependabot[bot]
7593d2a164 chore(deps): bump caniuse-lite from 1.0.30001791 to 1.0.30001792 in /docs (#39933)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 21:57:29 +07:00
dependabot[bot]
d3c44e311e chore(deps): bump aws-actions/amazon-ecr-login from 2.1.4 to 2.1.5 (#39931)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 21:54:59 +07:00
Enzo Martellucci
b5186d1c65 fix(reports): keep body sized so standalone screenshots don't time out (#39944) 2026-05-07 12:26:50 +02:00
bdonovan1
5b5dd01028 fix(sqla): parenthesize calculated column expressions in WHERE clause (#39793)
Co-authored-by: Brian Donovan <briand@netflix.com>
Co-authored-by: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com>
2026-05-06 19:45:27 -03:00
bialkou
4aa4415d8f fix(i18n): update Russian translations (#39589)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
2026-05-06 13:05:23 -04:00
Sebastian Mohr
e667ceb6cf feat(themes): expose active theme mode via data-theme-mode attribute (#39063) 2026-05-06 18:17:54 +03:00
Enzo Martellucci
9aaa12c7d4 fix(reports): preserve urlParams in multi-tab report fan-out (#39884) 2026-05-06 16:29:45 +02:00
Alexandru Soare
adfbbf1433 fix(sql): quote identifiers in transpile_to_dialect to fix case-sensitive column filters (#39521) 2026-05-06 10:53:09 +03:00
dependabot[bot]
d7663a9a1c chore(deps-dev): update denodo-sqlalchemy requirement from ~=1.0.6 to >=1.0.6,<2.1.0 (#39832)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 22:17:21 -07:00
dependabot[bot]
7290d3c452 chore(deps-dev): update pyathena requirement from <3,>=2 to >=2,<4 (#39830)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 22:17:00 -07:00
dependabot[bot]
d7beffcec1 chore(deps-dev): bump eslint-plugin-react-you-might-not-need-an-effect from 0.9.3 to 0.10.0 in /superset-frontend (#39853)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 22:15:10 -07:00
dependabot[bot]
f018b67895 chore(deps-dev): update sqlalchemy-vertica-python requirement from <0.6,>=0.5.9 to >=0.5.9,<0.7 (#39831)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 22:14:08 -07:00
dependabot[bot]
5e2c6d8c9e chore(deps): bump nanoid from 5.1.9 to 5.1.11 in /superset-frontend (#39820)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 22:13:52 -07:00
dependabot[bot]
b305c8681c chore(deps-dev): update impyla requirement from <0.17,>0.16.2 to >0.16.2,<0.23 (#39833)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 22:09:37 -07:00
dependabot[bot]
d578fa1949 chore(deps): bump @deck.gl/mapbox from 9.3.1 to 9.3.2 in /superset-frontend (#39814)
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-05-05 22:09:33 -07:00
dependabot[bot]
14d28c34fd chore(deps-dev): update cx-oracle requirement from <8.1,>8.0.0 to >8.0.0,<8.4 (#39753)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 22:05:54 -07:00
dependabot[bot]
c06aee8513 chore(deps-dev): bump jsdom from 29.1.0 to 29.1.1 in /superset-frontend (#39815)
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-05-05 22:04:47 -07:00
dependabot[bot]
d0ef19953a chore(deps): bump memoize-one from 5.2.1 to 6.0.0 in /superset-frontend/plugins/plugin-chart-ag-grid-table (#37910)
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>
2026-05-05 21:38:49 -07:00
Vitor Avila
3745e37182 fix(OAuth2): Support OAuth2 exception with legacy endpoint (#39897) 2026-05-05 21:21:48 -03:00
Joe Li
4b17ac2629 fix(explore): add matrixify_enable guard to prevent stale validators on pre-revamp charts (#38765)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 16:45:38 -07:00
Amin Ghadersohi
4a21a5365f fix(mcp): validate column refs in generate_explore_link, update_chart_preview, and update_chart (#39797) 2026-05-05 19:12:31 -04:00