From e8164dee9c3045b50a3d7d0951fc4c85c8f50787 Mon Sep 17 00:00:00 2001 From: Dariusz Szymczyk Date: Mon, 10 Aug 2026 09:02:03 +0200 Subject: [PATCH 1/7] feat(stacklet): rebrand this deployment as AssetDB v2 Superset ships alongside the Redash-backed "AssetDB" rather than replacing it, so the two need distinct names in the app switcher. Rename this deployment to "AssetDB v2", matching the entry the other apps now render for it. Needs the @stacklet/ui release that widens `V2AppName` to accept "AssetDB v2" (stacklet/platform-ui ENG-8329). fixes: ENG-8329 --- superset-frontend/src/stacklet/appSelector.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/superset-frontend/src/stacklet/appSelector.ts b/superset-frontend/src/stacklet/appSelector.ts index 9923da89014d..734329613695 100644 --- a/superset-frontend/src/stacklet/appSelector.ts +++ b/superset-frontend/src/stacklet/appSelector.ts @@ -20,10 +20,12 @@ import getBootstrapData from 'src/utils/getBootstrapData'; /** * How this Superset deployment is branded in the Stacklet platform's app - * switcher (Design Kit v2, node 6820-6796). Also part of @stacklet/ui's - * `V2AppName` union, so it can be passed to the Sidebar without casts. + * switcher (Design Kit v2, node 6820-6796). Distinct from the Redash-backed + * "AssetDB", which the other apps still link to alongside this one. Also part + * of @stacklet/ui's `V2AppName` union, so it can be passed to the Sidebar + * without casts. */ -export const SUPERSET_APP_NAME = 'AssetDB'; +export const SUPERSET_APP_NAME = 'AssetDB v2'; export interface StackletAppOption { label: string; @@ -55,7 +57,7 @@ const DEV_FALLBACK_URLS: Partial> = { /** * Builds the app switcher entries for the Stacklet sidebar. Superset itself - * (branded AssetDB) is always present and selected; siblings appear only + * (branded AssetDB v2) is always present and selected; siblings appear only * when their URL is configured. */ export function getAppSelectorOptions(): StackletAppOption[] { From 5a7001798dd7e3994ae83150e4afa8e6fc4d708e Mon Sep 17 00:00:00 2001 From: Dariusz Szymczyk Date: Mon, 10 Aug 2026 10:23:54 +0200 Subject: [PATCH 2/7] feat(stacklet): offer the Redash-backed AssetDB in the app switcher Now that this deployment is branded "AssetDB v2" there is no longer a name clash, and AssetDB v2 was the only app you could not hop back to v1 from. The `redash` key already ships in the bootstrap `stacklet.urls` payload, so gate the entry on it like the other siblings and add it to the local-dev fallbacks. fixes: ENG-8329 --- superset-frontend/src/stacklet/appSelector.test.ts | 11 +++++++++++ superset-frontend/src/stacklet/appSelector.ts | 9 +++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/superset-frontend/src/stacklet/appSelector.test.ts b/superset-frontend/src/stacklet/appSelector.test.ts index 3eb84b4b8368..37fe84cbc914 100644 --- a/superset-frontend/src/stacklet/appSelector.test.ts +++ b/superset-frontend/src/stacklet/appSelector.test.ts @@ -31,6 +31,7 @@ test('builds entries from the platform-injected stacklet.urls', () => { stacklet: { urls: { console: 'https://console.acme.stacklet.io', + redash: 'https://redash.acme.stacklet.io', sinistral: 'https://sinistral.acme.stacklet.io', superset: 'https://superset.acme.stacklet.io', }, @@ -38,6 +39,11 @@ test('builds entries from the platform-injected stacklet.urls', () => { }); expect(getAppSelectorOptions()).toEqual([ { label: SUPERSET_APP_NAME, href: '', isBeta: false }, + { + label: 'AssetDB', + href: 'https://redash.acme.stacklet.io', + isBeta: false, + }, { label: 'Console', href: 'https://console.acme.stacklet.io', @@ -61,6 +67,11 @@ test('falls back to the dev platform when the payload has no stacklet.urls', () bootstrapWith({}); expect(getAppSelectorOptions()).toEqual([ { label: SUPERSET_APP_NAME, href: '', isBeta: false }, + { + label: 'AssetDB', + href: 'https://redash.dev.stacklet.dev', + isBeta: false, + }, { label: 'Console', href: 'https://console.dev.stacklet.dev', diff --git a/superset-frontend/src/stacklet/appSelector.ts b/superset-frontend/src/stacklet/appSelector.ts index 734329613695..b195edfe786a 100644 --- a/superset-frontend/src/stacklet/appSelector.ts +++ b/superset-frontend/src/stacklet/appSelector.ts @@ -52,19 +52,24 @@ interface StackletBootstrapExtras { */ const DEV_FALLBACK_URLS: Partial> = { console: 'https://console.dev.stacklet.dev', + redash: 'https://redash.dev.stacklet.dev', sinistral: 'https://sinistral.dev.stacklet.dev', }; /** * Builds the app switcher entries for the Stacklet sidebar. Superset itself - * (branded AssetDB v2) is always present and selected; siblings appear only - * when their URL is configured. + * (branded AssetDB v2) is always present and selected; siblings — including the + * Redash-backed "AssetDB" — appear only when their URL is configured. The + * Sidebar renders the selected app first regardless of this order. */ export function getAppSelectorOptions(): StackletAppOption[] { const common = getBootstrapData().common as StackletBootstrapExtras; const urls = common?.stacklet?.urls ?? DEV_FALLBACK_URLS; return [ { label: SUPERSET_APP_NAME, href: '', isBeta: false }, + ...(urls.redash + ? [{ label: 'AssetDB', href: urls.redash, isBeta: false }] + : []), ...(urls.console ? [{ label: 'Console', href: urls.console, isBeta: false }] : []), From fcd15a2345f5225a53e417e4aa9bec2e1b8e6ef1 Mon Sep 17 00:00:00 2001 From: Dariusz Szymczyk Date: Tue, 11 Aug 2026 07:40:22 +0200 Subject: [PATCH 3/7] refactor(stacklet): brand as AssetDB (Preview) while Redash exists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Product decision: no "v2" branding. This deployment is "AssetDB (Preview)" while the Redash-backed AssetDB is still deployed alongside it, and takes over the plain "AssetDB" name in environments without Redash — so the constant becomes getSupersetAppName(), keyed on the bootstrap redash URL. fixes: ENG-8329 --- .../src/stacklet/StackletSidebar.tsx | 5 ++- .../src/stacklet/appSelector.test.ts | 30 ++++++++++----- superset-frontend/src/stacklet/appSelector.ts | 37 +++++++++++-------- 3 files changed, 46 insertions(+), 26 deletions(-) diff --git a/superset-frontend/src/stacklet/StackletSidebar.tsx b/superset-frontend/src/stacklet/StackletSidebar.tsx index 91ea1ed03ac4..cde0de2c57a1 100644 --- a/superset-frontend/src/stacklet/StackletSidebar.tsx +++ b/superset-frontend/src/stacklet/StackletSidebar.tsx @@ -35,7 +35,7 @@ import '@fontsource-variable/dm-sans'; import getBootstrapData from 'src/utils/getBootstrapData'; import type { MenuData } from 'src/types/bootstrapTypes'; -import { getAppSelectorOptions, SUPERSET_APP_NAME } from './appSelector'; +import { getAppSelectorOptions, getSupersetAppName } from './appSelector'; import { buildNavItems, resolveActiveNavToken } from './menuItems'; // The design system's stylesheet with every rule pre-scoped under // `.stacklet-ui-scope` — the raw dist/ui.css would restyle all of Superset @@ -258,6 +258,7 @@ export default function StackletSidebar({ [data, user], ); const appSelectorOptions = useMemo(() => getAppSelectorOptions(), []); + const supersetAppName = useMemo(() => getSupersetAppName(), []); const signInMenu = useCurrentUserMenu(data, collapsed, themeControl); // See resolveActiveNavToken: a virtual token stands in for the pathname so // exactly one nav item is highlighted, query-aware for filtered presets. @@ -276,7 +277,7 @@ export default function StackletSidebar({ navItems={navItems} navigate={navigate} pathname={activeToken} - selectedApp={SUPERSET_APP_NAME} + selectedApp={supersetAppName} SignInMenu={signInMenu} variant="grouped" /> diff --git a/superset-frontend/src/stacklet/appSelector.test.ts b/superset-frontend/src/stacklet/appSelector.test.ts index 37fe84cbc914..c8480d312336 100644 --- a/superset-frontend/src/stacklet/appSelector.test.ts +++ b/superset-frontend/src/stacklet/appSelector.test.ts @@ -17,7 +17,7 @@ * under the License. */ import getBootstrapData from 'src/utils/getBootstrapData'; -import { getAppSelectorOptions, SUPERSET_APP_NAME } from './appSelector'; +import { getAppSelectorOptions, getSupersetAppName } from './appSelector'; jest.mock('src/utils/getBootstrapData', () => jest.fn()); @@ -26,7 +26,7 @@ const mockedBootstrap = getBootstrapData as jest.Mock; const bootstrapWith = (common: object) => mockedBootstrap.mockReturnValue({ common }); -test('builds entries from the platform-injected stacklet.urls', () => { +test('brands itself "AssetDB (Preview)" while the Redash-backed AssetDB exists', () => { bootstrapWith({ stacklet: { urls: { @@ -37,8 +37,9 @@ test('builds entries from the platform-injected stacklet.urls', () => { }, }, }); + expect(getSupersetAppName()).toBe('AssetDB (Preview)'); expect(getAppSelectorOptions()).toEqual([ - { label: SUPERSET_APP_NAME, href: '', isBeta: false }, + { label: 'AssetDB (Preview)', href: '', isBeta: false }, { label: 'AssetDB', href: 'https://redash.acme.stacklet.io', @@ -53,20 +54,31 @@ test('builds entries from the platform-injected stacklet.urls', () => { ]); }); -test('omits siblings whose URL is not configured', () => { +test('brands itself plain "AssetDB" when Redash is not deployed', () => { bootstrapWith({ - stacklet: { urls: { console: 'https://console.acme.stacklet.io' } }, + stacklet: { + urls: { + console: 'https://console.acme.stacklet.io', + superset: 'https://superset.acme.stacklet.io', + }, + }, }); - expect(getAppSelectorOptions().map(option => option.label)).toEqual([ - SUPERSET_APP_NAME, - 'Console', + expect(getSupersetAppName()).toBe('AssetDB'); + expect(getAppSelectorOptions()).toEqual([ + { label: 'AssetDB', href: '', isBeta: false }, + { + label: 'Console', + href: 'https://console.acme.stacklet.io', + isBeta: false, + }, ]); }); test('falls back to the dev platform when the payload has no stacklet.urls', () => { bootstrapWith({}); + // The dev fallback includes a Redash URL, so the Preview name applies expect(getAppSelectorOptions()).toEqual([ - { label: SUPERSET_APP_NAME, href: '', isBeta: false }, + { label: 'AssetDB (Preview)', href: '', isBeta: false }, { label: 'AssetDB', href: 'https://redash.dev.stacklet.dev', diff --git a/superset-frontend/src/stacklet/appSelector.ts b/superset-frontend/src/stacklet/appSelector.ts index b195edfe786a..b299d665e34c 100644 --- a/superset-frontend/src/stacklet/appSelector.ts +++ b/superset-frontend/src/stacklet/appSelector.ts @@ -18,15 +18,6 @@ */ import getBootstrapData from 'src/utils/getBootstrapData'; -/** - * How this Superset deployment is branded in the Stacklet platform's app - * switcher (Design Kit v2, node 6820-6796). Distinct from the Redash-backed - * "AssetDB", which the other apps still link to alongside this one. Also part - * of @stacklet/ui's `V2AppName` union, so it can be passed to the Sidebar - * without casts. - */ -export const SUPERSET_APP_NAME = 'AssetDB v2'; - export interface StackletAppOption { label: string; href: string; @@ -56,17 +47,33 @@ const DEV_FALLBACK_URLS: Partial> = { sinistral: 'https://sinistral.dev.stacklet.dev', }; +function getStackletUrls(): Partial> { + const common = getBootstrapData().common as StackletBootstrapExtras; + return common?.stacklet?.urls ?? DEV_FALLBACK_URLS; +} + +/** + * How this Superset deployment is branded in the Stacklet platform's app + * switcher (Design Kit v2, node 6820-6796). Plain "AssetDB" once it is the + * only AssetDB in the environment; "(Preview)" while the Redash-backed + * AssetDB is still deployed alongside it. Both names are part of + * @stacklet/ui's `V2AppName` union, so the result can be passed to the + * Sidebar without casts. + */ +export function getSupersetAppName(): 'AssetDB' | 'AssetDB (Preview)' { + return getStackletUrls().redash ? 'AssetDB (Preview)' : 'AssetDB'; +} + /** * Builds the app switcher entries for the Stacklet sidebar. Superset itself - * (branded AssetDB v2) is always present and selected; siblings — including the - * Redash-backed "AssetDB" — appear only when their URL is configured. The - * Sidebar renders the selected app first regardless of this order. + * is always present and selected; siblings — including the Redash-backed + * "AssetDB" — appear only when their URL is configured. The Sidebar renders + * the selected app first regardless of this order. */ export function getAppSelectorOptions(): StackletAppOption[] { - const common = getBootstrapData().common as StackletBootstrapExtras; - const urls = common?.stacklet?.urls ?? DEV_FALLBACK_URLS; + const urls = getStackletUrls(); return [ - { label: SUPERSET_APP_NAME, href: '', isBeta: false }, + { label: getSupersetAppName(), href: '', isBeta: false }, ...(urls.redash ? [{ label: 'AssetDB', href: urls.redash, isBeta: false }] : []), From e1a8778a18f4cb307eb5e835544c511dc445a089 Mon Sep 17 00:00:00 2001 From: Dariusz Szymczyk Date: Tue, 11 Aug 2026 11:18:21 +0200 Subject: [PATCH 4/7] style(stacklet): fit the AssetDB (Preview) pill in the sidebar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The longer name overflows the app-selector pill past the sidebar edge with the component defaults. Tighten the header row's padding and gap, drop the label to 12px, and center-align the trigger so the tile icon sits level with the smaller text — as Superset-local CSS on top of the scoped stylesheet, keyed on the trigger's aria-label rather than minified utility classes, so the shared @stacklet/ui component stays untouched. fixes: ENG-8329 --- .../src/stacklet/StackletSidebar.tsx | 4 ++ .../src/stacklet/stackletSidebarOverrides.css | 44 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 superset-frontend/src/stacklet/stackletSidebarOverrides.css diff --git a/superset-frontend/src/stacklet/StackletSidebar.tsx b/superset-frontend/src/stacklet/StackletSidebar.tsx index cde0de2c57a1..72adb4aad199 100644 --- a/superset-frontend/src/stacklet/StackletSidebar.tsx +++ b/superset-frontend/src/stacklet/StackletSidebar.tsx @@ -42,6 +42,10 @@ import { buildNavItems, resolveActiveNavToken } from './menuItems'; // (Tailwind preflight + global html/body rules). import '@stacklet/ui/dist/ui.scoped.css'; +// Superset-local layout/type tweaks so "AssetDB (Preview)" fits the sidebar; +// must come after the scoped stylesheet to win the cascade. +import './stackletSidebarOverrides.css'; + /** Matches the sidebar widths baked into the V2Sidebar component. */ export const SIDEBAR_WIDTH = '13.625rem'; export const SIDEBAR_COLLAPSED_WIDTH = '4.5rem'; diff --git a/superset-frontend/src/stacklet/stackletSidebarOverrides.css b/superset-frontend/src/stacklet/stackletSidebarOverrides.css new file mode 100644 index 000000000000..6d174ee12a1e --- /dev/null +++ b/superset-frontend/src/stacklet/stackletSidebarOverrides.css @@ -0,0 +1,44 @@ +/** + * 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. + */ + +/* + * Superset-local tweaks on top of @stacklet/ui's scoped stylesheet (imported + * right before this file in StackletSidebar.tsx), so the "AssetDB (Preview)" + * app-selector pill fits the sidebar without touching the shared component. + * Anchored on the trigger's aria-label rather than the dist's utility class + * names, which are minified build artifacts. + */ + +/* Header row holding the logo and the app selector: tighter padding and gap + than the component defaults, freeing width for the longer name. */ +.stacklet-ui-scope div:has(> div > button[aria-label^='App selector']) { + padding: 16px; + column-gap: 6px; +} + +/* The trigger lays out label and tile icon on the text baseline; with the + smaller type below the icon rides too high, so center-align instead. */ +.stacklet-ui-scope button[aria-label^='App selector'] { + align-items: center; +} + +/* Smaller label type so the full name fits the expanded sidebar width. */ +.stacklet-ui-scope button[aria-label^='App selector'] .whitespace-nowrap { + font-size: 12px; +} From e16b3c569ed47e80ab74cd0178f602ced61ed2fc Mon Sep 17 00:00:00 2001 From: Dariusz Szymczyk Date: Tue, 11 Aug 2026 11:25:28 +0200 Subject: [PATCH 5/7] style(stacklet): scope the sidebar fit overrides to the Preview branding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Shrink the logo to 24px alongside the smaller type, and apply the whole override set only while the Redash-backed AssetDB exists — a `stacklet-preview-branding` class stamped on the scope wrapper gates the CSS, so the plain "AssetDB" branding keeps the component defaults. Both the class and the stylesheet are marked for removal with Redash. fixes: ENG-8329 --- .../src/stacklet/StackletSidebar.tsx | 10 +++++- .../src/stacklet/stackletSidebarOverrides.css | 34 +++++++++++++++---- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/superset-frontend/src/stacklet/StackletSidebar.tsx b/superset-frontend/src/stacklet/StackletSidebar.tsx index 72adb4aad199..6227ef52bbc4 100644 --- a/superset-frontend/src/stacklet/StackletSidebar.tsx +++ b/superset-frontend/src/stacklet/StackletSidebar.tsx @@ -271,8 +271,16 @@ export default function StackletSidebar({ [navItems, pathname, search], ); + // TEMPORARY — remove together with stackletSidebarOverrides.css once the + // Redash-backed AssetDB is retired: only the longer "AssetDB (Preview)" + // branding needs the sizing overrides that class scopes. + const scopeClassName = + supersetAppName === 'AssetDB (Preview)' + ? 'stacklet-ui-scope stacklet-preview-branding' + : 'stacklet-ui-scope'; + return ( -
+
div > button[aria-label^='App selector']) { +.stacklet-ui-scope.stacklet-preview-branding + div:has(> div > button[aria-label^='App selector']) { padding: 16px; column-gap: 6px; } +/* Slightly smaller logo, matching the reduced type next to it. */ +.stacklet-ui-scope.stacklet-preview-branding + div:has(> div > button[aria-label^='App selector']) + > a + > svg { + width: 24px; + height: auto; +} + /* The trigger lays out label and tile icon on the text baseline; with the smaller type below the icon rides too high, so center-align instead. */ -.stacklet-ui-scope button[aria-label^='App selector'] { +.stacklet-ui-scope.stacklet-preview-branding + button[aria-label^='App selector'] { align-items: center; } /* Smaller label type so the full name fits the expanded sidebar width. */ -.stacklet-ui-scope button[aria-label^='App selector'] .whitespace-nowrap { +.stacklet-ui-scope.stacklet-preview-branding + button[aria-label^='App selector'] + .whitespace-nowrap { font-size: 12px; } From 8a7635f51c1b2016e04c489a6917ad286938d046 Mon Sep 17 00:00:00 2001 From: Dariusz Szymczyk Date: Thu, 13 Aug 2026 08:55:26 +0200 Subject: [PATCH 6/7] chore(stacklet): bump @stacklet/ui to 2.16.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2.16.0 widens `V2AppName` with "AssetDB (Preview)" (stacklet/platform-ui#3317), which this branch's `selectedApp` needs — `tsc --noEmit` now passes. npm moved the dependency into alphabetical order while resolving it. fixes: ENG-8329 --- superset-frontend/package-lock.json | 153 +++++++++------------------- superset-frontend/package.json | 2 +- 2 files changed, 48 insertions(+), 107 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index d80c4535cd8b..f9e542c57366 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -43,7 +43,7 @@ "@rjsf/utils": "^5.24.3", "@rjsf/validator-ajv8": "^5.24.13", "@scarf/scarf": "^1.4.0", - "@stacklet/ui": "^2.15.0", + "@stacklet/ui": "^2.16.0", "@superset-ui/chart-controls": "file:./packages/superset-ui-chart-controls", "@superset-ui/core": "file:./packages/superset-ui-core", "@superset-ui/legacy-plugin-chart-calendar": "file:./plugins/legacy-plugin-chart-calendar", @@ -10471,9 +10471,9 @@ } }, "node_modules/@stacklet/ui": { - "version": "2.15.0", - "resolved": "https://stacklet-653993915282.d.codeartifact.us-east-1.amazonaws.com/npm/stacklet.client.ui/@stacklet/ui/-/ui-2.15.0.tgz", - "integrity": "sha512-QMHi0UPl0X2K74g929xR6luaBrAM+Dfegljgx3rIrPBShBkPmV6keqXMTWpwJLBMUJY0T2ulN2USEiyB6VQ3Pw==", + "version": "2.16.0", + "resolved": "https://stacklet-653993915282.d.codeartifact.us-east-1.amazonaws.com/npm/stacklet.client.ui/@stacklet/ui/-/ui-2.16.0.tgz", + "integrity": "sha512-sGKpXtMKpIFXr6H1mrgeoxFOhMhZvq0hI08YQvaZbFoPUcJSg/NC45qJz23gE7lxdBJNjRJ7b6FsTsdCFT4OWg==", "hasInstallScript": true, "license": "UNLICENSED", "dependencies": { @@ -22688,6 +22688,15 @@ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", "license": "ISC" }, + "node_modules/d3-cloud": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.9.tgz", + "integrity": "sha512-leL1GLneC9ZQtnV+6TGWrNlGfI1WX7S2arcTv2vae12DaXo5wjm6GBCkskXbrDlyOymd/A75Pyj1H37MW4BZ/Q==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-dispatch": "^1.0.3" + } + }, "node_modules/d3-collection": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", @@ -34458,21 +34467,6 @@ } } }, - "node_modules/jsdom/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/jsdom/node_modules/agent-base": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", @@ -43781,6 +43775,40 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, + "node_modules/react-syntax-highlighter": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.1.tgz", + "integrity": "sha512-PjVawBGy80C6YbC5DDZJeUjBmC7skaoEUdvfFQediQHgCL7aKyVHe57SaJGfQsloGDac+gCpTfRdtxzWWKmCXA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-syntax-highlighter/node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/react-table": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", @@ -51721,21 +51749,6 @@ } } }, - "node_modules/whatwg-url/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/whatwg-url/node_modules/webidl-conversions": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", @@ -53142,17 +53155,6 @@ "@types/unist": "^2" } }, - "packages/superset-ui-core/node_modules/core-js": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", - "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "packages/superset-ui-core/node_modules/d3-format": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", @@ -53174,20 +53176,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/superset-ui-core/node_modules/lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", - "license": "MIT", - "dependencies": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "packages/superset-ui-core/node_modules/mdast-util-find-and-replace": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", @@ -53985,26 +53973,6 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "packages/superset-ui-core/node_modules/react-syntax-highlighter": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.0.tgz", - "integrity": "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.28.4", - "highlight.js": "^10.4.1", - "highlightjs-vue": "^1.0.0", - "lowlight": "^1.17.0", - "prismjs": "^1.30.0", - "refractor": "^5.0.0" - }, - "engines": { - "node": ">= 16.20.2" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, "packages/superset-ui-core/node_modules/remark-gfm": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", @@ -54185,12 +54153,6 @@ "node": ">=12" } }, - "plugins/legacy-plugin-chart-horizon/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, "plugins/legacy-plugin-chart-map-box": { "name": "@superset-ui/legacy-plugin-chart-map-box", "version": "0.20.3", @@ -54413,18 +54375,6 @@ "node": ">=12" } }, - "plugins/legacy-preset-chart-deckgl/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, - "plugins/legacy-preset-chart-deckgl/node_modules/underscore": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", - "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", - "license": "MIT" - }, "plugins/legacy-preset-chart-nvd3": { "name": "@superset-ui/legacy-preset-chart-nvd3", "version": "0.20.3", @@ -54697,15 +54647,6 @@ "@types/d3-time": "*" } }, - "plugins/plugin-chart-word-cloud/node_modules/d3-cloud": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.8.tgz", - "integrity": "sha512-K0qBFkgystNlgFW/ufdwIES5kDiC8cGJxMw4ULzN9UU511v89A6HXs1X8vUPxqurehzqJZS5KzZI4c8McT+4UA==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "^1.0.3" - } - }, "tools/eslint-i18n-strings": { "version": "1.0.0", "extraneous": true, diff --git a/superset-frontend/package.json b/superset-frontend/package.json index 69e1616907ac..ee4032c8588f 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -125,6 +125,7 @@ "@rjsf/utils": "^5.24.3", "@rjsf/validator-ajv8": "^5.24.13", "@scarf/scarf": "^1.4.0", + "@stacklet/ui": "^2.16.0", "@superset-ui/chart-controls": "file:./packages/superset-ui-chart-controls", "@superset-ui/core": "file:./packages/superset-ui-core", "@superset-ui/legacy-plugin-chart-calendar": "file:./plugins/legacy-plugin-chart-calendar", @@ -146,7 +147,6 @@ "@superset-ui/plugin-chart-pivot-table": "file:./plugins/plugin-chart-pivot-table", "@superset-ui/plugin-chart-table": "file:./plugins/plugin-chart-table", "@superset-ui/plugin-chart-word-cloud": "file:./plugins/plugin-chart-word-cloud", - "@stacklet/ui": "^2.15.0", "@superset-ui/switchboard": "file:./packages/superset-ui-switchboard", "@types/d3-format": "^3.0.1", "@types/d3-selection": "^3.0.11", From f3f8770ab99deeb003b5f0eb14019748b9b49ea0 Mon Sep 17 00:00:00 2001 From: Dariusz Szymczyk Date: Thu, 13 Aug 2026 09:02:13 +0200 Subject: [PATCH 7/7] fix(stacklet): regenerate the lockfile with npm 10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous commit's lockfile was written by npm 11, whose dedupe drops nested entries npm 10 still expects, so `npm ci` in the image (npm 10.8.2) refused it — "Missing: @noble/hashes@2.3.0 from lock file" — and the frontend build then failed on a missing cross-env. Regenerated with npm 10 under node 22 per the repo's engines, reducing the diff to the @stacklet/ui bump alone. Verified with `npm ci --dry-run` on npm 10.8.2. fixes: ENG-8329 --- superset-frontend/package-lock.json | 145 +++++++++++++++++++--------- 1 file changed, 102 insertions(+), 43 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index f9e542c57366..f65873c10df0 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -22688,15 +22688,6 @@ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", "license": "ISC" }, - "node_modules/d3-cloud": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.9.tgz", - "integrity": "sha512-leL1GLneC9ZQtnV+6TGWrNlGfI1WX7S2arcTv2vae12DaXo5wjm6GBCkskXbrDlyOymd/A75Pyj1H37MW4BZ/Q==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "^1.0.3" - } - }, "node_modules/d3-collection": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", @@ -34467,6 +34458,21 @@ } } }, + "node_modules/jsdom/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/jsdom/node_modules/agent-base": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", @@ -43775,40 +43781,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/react-syntax-highlighter": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.1.tgz", - "integrity": "sha512-PjVawBGy80C6YbC5DDZJeUjBmC7skaoEUdvfFQediQHgCL7aKyVHe57SaJGfQsloGDac+gCpTfRdtxzWWKmCXA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.28.4", - "highlight.js": "^10.4.1", - "highlightjs-vue": "^1.0.0", - "lowlight": "^1.17.0", - "prismjs": "^1.30.0", - "refractor": "^5.0.0" - }, - "engines": { - "node": ">= 16.20.2" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, - "node_modules/react-syntax-highlighter/node_modules/lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", - "license": "MIT", - "dependencies": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/react-table": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", @@ -51749,6 +51721,21 @@ } } }, + "node_modules/whatwg-url/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/whatwg-url/node_modules/webidl-conversions": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", @@ -53155,6 +53142,17 @@ "@types/unist": "^2" } }, + "packages/superset-ui-core/node_modules/core-js": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", + "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "packages/superset-ui-core/node_modules/d3-format": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", @@ -53176,6 +53174,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/superset-ui-core/node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "packages/superset-ui-core/node_modules/mdast-util-find-and-replace": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", @@ -53973,6 +53985,26 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "packages/superset-ui-core/node_modules/react-syntax-highlighter": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.0.tgz", + "integrity": "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, "packages/superset-ui-core/node_modules/remark-gfm": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", @@ -54153,6 +54185,12 @@ "node": ">=12" } }, + "plugins/legacy-plugin-chart-horizon/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, "plugins/legacy-plugin-chart-map-box": { "name": "@superset-ui/legacy-plugin-chart-map-box", "version": "0.20.3", @@ -54375,6 +54413,18 @@ "node": ">=12" } }, + "plugins/legacy-preset-chart-deckgl/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "plugins/legacy-preset-chart-deckgl/node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "license": "MIT" + }, "plugins/legacy-preset-chart-nvd3": { "name": "@superset-ui/legacy-preset-chart-nvd3", "version": "0.20.3", @@ -54647,6 +54697,15 @@ "@types/d3-time": "*" } }, + "plugins/plugin-chart-word-cloud/node_modules/d3-cloud": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.8.tgz", + "integrity": "sha512-K0qBFkgystNlgFW/ufdwIES5kDiC8cGJxMw4ULzN9UU511v89A6HXs1X8vUPxqurehzqJZS5KzZI4c8McT+4UA==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-dispatch": "^1.0.3" + } + }, "tools/eslint-i18n-strings": { "version": "1.0.0", "extraneous": true,