From 2265bed20f4fcb4ddc2e72ffa8cc46e551c8c2b4 Mon Sep 17 00:00:00 2001 From: git-action Date: Fri, 21 Aug 2026 16:13:56 +0000 Subject: [PATCH 1/2] =?UTF-8?q?chore:=20sync=20sdk/=20from=20gdc-ui=20?= =?UTF-8?q?=E2=86=92=20gooddata-ui-sdk/=20(c37e029)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit risk: low --- ...reset-automations_2026-08-20-14-35-00.json | 10 + ...message-flex-squeeze_2026-08-21-12-30.json | 10 + ...iscarded-commands_2026-08-20-22-30-00.json | 11 - .../sha-master_2026-08-21-13-00-00.json | 10 + ...filter-view-override_2026-08-20-12-00.json | 10 + common/config/rush/pnpm-lock.yaml | 176 +++++++------- common/config/rush/version-policies.json | 4 +- common/scripts/install-run-rush.js | 2 + common/scripts/install-run.js | 2 + examples/playground/package.json | 2 +- .../examples-template/package.json | 2 +- .../example-attributefilter/package.json | 2 +- .../examples/example-chartconfig/package.json | 2 +- .../examples/example-columnchart/package.json | 2 +- .../examples/example-combochart/package.json | 2 +- .../examples/example-dashboard/package.json | 2 +- .../examples/example-datefilter/package.json | 2 +- .../example-dependentfilters/package.json | 2 +- .../examples/example-execute/package.json | 2 +- .../examples/example-granularity/package.json | 2 +- .../examples/example-headline/package.json | 2 +- .../examples/example-pivottable/package.json | 2 +- .../example-relativedatefilter/package.json | 2 +- .../examples/example-repeater/package.json | 2 +- .../sdk-interactive-examples/package.json | 2 +- libs/api-client-tiger/package.json | 2 +- .../api/sdk-backend-base.api.md | 1 + libs/sdk-backend-base/package.json | 2 +- .../src/cachingBackend/index.ts | 10 + .../cachingBackend/tests/withCaching.test.ts | 45 ++++ libs/sdk-backend-mockingbird/package.json | 2 +- libs/sdk-backend-spi/package.json | 2 +- libs/sdk-backend-tiger/package.json | 2 +- .../src/backend/workspace/dashboards/index.ts | 42 ++-- .../workspace/dashboards/tests/index.test.ts | 45 +++- libs/sdk-code-convertors/package.json | 2 +- .../sdk-code-convertors/python/pyproject.toml | 2 +- libs/sdk-code-schemas/package.json | 2 +- libs/sdk-e2e-utils/package.json | 2 +- libs/sdk-embedding/package.json | 2 +- libs/sdk-model/api/sdk-model.api.md | 6 + libs/sdk-model/package.json | 2 +- libs/sdk-model/src/dashboard/filterContext.ts | 40 ++++ .../src/dashboard/test/filterContext.test.ts | 67 ++++++ libs/sdk-model/src/index.ts | 2 + .../package.json | 2 +- libs/sdk-ui-all/package.json | 2 +- libs/sdk-ui-application-header/package.json | 2 +- libs/sdk-ui-catalog/package.json | 2 +- libs/sdk-ui-charts/package.json | 2 +- .../api/sdk-ui-dashboard.api.md | 2 +- libs/sdk-ui-dashboard/package.json | 2 +- .../dashboard/common/filterViews.ts | 11 + .../common/tests/filterViews.test.ts | 110 ++++++++- .../initializeDashboardHandler/index.ts | 2 +- .../dashboard/resetDashboardHandler.ts | 6 +- .../src/model/events/general.ts | 22 +- .../useInitializeDashboardStore.test.tsx | 215 ------------------ .../react/useInitializeDashboardStore.ts | 43 +--- .../model/store/_infra/rootCommandHandler.ts | 60 +---- .../_infra/tests/commandCancellation.test.ts | 182 --------------- .../src/model/store/dashboardStore.ts | 23 +- .../src/presentation/dashboard/types.ts | 2 - libs/sdk-ui-ext/package.json | 2 +- libs/sdk-ui-filters/package.json | 2 +- libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md | 2 +- libs/sdk-ui-gen-ai/package.json | 2 +- .../completion/plugins/rehype-references.ts | 1 + .../src/components/completion/references.ts | 7 +- .../src/components/completion/utils.ts | 18 +- libs/sdk-ui-gen-ai/src/model.ts | 2 +- libs/sdk-ui-gen-ai/styles/scss/messages.scss | 42 +++- libs/sdk-ui-gen-ai/styles/scss/variables.scss | 1 + libs/sdk-ui-geo/package.json | 2 +- libs/sdk-ui-kit/package.json | 2 +- libs/sdk-ui-kit/styles/icons/dataset.svg | 3 + libs/sdk-ui-kit/styles/scss/messages.scss | 4 +- libs/sdk-ui-loaders/package.json | 2 +- libs/sdk-ui-pivot/package.json | 2 +- .../sdk-ui-pluggable-application/package.json | 2 +- libs/sdk-ui-pluggable-host/package.json | 2 +- libs/sdk-ui-semantic-search/package.json | 2 +- libs/sdk-ui-tests-app/package.json | 2 +- libs/sdk-ui-tests-e2e/package.json | 2 +- .../package.json | 2 +- libs/sdk-ui-tests-scenarios/package.json | 2 +- libs/sdk-ui-tests-storybook/package.json | 2 +- libs/sdk-ui-theme-provider/package.json | 2 +- libs/sdk-ui-vis-commons/package.json | 2 +- libs/sdk-ui-web-components/package.json | 2 +- libs/sdk-ui/package.json | 2 +- libs/util/package.json | 2 +- .../pluggable-module/harness/package.json | 2 +- .../pluggable-module/module/package.json | 2 +- tools/app-toolkit/package.json | 2 +- tools/catalog-export/package.json | 2 +- tools/create-pluggable-module/package.json | 2 +- tools/dashboard-plugin-template/package.json | 2 +- tools/eslint-config/package.json | 2 +- tools/i18n-toolkit/package.json | 2 +- tools/lint-config/package.json | 2 +- tools/mock-handling/package.json | 2 +- tools/oxlint-config/package.json | 2 +- tools/plugin-toolkit/package.json | 2 +- tools/react-app-template/package.json | 2 +- tools/reference-workspace-mgmt/package.json | 2 +- tools/reference-workspace/package.json | 2 +- tools/stylelint-config/package.json | 2 +- 108 files changed, 640 insertions(+), 749 deletions(-) create mode 100644 common/changes/@gooddata/sdk-ui-all/ikoz-fi-EB-904-cachecontrol-reset-automations_2026-08-20-14-35-00.json create mode 100644 common/changes/@gooddata/sdk-ui-all/jsc-improvements-message-flex-squeeze_2026-08-21-12-30.json delete mode 100644 common/changes/@gooddata/sdk-ui-all/qduy-mcmic-3656-report-discarded-commands_2026-08-20-22-30-00.json create mode 100644 common/changes/@gooddata/sdk-ui-all/sha-master_2026-08-21-13-00-00.json create mode 100644 common/changes/@gooddata/sdk-ui-all/zo-f1-2764-export-filter-view-override_2026-08-20-12-00.json delete mode 100644 libs/sdk-ui-dashboard/src/model/react/tests/useInitializeDashboardStore.test.tsx delete mode 100644 libs/sdk-ui-dashboard/src/model/store/_infra/tests/commandCancellation.test.ts create mode 100644 libs/sdk-ui-kit/styles/icons/dataset.svg diff --git a/common/changes/@gooddata/sdk-ui-all/ikoz-fi-EB-904-cachecontrol-reset-automations_2026-08-20-14-35-00.json b/common/changes/@gooddata/sdk-ui-all/ikoz-fi-EB-904-cachecontrol-reset-automations_2026-08-20-14-35-00.json new file mode 100644 index 00000000000..ed6072fd9b7 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/ikoz-fi-EB-904-cachecontrol-reset-automations_2026-08-20-14-35-00.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-backend-base: CacheControl now exposes resetAutomations to invalidate the workspace automations cache, and resetAll clears it together with the other caches.", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/jsc-improvements-message-flex-squeeze_2026-08-21-12-30.json b/common/changes/@gooddata/sdk-ui-all/jsc-improvements-message-flex-squeeze_2026-08-21-12-30.json new file mode 100644 index 00000000000..9074c14288c --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/jsc-improvements-message-flex-squeeze_2026-08-21-12-30.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-kit: Fix the message component being squeezed below its own content when it is a flex item, which collapsed a message to a few pixels and clipped its text next to a scrollable list in a dialog.", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/qduy-mcmic-3656-report-discarded-commands_2026-08-20-22-30-00.json b/common/changes/@gooddata/sdk-ui-all/qduy-mcmic-3656-report-discarded-commands_2026-08-20-22-30-00.json deleted file mode 100644 index 5d7812e657b..00000000000 --- a/common/changes/@gooddata/sdk-ui-all/qduy-mcmic-3656-report-discarded-commands_2026-08-20-22-30-00.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "changes": [ - { - "comment": "sdk-ui-dashboard: A dashboard command discarded by a store re-initialization now reports a failure instead of vanishing. A PDF export that had already finished on the backend used to leave \"Preparing PDF export...\" on screen with the export button disabled until the page was reloaded; a discarded command now emits COMMAND.FAILED with a new CANCELLED reason and rejects the promise of a promise-based caller, whether it was in flight or still queued. Changing the eventHandlers prop no longer rebuilds the dashboard either - added and removed handlers are registered and unregistered by identity.", - "type": "patch", - "packageName": "@gooddata/sdk-ui-all" - } - ], - "packageName": "@gooddata/sdk-ui-all", - "email": "duyquan.bui@gooddata.com" -} diff --git a/common/changes/@gooddata/sdk-ui-all/sha-master_2026-08-21-13-00-00.json b/common/changes/@gooddata/sdk-ui-all/sha-master_2026-08-21-13-00-00.json new file mode 100644 index 00000000000..2b5c121945d --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/sha-master_2026-08-21-13-00-00.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-gen-ai: Update design of references in ai assistant.", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/zo-f1-2764-export-filter-view-override_2026-08-20-12-00.json b/common/changes/@gooddata/sdk-ui-all/zo-f1-2764-export-filter-view-override_2026-08-20-12-00.json new file mode 100644 index 00000000000..3bae0e3d408 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/zo-f1-2764-export-filter-view-override_2026-08-20-12-00.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-all: Visual exports (PDF, PPTX) keep the filters applied on screen even when a default saved filter view exists", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index dea504d1c47..119a3be6fbc 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -4,13 +4,16 @@ settings: autoInstallPeers: false excludeLinksFromLockfile: false +overrides: + minimatch@>=10.0.0 <10.2.3: 10.2.5 + pnpmfileChecksum: sha256-E1T7OJ3DLTjpDqf4RdJzK9VDtAxgm4gDEQCLYdHD8nI= importers: .: {} - ../../examples/playground: + ../../../sdk/examples/playground: devDependencies: '@codemirror/state': specifier: 6.5.3 @@ -169,13 +172,13 @@ importers: specifier: 8.0.16 version: 8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../examples/sdk-interactive-examples: + ../../../sdk/examples/sdk-interactive-examples: devDependencies: validate-npm-package-name: specifier: ^5.0.0 version: 5.0.1 - ../../examples/sdk-interactive-examples/examples-template: + ../../../sdk/examples/sdk-interactive-examples/examples-template: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -311,7 +314,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-attributefilter: + ../../../sdk/examples/sdk-interactive-examples/examples/example-attributefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -447,7 +450,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-chartconfig: + ../../../sdk/examples/sdk-interactive-examples/examples/example-chartconfig: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -583,7 +586,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-columnchart: + ../../../sdk/examples/sdk-interactive-examples/examples/example-columnchart: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -719,7 +722,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-combochart: + ../../../sdk/examples/sdk-interactive-examples/examples/example-combochart: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -855,7 +858,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-dashboard: + ../../../sdk/examples/sdk-interactive-examples/examples/example-dashboard: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -991,7 +994,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-datefilter: + ../../../sdk/examples/sdk-interactive-examples/examples/example-datefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1127,7 +1130,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-dependentfilters: + ../../../sdk/examples/sdk-interactive-examples/examples/example-dependentfilters: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1263,7 +1266,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-execute: + ../../../sdk/examples/sdk-interactive-examples/examples/example-execute: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1408,7 +1411,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-granularity: + ../../../sdk/examples/sdk-interactive-examples/examples/example-granularity: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1544,7 +1547,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-headline: + ../../../sdk/examples/sdk-interactive-examples/examples/example-headline: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1680,7 +1683,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-pivottable: + ../../../sdk/examples/sdk-interactive-examples/examples/example-pivottable: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1816,7 +1819,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-relativedatefilter: + ../../../sdk/examples/sdk-interactive-examples/examples/example-relativedatefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1952,7 +1955,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../examples/sdk-interactive-examples/examples/example-repeater: + ../../../sdk/examples/sdk-interactive-examples/examples/example-repeater: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -2088,7 +2091,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../libs/api-client-tiger: + ../../../sdk/libs/api-client-tiger: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2191,7 +2194,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-backend-base: + ../../../sdk/libs/sdk-backend-base: dependencies: '@braintree/sanitize-url': specifier: ^6.0.0 @@ -2303,7 +2306,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-backend-mockingbird: + ../../../sdk/libs/sdk-backend-mockingbird: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -2403,7 +2406,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-backend-spi: + ../../../sdk/libs/sdk-backend-spi: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2488,7 +2491,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-backend-tiger: + ../../../sdk/libs/sdk-backend-tiger: dependencies: '@gooddata/api-client-tiger': specifier: workspace:* @@ -2630,7 +2633,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-code-convertors: + ../../../sdk/libs/sdk-code-convertors: dependencies: '@gooddata/api-client-tiger': specifier: workspace:* @@ -2712,7 +2715,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-code-schemas: + ../../../sdk/libs/sdk-code-schemas: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -2787,7 +2790,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-e2e-utils: + ../../../sdk/libs/sdk-e2e-utils: dependencies: '@playwright/test': specifier: 1.62.1 @@ -2875,7 +2878,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../libs/sdk-embedding: + ../../../sdk/libs/sdk-embedding: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2960,7 +2963,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-model: + ../../../sdk/libs/sdk-model: dependencies: '@types/geojson': specifier: ^7946.0.16 @@ -3060,7 +3063,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-pluggable-application-model: + ../../../sdk/libs/sdk-pluggable-application-model: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -3139,7 +3142,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../libs/sdk-ui: + ../../../sdk/libs/sdk-ui: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -3326,7 +3329,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-all: + ../../../sdk/libs/sdk-ui-all: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -3423,7 +3426,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../libs/sdk-ui-application-header: + ../../../sdk/libs/sdk-ui-application-header: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -3580,7 +3583,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-catalog: + ../../../sdk/libs/sdk-ui-catalog: dependencies: '@babel/core': specifier: 7.28.4 @@ -3770,7 +3773,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-charts: + ../../../sdk/libs/sdk-ui-charts: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -3993,7 +3996,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-dashboard: + ../../../sdk/libs/sdk-ui-dashboard: dependencies: '@codemirror/language': specifier: 6.12.1 @@ -4264,7 +4267,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-ext: + ../../../sdk/libs/sdk-ui-ext: dependencies: '@codemirror/commands': specifier: 6.10.1 @@ -4544,7 +4547,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-filters: + ../../../sdk/libs/sdk-ui-filters: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -4743,7 +4746,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-gen-ai: + ../../../sdk/libs/sdk-ui-gen-ai: dependencies: '@codemirror/autocomplete': specifier: 6.20.0 @@ -4990,7 +4993,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-geo: + ../../../sdk/libs/sdk-ui-geo: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -5177,7 +5180,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-kit: + ../../../sdk/libs/sdk-ui-kit: dependencies: '@aaronhayes/react-use-hubspot-form': specifier: 2.1.2 @@ -5478,7 +5481,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-loaders: + ../../../sdk/libs/sdk-ui-loaders: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -5611,7 +5614,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../libs/sdk-ui-pivot: + ../../../sdk/libs/sdk-ui-pivot: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -5798,7 +5801,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-pluggable-application: + ../../../sdk/libs/sdk-ui-pluggable-application: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -5922,7 +5925,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-ui-pluggable-host: + ../../../sdk/libs/sdk-ui-pluggable-host: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -6100,7 +6103,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-semantic-search: + ../../../sdk/libs/sdk-ui-semantic-search: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -6260,7 +6263,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-tests-app: + ../../../sdk/libs/sdk-ui-tests-app: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6398,7 +6401,7 @@ importers: specifier: 8.0.16 version: 8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-ui-tests-e2e: + ../../../sdk/libs/sdk-ui-tests-e2e: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6497,7 +6500,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../libs/sdk-ui-tests-reference-workspace: + ../../../sdk/libs/sdk-ui-tests-reference-workspace: devDependencies: '@gooddata/catalog-export': specifier: workspace:* @@ -6563,7 +6566,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../libs/sdk-ui-tests-scenarios: + ../../../sdk/libs/sdk-ui-tests-scenarios: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6722,7 +6725,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-ui-tests-storybook: + ../../../sdk/libs/sdk-ui-tests-storybook: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6935,7 +6938,7 @@ importers: specifier: 4.1.0 version: 4.1.0(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../libs/sdk-ui-theme-provider: + ../../../sdk/libs/sdk-ui-theme-provider: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -7092,7 +7095,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/sdk-ui-vis-commons: + ../../../sdk/libs/sdk-ui-vis-commons: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -7261,7 +7264,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../libs/sdk-ui-web-components: + ../../../sdk/libs/sdk-ui-web-components: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -7436,7 +7439,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../libs/util: + ../../../sdk/libs/util: dependencies: lodash-es: specifier: ^4.17.23 @@ -7518,7 +7521,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../templates/pluggable-module/harness: + ../../../sdk/templates/pluggable-module/harness: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -7627,7 +7630,7 @@ importers: specifier: 8.0.16 version: 8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../templates/pluggable-module/module: + ../../../sdk/templates/pluggable-module/module: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -7760,7 +7763,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../tools/app-toolkit: + ../../../sdk/tools/app-toolkit: dependencies: '@babel/cli': specifier: ^7.23.4 @@ -7914,7 +7917,7 @@ importers: specifier: 5.107.2 version: 5.107.2(esbuild@0.28.1)(webpack-cli@7.0.3) - ../../tools/catalog-export: + ../../../sdk/tools/catalog-export: dependencies: '@babel/core': specifier: 7.28.4 @@ -8038,7 +8041,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../tools/create-pluggable-module: + ../../../sdk/tools/create-pluggable-module: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -8113,7 +8116,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../tools/dashboard-plugin-template: + ../../../sdk/tools/dashboard-plugin-template: dependencies: json-stable-stringify: specifier: 1.3.0 @@ -8309,7 +8312,7 @@ importers: specifier: 5.2.4 version: 5.2.4(tslib@2.8.1)(webpack-cli@7.0.3)(webpack@5.107.2) - ../../tools/eslint-config: + ../../../sdk/tools/eslint-config: devDependencies: '@eslint/js': specifier: 9.28.0 @@ -8405,7 +8408,7 @@ importers: specifier: ^5.2.0 version: 5.3.0(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../tools/i18n-toolkit: + ../../../sdk/tools/i18n-toolkit: dependencies: '@formatjs/cli-lib': specifier: ^6.1.1 @@ -8514,7 +8517,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../tools/lint-config: + ../../../sdk/tools/lint-config: devDependencies: '@typescript/native-preview': specifier: 7.0.0-dev.20260202.1 @@ -8529,7 +8532,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../tools/mock-handling: + ../../../sdk/tools/mock-handling: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -8638,7 +8641,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../tools/oxlint-config: + ../../../sdk/tools/oxlint-config: devDependencies: '@eslint/js': specifier: 9.28.0 @@ -8734,7 +8737,7 @@ importers: specifier: ^5.2.0 version: 5.3.0(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../tools/plugin-toolkit: + ../../../sdk/tools/plugin-toolkit: dependencies: '@babel/cli': specifier: ^7.23.4 @@ -8879,7 +8882,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../tools/react-app-template: + ../../../sdk/tools/react-app-template: dependencies: '@codemirror/state': specifier: 6.5.3 @@ -9042,7 +9045,7 @@ importers: specifier: 5.2.4 version: 5.2.4(tslib@2.8.1)(webpack-cli@7.0.3)(webpack@5.107.2) - ../../tools/reference-workspace: + ../../../sdk/tools/reference-workspace: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -9118,7 +9121,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../tools/reference-workspace-mgmt: + ../../../sdk/tools/reference-workspace-mgmt: dependencies: '@gooddata/catalog-export': specifier: workspace:* @@ -9200,7 +9203,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../tools/stylelint-config: + ../../../sdk/tools/stylelint-config: dependencies: postcss: specifier: 8.5.10 @@ -10404,14 +10407,6 @@ packages: '@internationalized/string@3.2.9': resolution: {integrity: sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==} - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.1': - resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} - engines: {node: 20 || >=22} - '@isaacs/cliui@9.0.0': resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} @@ -13345,12 +13340,10 @@ packages: cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} - deprecated: v4 is no longer maintained, upgrade to v5 cron-parser@5.6.2: resolution: {integrity: sha512-yJ/G1LVir6CnlkLI40CsampPLKl1SprGGlUagWtGJxewytRVYezv5xVyzzbT+Pvzx+VIRvZVF7/a0eEMTxdnTA==} engines: {node: '>=18'} - deprecated: 'Published tarball was built from a stale dist/ and is missing the fixes from #414 and #415 — its contents are effectively v5.6.1. Upgrade to v5.7.0.' cross-spawn@6.0.6: resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} @@ -13963,7 +13956,6 @@ packages: eslint@9.39.5: resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true peerDependencies: jiti: '*' @@ -15598,10 +15590,6 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.1.1: - resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} - engines: {node: 20 || >=22} - minimatch@10.2.3: resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} engines: {node: 18 || 20 || >=22} @@ -19430,12 +19418,6 @@ snapshots: dependencies: '@swc/helpers': 0.5.23 - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.1': - dependencies: - '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@9.0.0': {} '@isaacs/fs-minipass@4.0.1': @@ -21120,8 +21102,8 @@ snapshots: '@typescript-eslint/project-service@8.58.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) - '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) + '@typescript-eslint/types': 8.58.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -21536,11 +21518,11 @@ snapshots: acorn-loose@8.5.2: dependencies: - acorn: 8.17.0 + acorn: 8.16.0 acorn-walk@8.3.5: dependencies: - acorn: 8.17.0 + acorn: 8.16.0 acorn@8.16.0: {} @@ -23025,7 +23007,7 @@ snapshots: functional-red-black-tree: 1.0.1 jsx-ast-utils-x: 0.1.0 lodash.merge: 4.6.2 - minimatch: 10.1.1 + minimatch: 10.2.5 scslre: 0.3.0 semver: 7.7.3 typescript: 5.9.3 @@ -25004,10 +24986,6 @@ snapshots: minimalistic-assert@1.0.1: {} - minimatch@10.1.1: - dependencies: - '@isaacs/brace-expansion': 5.0.1 - minimatch@10.2.3: dependencies: brace-expansion: 5.0.8 @@ -27049,7 +27027,7 @@ snapshots: tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.24.3 + enhanced-resolve: 5.20.1 tapable: 2.3.3 tsconfig-paths: 4.2.0 diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json index 1c57181f8f1..5935b6d847d 100644 --- a/common/config/rush/version-policies.json +++ b/common/config/rush/version-policies.json @@ -2,14 +2,14 @@ { "definitionName": "lockStepVersion", "policyName": "sdk", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "nextBump": "prerelease", "mainProject": "@gooddata/sdk-ui-all" }, { "definitionName": "lockStepVersion", "policyName": "sdk-not-npm-publish", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "nextBump": "prerelease", "mainProject": "@gooddata/sdk-ui-all" } diff --git a/common/scripts/install-run-rush.js b/common/scripts/install-run-rush.js index 5b1da11a79b..4daf9508912 100644 --- a/common/scripts/install-run-rush.js +++ b/common/scripts/install-run-rush.js @@ -1,3 +1,5 @@ +// (C) 2026 GoodData Corporation + // THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. // // This script is intended for usage in an automated build environment where the Rush command may not have diff --git a/common/scripts/install-run.js b/common/scripts/install-run.js index 75d6014e61c..875968d0f25 100644 --- a/common/scripts/install-run.js +++ b/common/scripts/install-run.js @@ -1,3 +1,5 @@ +// (C) 2026 GoodData Corporation + // THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. // // This script is intended for usage in an automated build environment where a Node tool may not have diff --git a/examples/playground/package.json b/examples/playground/package.json index 020748c92b9..b25d1138c59 100644 --- a/examples/playground/package.json +++ b/examples/playground/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/playground", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": true, "description": "GoodData.UI SDK - Developer Playground", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples-template/package.json b/examples/sdk-interactive-examples/examples-template/package.json index 8c655142609..2bf0df94a10 100644 --- a/examples/sdk-interactive-examples/examples-template/package.json +++ b/examples/sdk-interactive-examples/examples-template/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-examples-template", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "GoodData interactive example template", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-attributefilter/package.json b/examples/sdk-interactive-examples/examples/example-attributefilter/package.json index f46eab86d93..5044e5e253b 100644 --- a/examples/sdk-interactive-examples/examples/example-attributefilter/package.json +++ b/examples/sdk-interactive-examples/examples/example-attributefilter/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-attributefilter", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "This example demonstrates how to use the AttributeFilter component to filter data in a visualization.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-chartconfig/package.json b/examples/sdk-interactive-examples/examples/example-chartconfig/package.json index 5529eabebef..2edca363ba0 100644 --- a/examples/sdk-interactive-examples/examples/example-chartconfig/package.json +++ b/examples/sdk-interactive-examples/examples/example-chartconfig/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-chartconfig", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "This interactive example demonstrates how to manipulate the chart config.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-columnchart/package.json b/examples/sdk-interactive-examples/examples/example-columnchart/package.json index a3bff463b1c..5f467d85b50 100644 --- a/examples/sdk-interactive-examples/examples/example-columnchart/package.json +++ b/examples/sdk-interactive-examples/examples/example-columnchart/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-columnchart", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "This example demonstrates the usage of the ColumnChart component with the viewBy and stackBy properties.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-combochart/package.json b/examples/sdk-interactive-examples/examples/example-combochart/package.json index 8de9d43d73b..27a80737258 100644 --- a/examples/sdk-interactive-examples/examples/example-combochart/package.json +++ b/examples/sdk-interactive-examples/examples/example-combochart/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-combochart", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "Example demonstrates ComboChart secondaryMeasures definition. ", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-dashboard/package.json b/examples/sdk-interactive-examples/examples/example-dashboard/package.json index a6e47287777..724aa9d2c27 100644 --- a/examples/sdk-interactive-examples/examples/example-dashboard/package.json +++ b/examples/sdk-interactive-examples/examples/example-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-dashboard", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "This example shows how to use the Dashboard component.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-datefilter/package.json b/examples/sdk-interactive-examples/examples/example-datefilter/package.json index 42bf025c07a..6599d09270f 100644 --- a/examples/sdk-interactive-examples/examples/example-datefilter/package.json +++ b/examples/sdk-interactive-examples/examples/example-datefilter/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-datefilter", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "Example demonstrates usage of Date Filter component.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json b/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json index b6cd6e2a564..d33fa5f8bb4 100644 --- a/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json +++ b/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-dependentfilters", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "This example demonstrates how to use multiple attribute filters linked together to filter data in a visualization.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-execute/package.json b/examples/sdk-interactive-examples/examples/example-execute/package.json index 31dbc339368..7ce7afea221 100644 --- a/examples/sdk-interactive-examples/examples/example-execute/package.json +++ b/examples/sdk-interactive-examples/examples/example-execute/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-execute", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "This example demonstrates using Execute component and build custom visualization.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-granularity/package.json b/examples/sdk-interactive-examples/examples/example-granularity/package.json index 9bfb46e06c6..84cc5700c42 100644 --- a/examples/sdk-interactive-examples/examples/example-granularity/package.json +++ b/examples/sdk-interactive-examples/examples/example-granularity/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-granularity", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "This example exmplains DateFilter granularity ", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-headline/package.json b/examples/sdk-interactive-examples/examples/example-headline/package.json index 51772a6ab94..53ff01a1adb 100644 --- a/examples/sdk-interactive-examples/examples/example-headline/package.json +++ b/examples/sdk-interactive-examples/examples/example-headline/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-headline", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "This example shows how to use the Headline component.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-pivottable/package.json b/examples/sdk-interactive-examples/examples/example-pivottable/package.json index ec20f40107d..d9ba384f43b 100644 --- a/examples/sdk-interactive-examples/examples/example-pivottable/package.json +++ b/examples/sdk-interactive-examples/examples/example-pivottable/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-pivottable", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "Basic PivotTable manipulation.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json b/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json index bb81f9fb628..60a5b24ef41 100644 --- a/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json +++ b/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-relativedatefilter", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "Example demonstrates how to set relative DateFilter for visualization.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-repeater/package.json b/examples/sdk-interactive-examples/examples/example-repeater/package.json index 2d2db9acf8c..62ae35c50df 100644 --- a/examples/sdk-interactive-examples/examples/example-repeater/package.json +++ b/examples/sdk-interactive-examples/examples/example-repeater/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-repeater", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "This example demonstrates how to use Repeater component.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/package.json b/examples/sdk-interactive-examples/package.json index 0f2efb881b8..a2f90bd933a 100644 --- a/examples/sdk-interactive-examples/package.json +++ b/examples/sdk-interactive-examples/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-examples", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": false, "description": "GoodData React interactive examples", "license": "LicenseRef-LICENSE", diff --git a/libs/api-client-tiger/package.json b/libs/api-client-tiger/package.json index 4e1aab83e1a..614f8556162 100644 --- a/libs/api-client-tiger/package.json +++ b/libs/api-client-tiger/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/api-client-tiger", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "API Client for GoodData Cloud and GoodData.CN", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-backend-base/api/sdk-backend-base.api.md b/libs/sdk-backend-base/api/sdk-backend-base.api.md index 813a25e50cc..514145962b0 100644 --- a/libs/sdk-backend-base/api/sdk-backend-base.api.md +++ b/libs/sdk-backend-base/api/sdk-backend-base.api.md @@ -328,6 +328,7 @@ export type CacheControl = { resetExportTemplates: () => void; resetInsights: () => void; resetMeasures: () => void; + resetAutomations: () => void; resetAll: () => void; }; diff --git a/libs/sdk-backend-base/package.json b/libs/sdk-backend-base/package.json index 1d728423fde..d1edca69179 100644 --- a/libs/sdk-backend-base/package.json +++ b/libs/sdk-backend-base/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-backend-base", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData.UI SDK - Base for backend implementations", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-backend-base/src/cachingBackend/index.ts b/libs/sdk-backend-base/src/cachingBackend/index.ts index 23b7fbc001e..876aec57ba1 100644 --- a/libs/sdk-backend-base/src/cachingBackend/index.ts +++ b/libs/sdk-backend-base/src/cachingBackend/index.ts @@ -2910,6 +2910,10 @@ function cacheControl(ctx: CachingContext): CacheControl { ctx.caches.workspaceMeasures?.clear(); }, + resetAutomations: () => { + ctx.caches.workspaceAutomations?.clear(); + }, + resetAll: () => { control.resetExecutions(); control.resetCatalogs(); @@ -2922,6 +2926,7 @@ function cacheControl(ctx: CachingContext): CacheControl { control.resetExportTemplates(); control.resetInsights(); control.resetMeasures(); + control.resetAutomations(); }, }; @@ -2997,6 +3002,11 @@ export type CacheControl = { */ resetMeasures: () => void; + /** + * Resets all workspace automation caches. + */ + resetAutomations: () => void; + /** * Convenience method to reset all caches (calls all the particular resets). */ diff --git a/libs/sdk-backend-base/src/cachingBackend/tests/withCaching.test.ts b/libs/sdk-backend-base/src/cachingBackend/tests/withCaching.test.ts index 9a833c141b4..b33e781d81b 100644 --- a/libs/sdk-backend-base/src/cachingBackend/tests/withCaching.test.ts +++ b/libs/sdk-backend-base/src/cachingBackend/tests/withCaching.test.ts @@ -990,6 +990,51 @@ describe("withCaching", () => { expect(second).not.toBe(first); }); + it("resets workspace automations list cache", () => { + let cacheControl: CacheControl | undefined; + + const backend = withCachingForTests(defaultBackend, (cc) => (cacheControl = cc)); + const first = backend.workspace("test").automations().getAutomations(); + cacheControl?.resetAutomations(); + const second = backend.workspace("test").automations().getAutomations(); + + expect(second).not.toBe(first); + }); + + it("resets workspace automations query cache", () => { + let cacheControl: CacheControl | undefined; + + const backend = withCachingForTests(defaultBackend, (cc) => (cacheControl = cc)); + const first = backend + .workspace("test") + .automations() + .getAutomationsQuery() + .withPage(2) + .withSize(5) + .query(); + cacheControl?.resetAutomations(); + const second = backend + .workspace("test") + .automations() + .getAutomationsQuery() + .withPage(2) + .withSize(5) + .query(); + + expect(second).not.toBe(first); + }); + + it("resets workspace automations cache as part of resetAll", () => { + let cacheControl: CacheControl | undefined; + + const backend = withCachingForTests(defaultBackend, (cc) => (cacheControl = cc)); + const first = backend.workspace("test").automations().getAutomations(); + cacheControl?.resetAll(); + const second = backend.workspace("test").automations().getAutomations(); + + expect(second).not.toBe(first); + }); + describe("collection items caching", () => { const collectionBaseConfig = { collectionId: "geo-collection", diff --git a/libs/sdk-backend-mockingbird/package.json b/libs/sdk-backend-mockingbird/package.json index 26fcf522ad1..eb117b257b8 100644 --- a/libs/sdk-backend-mockingbird/package.json +++ b/libs/sdk-backend-mockingbird/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-backend-mockingbird", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "Mock GoodData Backend SPI implementation", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-backend-spi/package.json b/libs/sdk-backend-spi/package.json index 3265486f2d6..034ea27479a 100644 --- a/libs/sdk-backend-spi/package.json +++ b/libs/sdk-backend-spi/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-backend-spi", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData Backend SPI abstraction interfaces", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-backend-tiger/package.json b/libs/sdk-backend-tiger/package.json index 45ba150e002..db1208324f1 100644 --- a/libs/sdk-backend-tiger/package.json +++ b/libs/sdk-backend-tiger/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-backend-tiger", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData Backend SPI implementation for GoodData Cloud and GoodData.CN", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts index 30304a5acd5..c05599dcd37 100644 --- a/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts +++ b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts @@ -103,6 +103,7 @@ import { type IWidget, type ObjRef, areObjRefsEqual, + exportOverrideFilterContextIdentifier, idRef, isFilterContext, isFilterContextDefinition, @@ -179,6 +180,26 @@ function getExportMetadataFetchCache(authCall: TigerAuthenticatedCallGuard): Map return cache; } +/** + * Builds the filter context that replaces the dashboard's persisted one during an export render, + * carrying the filters captured at export-request time. Stamped with the shared export-override + * identifier so consumers can recognize it via `isExportOverrideFilterContext`. + */ +export function buildExportOverrideFilterContext( + exportId: string, + filters: FilterContextItem[], +): IFilterContext { + const identifier = exportOverrideFilterContextIdentifier(exportId); + return { + filters, + title: `temp-filter-context-${exportId}`, + description: "temp-filter-context-description", + ref: { identifier }, + uri: `uri-${exportId}`, + identifier, + }; +} + export class TigerWorkspaceDashboards implements IWorkspaceDashboardsService { constructor( private readonly authCall: TigerAuthenticatedCallGuard, @@ -359,14 +380,7 @@ export class TigerWorkspaceDashboards implements IWorkspaceDashboardsService { const filterContextFromFilters = convertedExportMetadata?.filters ? { - filterContext: { - filters: convertedExportMetadata.filters, - title: `temp-filter-context-${exportId}`, - description: "temp-filter-context-description", - ref: { identifier: `identifier-${exportId}` }, - uri: `uri-${exportId}`, - identifier: `identifier-${exportId}`, - }, + filterContext: buildExportOverrideFilterContext(exportId, convertedExportMetadata.filters), } : undefined; @@ -375,14 +389,10 @@ export class TigerWorkspaceDashboards implements IWorkspaceDashboardsService { exportTabId && convertedExportMetadata.filtersByTab[exportTabId] ? { - filterContext: { - filters: convertedExportMetadata.filtersByTab[exportTabId], - title: `temp-filter-context-${exportId}`, - description: "temp-filter-context-description", - ref: { identifier: `identifier-${exportId}` }, - uri: `uri-${exportId}`, - identifier: `identifier-${exportId}`, - }, + filterContext: buildExportOverrideFilterContext( + exportId, + convertedExportMetadata.filtersByTab[exportTabId], + ), } : undefined; diff --git a/libs/sdk-backend-tiger/src/backend/workspace/dashboards/tests/index.test.ts b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/tests/index.test.ts index 4017a8bfa1d..b7fbaf235ac 100644 --- a/libs/sdk-backend-tiger/src/backend/workspace/dashboards/tests/index.test.ts +++ b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/tests/index.test.ts @@ -2,9 +2,17 @@ import { describe, expect, it } from "vitest"; -import { type IDashboardTab, type IFilterContext, idRef } from "@gooddata/sdk-model"; - -import { getOrphanedTabFilterContexts } from "../index.js"; +import { + type FilterContextItem, + type IDashboardTab, + type IFilterContext, + idRef, + isExportOverrideFilterContext, + isFilterContext, + isTempFilterContext, +} from "@gooddata/sdk-model"; + +import { buildExportOverrideFilterContext, getOrphanedTabFilterContexts } from "../index.js"; function makeFilterContext(id: string): IFilterContext { return { @@ -74,3 +82,34 @@ describe("getOrphanedTabFilterContexts", () => { expect(getOrphanedTabFilterContexts([], [])).toEqual([]); }); }); + +describe("buildExportOverrideFilterContext", () => { + const filters: FilterContextItem[] = [ + { + attributeFilter: { + attributeElements: { uris: ["live-value"] }, + displayForm: { identifier: "df.category", type: "displayForm" }, + negativeSelection: false, + localIdentifier: "filter-1", + }, + }, + ]; + + it("carries the export metadata filters", () => { + expect(buildExportOverrideFilterContext("export-1", filters).filters).toEqual(filters); + }); + + it("is recognized as the override for its export and no other", () => { + const filterContext = buildExportOverrideFilterContext("export-1", filters); + + expect(isExportOverrideFilterContext(filterContext, "export-1")).toBe(true); + expect(isExportOverrideFilterContext(filterContext, "export-2")).toBe(false); + }); + + it("stays a regular filter context, not a temp one (temp contexts are dropped by KD's load)", () => { + const filterContext = buildExportOverrideFilterContext("export-1", filters); + + expect(isFilterContext(filterContext)).toBe(true); + expect(isTempFilterContext(filterContext)).toBe(false); + }); +}); diff --git a/libs/sdk-code-convertors/package.json b/libs/sdk-code-convertors/package.json index 0ea8fad61c3..b150157de3a 100644 --- a/libs/sdk-code-convertors/package.json +++ b/libs/sdk-code-convertors/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-code-convertors", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData AAC declarative converters", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-code-convertors/python/pyproject.toml b/libs/sdk-code-convertors/python/pyproject.toml index 57d51220f72..442de952871 100644 --- a/libs/sdk-code-convertors/python/pyproject.toml +++ b/libs/sdk-code-convertors/python/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "gooddata-code-convertors" -version = "11.54.0a2" +version = "11.54.0a3" description = "GoodData AAC YAML / Declarative API code converters (WASM-powered)" readme = "README.md" license = { file = "LICENSE" } diff --git a/libs/sdk-code-schemas/package.json b/libs/sdk-code-schemas/package.json index 9be9bd6d7d2..a1081a1f62b 100644 --- a/libs/sdk-code-schemas/package.json +++ b/libs/sdk-code-schemas/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-code-schemas", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData AAC JSON Schema types and compiled schemas", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-e2e-utils/package.json b/libs/sdk-e2e-utils/package.json index 5a90d7953a4..93651bc04f5 100644 --- a/libs/sdk-e2e-utils/package.json +++ b/libs/sdk-e2e-utils/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-e2e-utils", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData utility functions for Playwright E2E tests", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-embedding/package.json b/libs/sdk-embedding/package.json index cd7b4e36a5c..07ebca7bc40 100644 --- a/libs/sdk-embedding/package.json +++ b/libs/sdk-embedding/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-embedding", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData Embedding APIs", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-model/api/sdk-model.api.md b/libs/sdk-model/api/sdk-model.api.md index d4029df6623..5d1b02bb16b 100644 --- a/libs/sdk-model/api/sdk-model.api.md +++ b/libs/sdk-model/api/sdk-model.api.md @@ -733,6 +733,9 @@ export function exportDefinitionTitle(exportDefinition: IExportDefinitionMetadat // @alpha export function exportDefinitionUpdated(exportDefinition: IExportDefinitionMetadataObject): string | undefined; +// @internal +export function exportOverrideFilterContextIdentifier(exportId: string): string; + // @beta export type ExportTemplateAppliedOn = "PDF" | "PPTX"; @@ -5264,6 +5267,9 @@ export function isExportDefinitionDashboardRequestPayload(obj: unknown): obj is // @alpha export function isExportDefinitionVisualizationObjectRequestPayload(obj: unknown): obj is IExportDefinitionVisualizationObjectRequestPayload; +// @internal +export function isExportOverrideFilterContext(obj: unknown, exportId: string | undefined): boolean; + // @alpha export function isExternalPluggableApplicationRegistryItem(app: PluggableApplicationRegistryItem): app is ExternalPluggableApplicationRegistryItem; diff --git a/libs/sdk-model/package.json b/libs/sdk-model/package.json index 850be4b1ac5..4fca69ca300 100644 --- a/libs/sdk-model/package.json +++ b/libs/sdk-model/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-model", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData Model definitions used by UI components and Backend SPI", "license": "MIT", "author": "GoodData", diff --git a/libs/sdk-model/src/dashboard/filterContext.ts b/libs/sdk-model/src/dashboard/filterContext.ts index 5e64859d4e3..30298d96d5c 100644 --- a/libs/sdk-model/src/dashboard/filterContext.ts +++ b/libs/sdk-model/src/dashboard/filterContext.ts @@ -953,6 +953,46 @@ export function isTempFilterContext(obj: unknown): obj is ITempFilterContext { ); } +/** + * Returns the identifier a backend stamps on the filter context it synthesizes from stored export + * metadata when a dashboard is loaded for an export render (identified by `exportId`). + * + * @remarks + * The synthesized context replaces the dashboard's persisted filter context so that the export + * renders with the filters captured at export-request time. It is structurally a regular + * {@link IFilterContext}, so this identifier is its only distinguishing mark; use + * {@link isExportOverrideFilterContext} to test for it. + * + * The literal must stay stable across versions: the host application that loads the dashboard and + * the dashboard engine that consumes it may run different SDK versions (module federation). + * + * @param exportId - identifier of the export the dashboard is being rendered for + * @internal + */ +export function exportOverrideFilterContextIdentifier(exportId: string): string { + return `identifier-${exportId}`; +} + +/** + * Tests whether the provided filter context carries filters supplied by export metadata in place + * of the dashboard's persisted filter context: either a {@link ITempFilterContext}, or a filter + * context stamped with {@link exportOverrideFilterContextIdentifier} for the given export. + * + * @param obj - object to test + * @param exportId - identifier of the export the dashboard is being rendered for, if any + * @internal + */ +export function isExportOverrideFilterContext(obj: unknown, exportId: string | undefined): boolean { + if (isTempFilterContext(obj)) { + return true; + } + return ( + exportId !== undefined && + isFilterContext(obj) && + obj.identifier === exportOverrideFilterContextIdentifier(exportId) + ); +} + /** * Reference to a particular dashboard date filter * This is commonly used to define filters to ignore diff --git a/libs/sdk-model/src/dashboard/test/filterContext.test.ts b/libs/sdk-model/src/dashboard/test/filterContext.test.ts index 1720b9addf4..6ed5e68a27d 100644 --- a/libs/sdk-model/src/dashboard/test/filterContext.test.ts +++ b/libs/sdk-model/src/dashboard/test/filterContext.test.ts @@ -6,11 +6,15 @@ import { InvalidInputTestCases } from "../../../__mocks__/typeGuards.js"; import { type ObjRef } from "../../objRef/index.js"; import { type IDashboardFilterReference, + type IFilterContext, + type ITempFilterContext, dashboardFilterReferenceObjRef, + exportOverrideFilterContextIdentifier, isDashboardAttributeFilter, isDashboardAttributeFilterReference, isDashboardDateFilter, isDashboardDateFilterReference, + isExportOverrideFilterContext, isFilterContext, isFilterContextDefinition, isTempFilterContext, @@ -123,3 +127,66 @@ describe("filter context type guards", () => { }); }); }); + +describe("exportOverrideFilterContextIdentifier", () => { + it("keeps the identifier literal stable (cross-version contract with federated engines)", () => { + expect(exportOverrideFilterContextIdentifier("abc")).toBe("identifier-abc"); + }); +}); + +describe("isExportOverrideFilterContext", () => { + const buildOverrideFilterContext = (exportId: string): IFilterContext => { + const identifier = exportOverrideFilterContextIdentifier(exportId); + return { + ref: { identifier }, + identifier, + uri: `uri-${exportId}`, + title: `temp-filter-context-${exportId}`, + description: "", + filters: [], + }; + }; + + const persistedFilterContext: IFilterContext = { + ref: { identifier: "fc-1", type: "filterContext" }, + identifier: "fc-1", + uri: "/fc-1", + title: "filterContext", + description: "", + filters: [], + }; + + const overrideTempFilterContext: ITempFilterContext = { + ref: { identifier: "temp-fc" }, + uri: "/temp-fc", + created: "2026-08-20 00:00:00", + filters: [], + }; + + it("recognizes a filter context stamped for the given export", () => { + expect(isExportOverrideFilterContext(buildOverrideFilterContext("export-1"), "export-1")).toBe(true); + }); + + it("rejects a filter context stamped for a different export", () => { + expect(isExportOverrideFilterContext(buildOverrideFilterContext("export-2"), "export-1")).toBe(false); + }); + + it("rejects a stamped filter context when no export id is given", () => { + expect(isExportOverrideFilterContext(buildOverrideFilterContext("export-1"), undefined)).toBe(false); + }); + + it("rejects a persisted filter context", () => { + expect(isExportOverrideFilterContext(persistedFilterContext, "export-1")).toBe(false); + }); + + it("recognizes a temp filter context regardless of export id", () => { + expect(isExportOverrideFilterContext(overrideTempFilterContext, undefined)).toBe(true); + expect(isExportOverrideFilterContext(overrideTempFilterContext, "export-1")).toBe(true); + }); + + it("rejects non-filter-context values", () => { + expect(isExportOverrideFilterContext(undefined, "export-1")).toBe(false); + expect(isExportOverrideFilterContext(null, "export-1")).toBe(false); + expect(isExportOverrideFilterContext({}, "export-1")).toBe(false); + }); +}); diff --git a/libs/sdk-model/src/index.ts b/libs/sdk-model/src/index.ts index 9ca44a2d7aa..716e7e6b7bd 100644 --- a/libs/sdk-model/src/index.ts +++ b/libs/sdk-model/src/index.ts @@ -674,6 +674,8 @@ export { isFilterContext, isFilterContextDefinition, isTempFilterContext, + exportOverrideFilterContextIdentifier, + isExportOverrideFilterContext, newAbsoluteDashboardDateFilter, newAllTimeDashboardDateFilter, newRelativeDashboardDateFilter, diff --git a/libs/sdk-pluggable-application-model/package.json b/libs/sdk-pluggable-application-model/package.json index 95ebb51d518..68759eee2e1 100644 --- a/libs/sdk-pluggable-application-model/package.json +++ b/libs/sdk-pluggable-application-model/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-pluggable-application-model", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK model contracts for pluggable applications", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-all/package.json b/libs/sdk-ui-all/package.json index 1e26f7db995..e95f9413545 100644 --- a/libs/sdk-ui-all/package.json +++ b/libs/sdk-ui-all/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-all", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK - All-In-One", "license": "LicenseRef-LICENSE", "author": "GoodData", diff --git a/libs/sdk-ui-application-header/package.json b/libs/sdk-ui-application-header/package.json index 083f24f6b53..e4af8fb2234 100644 --- a/libs/sdk-ui-application-header/package.json +++ b/libs/sdk-ui-application-header/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-application-header", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK application header components — workspace picker, notifications dropdown", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-catalog/package.json b/libs/sdk-ui-catalog/package.json index aeb2998f1ff..6700d23caea 100644 --- a/libs/sdk-ui-catalog/package.json +++ b/libs/sdk-ui-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-catalog", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK - Analytics Catalog", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-charts/package.json b/libs/sdk-ui-charts/package.json index 1f872e7de99..da508b17735 100644 --- a/libs/sdk-ui-charts/package.json +++ b/libs/sdk-ui-charts/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-charts", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData.UI SDK - Charts", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md b/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md index bf33846435d..e8ec606c229 100644 --- a/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md +++ b/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md @@ -236,7 +236,7 @@ import { WeekStart } from '@gooddata/sdk-model'; import { WritableDraft } from 'immer'; // @beta (undocumented) -export type ActionFailedErrorReason = "USER_ERROR" | "INTERNAL_ERROR" | "CANCELLED"; +export type ActionFailedErrorReason = "USER_ERROR" | "INTERNAL_ERROR"; // @beta export function addAttributeFilter(displayForm: ObjRef, index: number, correlationId?: string, selectionMode?: DashboardAttributeFilterSelectionMode, mode?: DashboardAttributeFilterConfigMode, initialSelection?: IAttributeElements, initialIsNegativeSelection?: boolean, localIdentifier?: string, primaryDisplayForm?: ObjRef, title?: string): IAddAttributeFilter; diff --git a/libs/sdk-ui-dashboard/package.json b/libs/sdk-ui-dashboard/package.json index faa74c39f15..853ba45545b 100644 --- a/libs/sdk-ui-dashboard/package.json +++ b/libs/sdk-ui-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-dashboard", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK - Dashboard Component", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/filterViews.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/filterViews.ts index ff6f14ffd65..7e83b4259e6 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/filterViews.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/filterViews.ts @@ -31,6 +31,7 @@ import { isDashboardMatchAttributeFilter, isDashboardMeasureValueFilter, isDashboardTextAttributeFilter, + isExportOverrideFilterContext, isFilterContext, isSingleSelectionFilter, } from "@gooddata/sdk-model"; @@ -461,7 +462,17 @@ export const changeFilterContextSelection = ( export function applyDefaultFilterView( dashboard: IDashboard, filterViews: IDashboardFilterView[], + exportId: string | undefined, ): IDashboard { + // In an export render, the loaded filter context may be synthesized from export metadata, + // carrying the filters captured at export-request time (they replace the persisted context on + // the root and on every tab). The user's default filter view must not clobber those filters + // (or parameters). Exports whose metadata supplied no filters keep the persisted context and + // get the default view applied as usual. + if (isExportOverrideFilterContext(dashboard.filterContext, exportId)) { + return dashboard; + } + // If dashboard has tabs, apply default views per tab if (dashboard.tabs && dashboard.tabs.length > 0) { // Find legacy global default view (without tabLocalIdentifier) as fallback for first tab diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/filterViews.test.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/filterViews.test.ts index 867d1d492fa..7973abdec2a 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/filterViews.test.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/filterViews.test.ts @@ -8,7 +8,9 @@ import { type IDashboardFilterView, type IDashboardParameter, type IFilterContext, + type ITempFilterContext, type MeasureValueFilterCondition, + exportOverrideFilterContextIdentifier, idRef, } from "@gooddata/sdk-model"; @@ -81,7 +83,7 @@ describe("filterViews", () => { parameters: [{ ...topNParameter, value: 99 }], }); - const updated = applyDefaultFilterView(dashboard, [filterView]); + const updated = applyDefaultFilterView(dashboard, [filterView], undefined); expect(updated.tabs?.[0]?.parameters).toEqual([{ ...topNParameter, value: 99 }]); }); @@ -102,7 +104,7 @@ describe("filterViews", () => { parameters: [topNParameter], }); - const updated = applyDefaultFilterView(dashboard, [filterView]); + const updated = applyDefaultFilterView(dashboard, [filterView], undefined); expect(updated.tabs?.[0]?.parameters).toEqual([topNParameter]); }); @@ -127,11 +129,113 @@ describe("filterViews", () => { parameters: [{ ...topNParameter, value: 99 }], }); - const updated = applyDefaultFilterView(dashboard, [filterView]); + const updated = applyDefaultFilterView(dashboard, [filterView], undefined); expect(updated.tabs?.[0]?.parameters).toBeUndefined(); expect(updated.tabs?.[1]?.parameters).toBeUndefined(); }); + + describe("export override filter context", () => { + const liveFilter: FilterContextItem = { + attributeFilter: { + attributeElements: { uris: ["live-value"] }, + displayForm: { identifier: "df.category", type: "displayForm" }, + negativeSelection: false, + localIdentifier: "filter-1", + }, + }; + const viewFilter: FilterContextItem = { + attributeFilter: { + attributeElements: { uris: ["view-value"] }, + displayForm: { identifier: "df.category", type: "displayForm" }, + negativeSelection: false, + localIdentifier: "filter-1", + }, + }; + + const buildExportOverrideContext = ( + exportId: string, + filters: FilterContextItem[], + ): IFilterContext => { + const identifier = exportOverrideFilterContextIdentifier(exportId); + return { + ref: { identifier }, + identifier, + uri: `uri-${exportId}`, + title: `temp-filter-context-${exportId}`, + description: "", + filters, + }; + }; + + it("does not apply the default view over filters supplied by export metadata", () => { + const dashboard = buildDashboard({ + filterContext: buildExportOverrideContext("export-1", [liveFilter]), + }); + const filterView = buildFilterView({ + filterContext: { title: "", description: "", filters: [viewFilter] }, + }); + + const updated = applyDefaultFilterView(dashboard, [filterView], "export-1"); + + expect(updated).toBe(dashboard); + }); + + it("does not apply per-tab default views or their parameters over export-supplied filters", () => { + const overrideContext = buildExportOverrideContext("export-1", [liveFilter]); + const dashboard = buildDashboard({ + filterContext: overrideContext, + tabs: [ + { + localIdentifier: "tab-A", + title: "Tab A", + filterContext: overrideContext, + parameters: [{ ...topNParameter, value: 25 }], + }, + ], + }); + const filterView = buildFilterView({ + tabLocalIdentifier: "tab-A", + filterContext: { title: "", description: "", filters: [viewFilter] }, + parameters: [{ ...topNParameter, value: 99 }], + }); + + const updated = applyDefaultFilterView(dashboard, [filterView], "export-1"); + + expect(updated).toBe(dashboard); + expect(updated.tabs?.[0]?.parameters).toEqual([{ ...topNParameter, value: 25 }]); + }); + + it("applies the default view when the filter context belongs to a different export", () => { + const dashboard = buildDashboard({ + filterContext: buildExportOverrideContext("another-export", [liveFilter]), + }); + const filterView = buildFilterView({ + filterContext: { title: "", description: "", filters: [viewFilter] }, + }); + + const updated = applyDefaultFilterView(dashboard, [filterView], "export-1"); + + expect((updated.filterContext as IFilterContext).filters).toEqual([viewFilter]); + }); + + it("does not apply the default view over a temp filter context", () => { + const tempFilterContext: ITempFilterContext = { + ref: { identifier: "temp-fc" }, + uri: "/temp-fc", + created: "2026-08-20 00:00:00", + filters: [liveFilter], + }; + const dashboard = buildDashboard({ filterContext: tempFilterContext }); + const filterView = buildFilterView({ + filterContext: { title: "", description: "", filters: [viewFilter] }, + }); + + const updated = applyDefaultFilterView(dashboard, [filterView], undefined); + + expect(updated).toBe(dashboard); + }); + }); }); describe("changeFilterContextSelection", () => { diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/initializeDashboardHandler/index.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/initializeDashboardHandler/index.ts index 68c53c0e42a..33aae4df281 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/initializeDashboardHandler/index.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/initializeDashboardHandler/index.ts @@ -298,7 +298,7 @@ function* loadExistingDashboard( references: { insights }, } = dashboardWithReferences; - const dashboardWithFilterView = applyDefaultFilterView(loadedDashboard, filterViews); + const dashboardWithFilterView = applyDefaultFilterView(loadedDashboard, filterViews, config.exportId); // Resolve active tab: URL's initialTabId takes precedence, otherwise default to first tab // Note: activeTabLocalIdentifier is app state only, NOT persisted to/read from dashboard MD const resolvedActiveTabId = resolveActiveTabId( diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/resetDashboardHandler.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/resetDashboardHandler.ts index 097b7ed7472..ad8209fdec4 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/resetDashboardHandler.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/resetDashboardHandler.ts @@ -206,7 +206,11 @@ function* resetDashboardFromPersisted(ctx: DashboardContext) { const settings: ReturnType = yield select(selectSettings); const filterViews: ReturnType = yield select(selectFilterViews); - const dashboardWithUpdatedFilterContext = applyDefaultFilterView(persistedDashboard, filterViews); + const dashboardWithUpdatedFilterContext = applyDefaultFilterView( + persistedDashboard, + filterViews, + ctx.config?.exportId, + ); const insightRefsFromWidgets = insightReferencesFromDashboard(dashboardWithUpdatedFilterContext); const uniqueInsightRefsFromWidgets = uniqWith(insightRefsFromWidgets, areObjRefsEqual); diff --git a/libs/sdk-ui-dashboard/src/model/events/general.ts b/libs/sdk-ui-dashboard/src/model/events/general.ts index e063734690d..b75a54d16a6 100644 --- a/libs/sdk-ui-dashboard/src/model/events/general.ts +++ b/libs/sdk-ui-dashboard/src/model/events/general.ts @@ -54,7 +54,7 @@ export const isDashboardCommandStarted = eventGuard( }; } -export function commandCancelled( - ctx: DashboardContext, - command: TCommand, -): IDashboardCommandFailed { - return { - type: "GDC.DASH/EVT.COMMAND.FAILED", - ctx, - correlationId: command.correlationId, - payload: { - reason: "CANCELLED", - command, - message: `Processing of ${command.type} was cancelled before it could finish.`, - }, - }; -} - export function invalidArgumentsProvided( ctx: DashboardContext, command: TCommand, diff --git a/libs/sdk-ui-dashboard/src/model/react/tests/useInitializeDashboardStore.test.tsx b/libs/sdk-ui-dashboard/src/model/react/tests/useInitializeDashboardStore.test.tsx deleted file mode 100644 index 5a8a066385f..00000000000 --- a/libs/sdk-ui-dashboard/src/model/react/tests/useInitializeDashboardStore.test.tsx +++ /dev/null @@ -1,215 +0,0 @@ -// (C) 2026 GoodData Corporation - -import { type Action } from "@reduxjs/toolkit"; -import { renderHook } from "@testing-library/react"; -import { describe, expect, it } from "vitest"; - -import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi"; -import { idRef } from "@gooddata/sdk-model"; - -import { type DashboardEventHandler } from "../../eventHandlers/eventHandler.js"; -import { type IReduxedDashboardStore } from "../../store/dashboardStore.js"; -import { type IDashboardStoreProviderProps } from "../types.js"; -import { useInitializeDashboardStore } from "../useInitializeDashboardStore.js"; - -const dashboardRef = idRef("test-dashboard"); - -function newBackend(): IAnalyticalBackend { - return { capabilities: {}, config: {} } as unknown as IAnalyticalBackend; -} - -type TestProps = { - backend: IAnalyticalBackend; - eventHandlers: DashboardEventHandler[] | undefined; -}; - -// Only the probe event is matched, so the events of the initial load stay out of the recording. -function recordingHandler(recorded: string[], name: string): DashboardEventHandler { - return { - eval: (event) => event.type === "CUSTOM/EVT.PROBE", - handler: () => recorded.push(name), - }; -} - -function emitProbe(dashboardStore: IReduxedDashboardStore | null) { - dashboardStore?.store.dispatch({ type: "CUSTOM/EVT.PROBE" } as unknown as Action); -} - -const settle = () => new Promise((resolve) => setTimeout(resolve, 20)); - -function renderDashboardStore(initialProps: TestProps) { - return renderHook( - (props: TestProps) => - useInitializeDashboardStore({ - backend: props.backend, - workspace: "test-workspace", - dashboard: dashboardRef, - eventHandlers: props.eventHandlers, - initialRenderMode: "view", - } as IDashboardStoreProviderProps), - { initialProps }, - ); -} - -describe("useInitializeDashboardStore", () => { - it("delivers events to a handler added by a props change, without rebuilding the store", async () => { - const recorded: string[] = []; - const first = recordingHandler(recorded, "h1"); - const second = recordingHandler(recorded, "h2"); - const backend = newBackend(); - const { result, rerender } = renderDashboardStore({ backend, eventHandlers: [first] }); - await settle(); - const initialStore = result.current; - - rerender({ backend, eventHandlers: [first, second] }); - await settle(); - emitProbe(result.current); - await settle(); - - expect(result.current).toBe(initialStore); - expect(recorded).toEqual(["h1", "h2"]); - }); - - it("stops delivering events to a handler removed by a props change", async () => { - const recorded: string[] = []; - const first = recordingHandler(recorded, "h1"); - const second = recordingHandler(recorded, "h2"); - const backend = newBackend(); - const { result, rerender } = renderDashboardStore({ - backend, - eventHandlers: [first, second], - }); - await settle(); - - rerender({ backend, eventHandlers: [first] }); - await settle(); - emitProbe(result.current); - await settle(); - - expect(recorded).toEqual(["h1"]); - }); - - it("keeps unregisterEventHandler working for a handler passed in through props", async () => { - const recorded: string[] = []; - const handler = recordingHandler(recorded, "h1"); - const backend = newBackend(); - const { result, rerender } = renderDashboardStore({ backend, eventHandlers: [handler] }); - await settle(); - - result.current?.unregisterEventHandler(handler); - rerender({ backend, eventHandlers: [handler] }); - await settle(); - emitProbe(result.current); - await settle(); - - expect(recorded).toEqual([]); - }); - - it("handles event handlers going from undefined to populated and back", async () => { - const recorded: string[] = []; - const handler = recordingHandler(recorded, "h1"); - const backend = newBackend(); - const { result, rerender } = renderDashboardStore({ backend, eventHandlers: undefined }); - await settle(); - const initialStore = result.current; - - rerender({ backend, eventHandlers: [handler] }); - await settle(); - emitProbe(result.current); - await settle(); - expect(result.current).toBe(initialStore); - expect(recorded).toEqual(["h1"]); - - rerender({ backend, eventHandlers: undefined }); - await settle(); - emitProbe(result.current); - await settle(); - expect(recorded).toEqual(["h1"]); - }); - - it("keeps delivering to a handler that was listed twice and is now listed once", async () => { - const recorded: string[] = []; - const handler = recordingHandler(recorded, "h1"); - const backend = newBackend(); - const { result, rerender } = renderDashboardStore({ - backend, - eventHandlers: [handler, handler], - }); - await settle(); - - rerender({ backend, eventHandlers: [handler] }); - await settle(); - emitProbe(result.current); - await settle(); - - // Both copies were seeded and a repeat is not a removal, so both stay. - expect(recorded).toEqual(["h1", "h1"]); - }); - - it("rebuilds the store when the backend changes, and seeds it exactly once", async () => { - const recorded: string[] = []; - const handler = recordingHandler(recorded, "h1"); - const { result, rerender } = renderDashboardStore({ - backend: newBackend(), - eventHandlers: [handler], - }); - await settle(); - const initialStore = result.current; - - rerender({ backend: newBackend(), eventHandlers: [handler] }); - await settle(); - emitProbe(result.current); - await settle(); - - expect(result.current).not.toBe(initialStore); - expect(recorded).toEqual(["h1"]); - }); - - it("registers a handler again after it was removed and re-added", async () => { - const recorded: string[] = []; - const handler = recordingHandler(recorded, "h1"); - const backend = newBackend(); - const { result, rerender } = renderDashboardStore({ backend, eventHandlers: [handler] }); - await settle(); - - rerender({ backend, eventHandlers: [] }); - await settle(); - rerender({ backend, eventHandlers: [handler] }); - await settle(); - emitProbe(result.current); - await settle(); - - expect(recorded).toEqual(["h1"]); - }); - - it("does not leave a handler behind when the handler identity changes on every render", async () => { - const recorded: string[] = []; - const backend = { current: newBackend() }; - let renderCount = 0; - const { result, rerender } = renderHook(() => { - renderCount += 1; - const name = `h${renderCount}`; - // A fresh handler identity every render, the seed of a store built from earlier props included. - return useInitializeDashboardStore({ - backend: backend.current, - workspace: "test-workspace", - dashboard: dashboardRef, - eventHandlers: [recordingHandler(recorded, name)], - initialRenderMode: "view", - } as IDashboardStoreProviderProps); - }); - await settle(); - - backend.current = newBackend(); - rerender(); - await settle(); - rerender(); - await settle(); - - recorded.length = 0; - emitProbe(result.current); - await settle(); - - expect(recorded).toHaveLength(1); - }); -}); diff --git a/libs/sdk-ui-dashboard/src/model/react/useInitializeDashboardStore.ts b/libs/sdk-ui-dashboard/src/model/react/useInitializeDashboardStore.ts index 36a09ccf710..dd702988f37 100644 --- a/libs/sdk-ui-dashboard/src/model/react/useInitializeDashboardStore.ts +++ b/libs/sdk-ui-dashboard/src/model/react/useInitializeDashboardStore.ts @@ -33,6 +33,7 @@ type InitProps = { filterContextRef: ObjRef | undefined; clientId: string | undefined; dataProductId: string | undefined; + initialEventHandlers: DashboardEventHandler[] | undefined; }; function dispatchDeinitialized(dashboardStore: IReduxedDashboardStore | null, initProps: InitProps): void { @@ -73,45 +74,6 @@ function useNotifyDeinitializedOnUnmount( }, []); } -/** - * A change of the `eventHandlers` prop no longer rebuilds the store, so this is the only mechanism by which a - * changed handler set takes effect. Handlers are matched by identity, as the emitter unregisters them; a repeat - * must never read as a removal, because the emitter drops every copy of a handler at once. - */ -function useSyncEventHandlers( - dashboardStore: IReduxedDashboardStore | null, - eventHandlers: DashboardEventHandler[] | undefined, -): (seededHandlers: DashboardEventHandler[] | undefined) => void { - // What the emitter holds - not what the last render passed: a store is seeded with the handlers of the - // render that created it, so creation reports the seed rather than this effect inferring it. - const registered = useRef>(new Set()); - - useEffect(() => { - if (!dashboardStore) { - return; - } - - const handlers = new Set(eventHandlers); - - registered.current.forEach((handler) => { - if (!handlers.has(handler)) { - dashboardStore.unregisterEventHandler(handler); - } - }); - handlers.forEach((handler) => { - if (!registered.current.has(handler)) { - dashboardStore.registerEventHandler(handler); - } - }); - - registered.current = handlers; - }, [dashboardStore, eventHandlers]); - - return (seededHandlers) => { - registered.current = new Set(seededHandlers); - }; -} - function enrichConfig( config: DashboardConfig | undefined, mapboxToken?: string, @@ -148,11 +110,11 @@ export const useInitializeDashboardStore = ( filterContextRef: props.filterContextRef, clientId, dataProductId, + initialEventHandlers: props.eventHandlers, }; const previousInitProps = usePrevious(currentInitProps); useNotifyDeinitializedOnUnmount(dashboardStore, currentInitProps); - const reportSeededEventHandlers = useSyncEventHandlers(dashboardStore, props.eventHandlers); useEffect(() => { if (dashboardStore) { @@ -224,7 +186,6 @@ export const useInitializeDashboardStore = ( }, initialRenderMode: props.initialRenderMode ?? "view", }); - reportSeededEventHandlers(props.eventHandlers); newDashboardStore.store.dispatch( initializeDashboardWithPersistedDashboard( enrichConfig(props.config, mapboxToken, agGridToken), diff --git a/libs/sdk-ui-dashboard/src/model/store/_infra/rootCommandHandler.ts b/libs/sdk-ui-dashboard/src/model/store/_infra/rootCommandHandler.ts index 9c92f984689..50e03d4e112 100644 --- a/libs/sdk-ui-dashboard/src/model/store/_infra/rootCommandHandler.ts +++ b/libs/sdk-ui-dashboard/src/model/store/_infra/rootCommandHandler.ts @@ -1,15 +1,13 @@ // (C) 2021-2026 GoodData Corporation import { type SagaIterator } from "redux-saga"; -import { actionChannel, call, cancelled, flush, take } from "redux-saga/effects"; +import { actionChannel, call, take } from "redux-saga/effects"; import { DefaultCommandHandlers } from "../../commandHandlers/index.js"; import { type IDashboardCommand } from "../../commands/base.js"; import { type DashboardCommands } from "../../commands/index.js"; import { isDashboardEvent } from "../../events/base.js"; import { - type IDashboardCommandFailed, - commandCancelled, commandRejected, dashboardCommandStarted, internalErrorOccurred, @@ -32,8 +30,7 @@ export const CommandEnvelopeActionPrefix = "__C"; type CommandEnvelopeEventHandlers = { onStart: (command: TCommand) => void; onSuccess: (result: TResult) => void; - // Command handlers signal failure by throwing the event; a plain Error only arrives from an unexpected throw. - onError: (err: Error | IDashboardCommandFailed) => void; + onError: (err: Error) => void; }; type CommandEnvelope = Readonly< @@ -90,29 +87,6 @@ function ensureCommandWrappedInEnvelope( return isCommandEnvelope(action) ? action : commandEnvelope(action as DashboardCommands); } -/** - * Callers wait either on the envelope callbacks or on the COMMAND.FAILED event, so both have to be told. - */ -function* reportCommandCancelled( - ctx: DashboardContext, - envelope: CommandEnvelope, -): SagaIterator { - const { command } = envelope; - const correlationIdForLog = command.correlationId ?? "(no correlationId provided)"; - const event = commandCancelled(ctx, command); - - try { - envelope.onError(event); - } catch (e) { - console.warn( - `An error has occurred while calling onError function provided for ${command.type}@${correlationIdForLog} processing:`, - e, - ); - } - - yield dispatchDashboardEvent(event); -} - function* processCommand( ctx: DashboardContext, envelope: CommandEnvelope, @@ -170,11 +144,6 @@ function* processCommand( internalErrorOccurred(ctx, command, `Internal error has occurred while handling ${type}`, e), ); } - } finally { - // A saga cancellation is not an exception, so it never reaches the catch above. - if (yield cancelled()) { - yield call(reportCommandCancelled, ctx, envelope); - } } } @@ -195,25 +164,12 @@ export function* rootCommandHandler(): SagaIterator { (action.type.startsWith(CommandEnvelopeActionPrefix) || action.type.startsWith("GDC.DASH/CMD")), ); - try { - while (true) { - const command: DashboardCommands | CommandEnvelope = - yield take(commandChannel); - const envelope = ensureCommandWrappedInEnvelope(command); - const ctx: DashboardContext = yield call(getDashboardContext); + while (true) { + const command: DashboardCommands | CommandEnvelope = + yield take(commandChannel); + const envelope = ensureCommandWrappedInEnvelope(command); + const ctx: DashboardContext = yield call(getDashboardContext); - yield call(processCommand, ctx, envelope); - } - } finally { - // Whatever is still buffered never reached processCommand, so nothing else can report it. - if (yield cancelled()) { - const buffered: (DashboardCommands | CommandEnvelope)[] = - yield flush(commandChannel); - const ctx: DashboardContext = yield call(getDashboardContext); - - for (const command of buffered) { - yield call(reportCommandCancelled, ctx, ensureCommandWrappedInEnvelope(command)); - } - } + yield call(processCommand, ctx, envelope); } } diff --git a/libs/sdk-ui-dashboard/src/model/store/_infra/tests/commandCancellation.test.ts b/libs/sdk-ui-dashboard/src/model/store/_infra/tests/commandCancellation.test.ts deleted file mode 100644 index b80e4fa75aa..00000000000 --- a/libs/sdk-ui-dashboard/src/model/store/_infra/tests/commandCancellation.test.ts +++ /dev/null @@ -1,182 +0,0 @@ -// (C) 2026 GoodData Corporation - -import { type Action } from "@reduxjs/toolkit"; -import { type SagaIterator } from "redux-saga"; -import { call, cancel } from "redux-saga/effects"; -import { describe, expect, it, vi } from "vitest"; - -import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi"; -import { idRef } from "@gooddata/sdk-model"; - -import { initializeDashboard } from "../../../commands/dashboard.js"; -import { type IDashboardEvent } from "../../../events/base.js"; -import { isDashboardCommandFailed } from "../../../events/general.js"; -import { type DashboardEvents } from "../../../events/index.js"; -import { type DashboardContext } from "../../../types/commonTypes.js"; -import { createDashboardStore } from "../../dashboardStore.js"; -import { commandEnvelopeWithPromise } from "../rootCommandHandler.js"; - -/** - * Every interaction blocks forever, standing in for an export still polling when the store is torn down. - * `then` yields the proxy, which called as a thenable never invokes its callbacks. - */ -function blockingBackend(): IAnalyticalBackend { - const blocking: any = new Proxy(function () {}, { - get: (_target, prop) => (typeof prop === "symbol" ? undefined : blocking), - apply: () => blocking, - }); - - return blocking; -} - -const tick = () => new Promise((resolve) => setTimeout(resolve, 20)); - -function createTestStore(backgroundWorkers: ((context: DashboardContext) => SagaIterator)[] = []) { - return createDashboardStore({ - dashboardContext: { - backend: blockingBackend(), - workspace: "test-workspace", - dashboardRef: idRef("test-dashboard"), - } as DashboardContext, - backgroundWorkers, - initialRenderMode: "view", - }); -} - -const failures = (events: DashboardEvents[]) => - events.filter((event) => isDashboardCommandFailed(event as IDashboardEvent)); - -describe("in-flight command cancellation", () => { - it("reports a failure for an in-flight command when the root saga task is cancelled", async () => { - const dashboardStore = createTestStore(); - const events: DashboardEvents[] = []; - dashboardStore.registerEventHandler({ - eval: () => true, - handler: (event) => events.push(event), - }); - - dashboardStore.store.dispatch(initializeDashboard(undefined, undefined, "correlation-1") as any); - await tick(); - expect(failures(events)).toEqual([]); - - dashboardStore.rootSagaTask.cancel(); - await tick(); - - expect(failures(events)).toHaveLength(1); - const failure = failures(events)[0] as any; - expect(failure.correlationId).toEqual("correlation-1"); - expect(failure.payload.reason).toEqual("CANCELLED"); - expect(failure.payload.command.type).toEqual("GDC.DASH/CMD.INITIALIZE"); - }); - - it("rejects the promise of an in-flight command when the root saga task is cancelled", async () => { - const dashboardStore = createTestStore(); - const { promise, envelope } = commandEnvelopeWithPromise( - initializeDashboard(undefined, undefined, "correlation-2"), - ); - const onRejected = vi.fn(); - void promise.catch(onRejected); - - dashboardStore.store.dispatch(envelope as any); - await tick(); - expect(onRejected).not.toHaveBeenCalled(); - - dashboardStore.rootSagaTask.cancel(); - await tick(); - - expect(onRejected).toHaveBeenCalledTimes(1); - expect(onRejected.mock.calls[0][0].payload.reason).toEqual("CANCELLED"); - }); - - it("reports a failure for a command still queued behind the in-flight one", async () => { - const dashboardStore = createTestStore(); - const events: DashboardEvents[] = []; - dashboardStore.registerEventHandler({ - eval: () => true, - handler: (event) => events.push(event), - }); - - // Commands are processed one at a time, so the second one is still sitting in the channel buffer. - dashboardStore.store.dispatch(initializeDashboard(undefined, undefined, "in-flight") as any); - dashboardStore.store.dispatch(initializeDashboard(undefined, undefined, "queued") as any); - await tick(); - - dashboardStore.rootSagaTask.cancel(); - await tick(); - - expect( - failures(events) - .map((event) => event.correlationId) - .sort(), - ).toEqual(["in-flight", "queued"]); - }); - - it("stops emitting events once a background worker has brought the sagas down", async () => { - const crashingWorker = function* (): SagaIterator { - yield call(() => Promise.resolve()); - throw new Error("background worker failed"); - }; - const logged: unknown[] = []; - vi.spyOn(console, "error").mockImplementation((...args) => logged.push(args[0])); - const dashboardStore = createTestStore([crashingWorker]); - const events: DashboardEvents[] = []; - dashboardStore.registerEventHandler({ - eval: () => true, - handler: (event) => events.push(event), - }); - await tick(); - - events.length = 0; - dashboardStore.store.dispatch({ type: "CUSTOM/EVT.PROBE" } as unknown as Action); - await tick(); - - // A surviving emitter would keep invoking handlers, which are given `dispatch`, on a dead store. - expect(events).toEqual([]); - // The crash itself must not be swallowed - nothing here catches it, so redux-saga reports it. - expect(logged.some((entry) => (entry as Error)?.message === "background worker failed")).toBe(true); - }); - - it("keeps processing commands when a background worker cancels itself", async () => { - const selfCancellingWorker = function* (): SagaIterator { - yield call(() => Promise.resolve()); - yield cancel(); - }; - const dashboardStore = createTestStore([selfCancellingWorker]); - const events: DashboardEvents[] = []; - dashboardStore.registerEventHandler({ - eval: () => true, - handler: (event) => events.push(event), - }); - await tick(); - - dashboardStore.store.dispatch(initializeDashboard(undefined, undefined, "after-worker") as any); - await tick(); - - // One saga bringing itself down must not take the command pipeline with it: the dashboard would look - // healthy while silently ignoring everything dispatched at it. - expect(events.map((event) => event.type)).toContain("GDC.DASH/EVT.COMMAND.STARTED"); - }); - - it("does not report a failure for a command that already finished", async () => { - const dashboardStore = createTestStore(); - const events: DashboardEvents[] = []; - dashboardStore.registerEventHandler({ - eval: () => true, - handler: (event) => events.push(event), - }); - - // An unknown command is rejected, so it runs to completion - and the rejection also proves the emitter - // is delivering, which is what makes the empty failure list below mean something. - dashboardStore.store.dispatch({ - type: "GDC.DASH/CMD.NO_SUCH_COMMAND", - correlationId: "finished", - } as unknown as Action); - await tick(); - expect(events.map((event) => event.type)).toContain("GDC.DASH/EVT.COMMAND.REJECTED"); - - dashboardStore.rootSagaTask.cancel(); - await tick(); - - expect(failures(events)).toEqual([]); - }); -}); diff --git a/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts b/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts index 6b7d087e453..b7a0d486139 100644 --- a/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts +++ b/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts @@ -11,7 +11,7 @@ import { defaultImport } from "default-import"; import { keyBy, merge } from "lodash-es"; import { enableBatching } from "redux-batched-actions"; import defaultReduxSaga, { type Saga, type SagaIterator, type Task } from "redux-saga"; -import { call, cancel, fork, take } from "redux-saga/effects"; +import { call, fork } from "redux-saga/effects"; import { v4 as uuidv4 } from "uuid"; import { objRefToString } from "@gooddata/sdk-model"; @@ -233,20 +233,15 @@ function* rootSaga( ): SagaIterator { const dashboardContext: DashboardContext = yield call(getDashboardContext); - // The emitter has to outlive the sagas that emit events: a discarded command reports itself while - // unwinding, so the teardown below cancels it last - explicitly, rather than relying on fork order. - const eventEmitterTask: Task = yield fork(eventEmitter); - const emittingTasks: Task[] = [yield fork(commandHandler), yield fork(queryProcessor)]; - for (const worker of backgroundWorkers) { - emittingTasks.push(yield fork(worker, dashboardContext)); - } - try { - // Nothing matches this pattern; parking is what makes cancelling this task run the teardown. - yield take(() => false); - } finally { - yield cancel(emittingTasks); - yield cancel(eventEmitterTask); + yield fork(eventEmitter); + yield fork(commandHandler); + yield fork(queryProcessor); + for (const worker of backgroundWorkers) { + yield fork(worker, dashboardContext); + } + } catch (e) { + console.error("Root saga failed", e); } } diff --git a/libs/sdk-ui-dashboard/src/presentation/dashboard/types.ts b/libs/sdk-ui-dashboard/src/presentation/dashboard/types.ts index 30feb75e3a1..22290270305 100644 --- a/libs/sdk-ui-dashboard/src/presentation/dashboard/types.ts +++ b/libs/sdk-ui-dashboard/src/presentation/dashboard/types.ts @@ -668,8 +668,6 @@ export interface IDashboardEventing { * Specify event handlers to register at the dashboard creation time. * * @remarks - * Changing this prop registers added handlers and unregisters removed ones, matched by identity. - * * Note: all events that will be emitted during the initial load processing will have the `initialLoad` * correlationId. */ diff --git a/libs/sdk-ui-ext/package.json b/libs/sdk-ui-ext/package.json index b117cc15451..badd3e03a1c 100644 --- a/libs/sdk-ui-ext/package.json +++ b/libs/sdk-ui-ext/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-ext", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData.UI SDK - Extensions", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-filters/package.json b/libs/sdk-ui-filters/package.json index 82b5ce0eb98..afe0bbea209 100644 --- a/libs/sdk-ui-filters/package.json +++ b/libs/sdk-ui-filters/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-filters", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData.UI SDK - Filter Components", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md b/libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md index bfa25900a24..9ff5451051b 100644 --- a/libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md +++ b/libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md @@ -616,7 +616,7 @@ export const startNewConversationAction: ActionCreatorWithoutPayload<"messages/s // @public (undocumented) export type TextContentObject = { id: string; - type: "metric" | "attribute" | "fact" | "date" | "label" | "dashboard" | "visualization"; + type: "metric" | "attribute" | "fact" | "date" | "label" | "dashboard" | "visualization" | "dataset"; title: string; }; diff --git a/libs/sdk-ui-gen-ai/package.json b/libs/sdk-ui-gen-ai/package.json index 63defdb854d..d967521bac1 100644 --- a/libs/sdk-ui-gen-ai/package.json +++ b/libs/sdk-ui-gen-ai/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-gen-ai", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData GenAI SDK", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-gen-ai/src/components/completion/plugins/rehype-references.ts b/libs/sdk-ui-gen-ai/src/components/completion/plugins/rehype-references.ts index 6cc99e9f39c..0d09f8ca749 100644 --- a/libs/sdk-ui-gen-ai/src/components/completion/plugins/rehype-references.ts +++ b/libs/sdk-ui-gen-ai/src/components/completion/plugins/rehype-references.ts @@ -29,6 +29,7 @@ export function rehypeReferences(references: TextContentObject[], tokens: string label: obj.type === "label", fact: obj.type === "fact", date: obj.type === "date", + dataset: obj.type === "dataset", dashboard: obj.type === "dashboard", visualization: obj.type === "visualization", }), diff --git a/libs/sdk-ui-gen-ai/src/components/completion/references.ts b/libs/sdk-ui-gen-ai/src/components/completion/references.ts index 08084283c93..3213bdbc2b9 100644 --- a/libs/sdk-ui-gen-ai/src/components/completion/references.ts +++ b/libs/sdk-ui-gen-ai/src/components/completion/references.ts @@ -4,6 +4,7 @@ import { type CatalogItem, type IAttributeDisplayFormMetadataObject, type ICatalogDateAttribute, + type IDataSetMetadataObject, isCatalogAttribute, isCatalogDateDataset, } from "@gooddata/sdk-model"; @@ -30,11 +31,15 @@ export function collectReferences( item.dateAttributes.forEach((dateAttribute) => { collectReference(items, where, dateAttribute); }); + collectReference(items, where, item.dataSet); } if (isCatalogAttribute(item)) { item.displayForms.forEach((displayForm) => { collectReference(items, where, displayForm); }); + if (item.dataSet) { + collectReference(items, where, item.dataSet); + } } }); @@ -44,7 +49,7 @@ export function collectReferences( function collectReference( items: TextContentObject[], where: string | true, - item: CatalogItem | ICatalogDateAttribute | IAttributeDisplayFormMetadataObject, + item: CatalogItem | ICatalogDateAttribute | IAttributeDisplayFormMetadataObject | IDataSetMetadataObject, ): void { const id = getCatalogItemId(item); const type = getCatalogItemType(item); diff --git a/libs/sdk-ui-gen-ai/src/components/completion/utils.ts b/libs/sdk-ui-gen-ai/src/components/completion/utils.ts index 0058752dbbc..a871f1a12b8 100644 --- a/libs/sdk-ui-gen-ai/src/components/completion/utils.ts +++ b/libs/sdk-ui-gen-ai/src/components/completion/utils.ts @@ -8,6 +8,7 @@ import { type CatalogItem, type IAttributeDisplayFormMetadataObject, type ICatalogDateAttribute, + type IDataSetMetadataObject, type ObjRef, isAttributeDisplayFormMetadataObject, isCatalogAttribute, @@ -15,6 +16,7 @@ import { isCatalogDateDataset, isCatalogFact, isCatalogMeasure, + isDataSetMetadataObject, isIdentifierRef, } from "@gooddata/sdk-model"; @@ -84,6 +86,7 @@ const SupportedReferenceTypes = [ "label", "dashboard", "visualization", + "dataset", ] as const; // Utility: Get regex for references @@ -244,7 +247,7 @@ export function getCompletionItemId(data: ICompletionItem) { // Utility: Get catalog item ID export function getCatalogItemId( - item: CatalogItem | ICatalogDateAttribute | IAttributeDisplayFormMetadataObject, + item: CatalogItem | ICatalogDateAttribute | IAttributeDisplayFormMetadataObject | IDataSetMetadataObject, ): string | null { if (isCatalogFact(item)) { return item.fact.id; @@ -264,12 +267,15 @@ export function getCatalogItemId( if (isAttributeDisplayFormMetadataObject(item)) { return item.id; } + if (isDataSetMetadataObject(item)) { + return item.id; + } return null; } // Utility: Get catalog item ID export function getCatalogItemTitle( - item: CatalogItem | ICatalogDateAttribute | IAttributeDisplayFormMetadataObject, + item: CatalogItem | ICatalogDateAttribute | IAttributeDisplayFormMetadataObject | IDataSetMetadataObject, ) { if (isCatalogFact(item)) { return item.fact.title ?? item.fact.id; @@ -289,12 +295,15 @@ export function getCatalogItemTitle( if (isAttributeDisplayFormMetadataObject(item)) { return item.title ?? item.id; } + if (isDataSetMetadataObject(item)) { + return item.title ?? item.id; + } return "Unknown Item"; } // Utility: Get a catalog item type export function getCatalogItemType( - item: CatalogItem | ICatalogDateAttribute | IAttributeDisplayFormMetadataObject, + item: CatalogItem | ICatalogDateAttribute | IAttributeDisplayFormMetadataObject | IDataSetMetadataObject, ): (typeof SupportedReferenceTypes)[number] | null { if (isCatalogFact(item)) { return "fact"; @@ -314,6 +323,9 @@ export function getCatalogItemType( if (isAttributeDisplayFormMetadataObject(item)) { return "label"; } + if (isDataSetMetadataObject(item)) { + return "dataset"; + } return null; } diff --git a/libs/sdk-ui-gen-ai/src/model.ts b/libs/sdk-ui-gen-ai/src/model.ts index 9735baa3d57..012e5c30a7b 100644 --- a/libs/sdk-ui-gen-ai/src/model.ts +++ b/libs/sdk-ui-gen-ai/src/model.ts @@ -37,7 +37,7 @@ export type GenAIAgent = { */ export type TextContentObject = { id: string; - type: "metric" | "attribute" | "fact" | "date" | "label" | "dashboard" | "visualization"; + type: "metric" | "attribute" | "fact" | "date" | "label" | "dashboard" | "visualization" | "dataset"; title: string; }; diff --git a/libs/sdk-ui-gen-ai/styles/scss/messages.scss b/libs/sdk-ui-gen-ai/styles/scss/messages.scss index b72532bc499..2ae8e0abd0c 100644 --- a/libs/sdk-ui-gen-ai/styles/scss/messages.scss +++ b/libs/sdk-ui-gen-ai/styles/scss/messages.scss @@ -7,6 +7,8 @@ @use "@gooddata/sdk-ui-kit/styles/scss/Form/mixins" as form-mixins; @use "@gooddata/sdk-ui-kit/styles/scss/typo-mixins" as typo-mixins; +$dataset_color: #952f8e; + //MIXINS @mixin content-markdown($base, $type: "user") { @@ -107,7 +109,13 @@ .gd-gen-ai-chat__message__object { font-weight: normal; border-radius: 20px; - padding: 0 5px; + padding: 3px 5px; + display: inline-flex; + align-items: center; + position: relative; + top: 0.2em; + font-size: 12px; + line-height: 12px; @if $type == "user" { border: 1px solid var(--gd-palette-complementary-0-t10); @@ -127,7 +135,7 @@ @if $type == "user" { color: kit-variables.$gd-color-white; } @else { - color: kit-variables.$gd-color-object-type-metric; + color: kit-variables.$gd-color-link; .gd-gen-ai-chat__message-icon::before { background-color: kit-variables.$gd-color-object-type-metric; } @@ -138,7 +146,7 @@ @if $type == "user" { color: kit-variables.$gd-color-white; } @else { - color: kit-variables.$gd-color-object-type-metric; + color: kit-variables.$gd-color-link; .gd-gen-ai-chat__message-icon::before { background-color: kit-variables.$gd-color-object-type-metric; } @@ -150,7 +158,7 @@ @if $type == "user" { color: kit-variables.$gd-color-white; } @else { - color: kit-variables.$gd-color-object-type-attribute; + color: kit-variables.$gd-color-link; .gd-gen-ai-chat__message-icon::before { background-color: kit-variables.$gd-color-object-type-attribute; } @@ -161,19 +169,30 @@ @if $type == "user" { color: kit-variables.$gd-color-white; } @else { - color: kit-variables.$gd-color-object-type-date; + color: kit-variables.$gd-color-link; .gd-gen-ai-chat__message-icon::before { background-color: kit-variables.$gd-color-object-type-date; } } } + &.dataset { + @if $type == "user" { + color: kit-variables.$gd-color-white; + } @else { + color: kit-variables.$gd-color-link; + .gd-gen-ai-chat__message-icon::before { + background-color: $dataset_color; + } + } + } + &.dashboard { font-weight: bold; @if $type == "user" { color: kit-variables.$gd-color-white; } @else { - color: kit-variables.$gd-color-text; + color: kit-variables.$gd-color-link; .gd-gen-ai-chat__message-icon::before { background-color: kit-variables.$gd-color-text; } @@ -185,7 +204,7 @@ @if $type == "user" { color: kit-variables.$gd-color-white; } @else { - color: kit-variables.$gd-color-text; + color: kit-variables.$gd-color-link; .gd-gen-ai-chat__message-icon::before { background-color: kit-variables.$gd-color-text; } @@ -194,9 +213,8 @@ .gd-gen-ai-chat__message-icon { display: inline-block; - width: 18px; - height: 18px; - margin-bottom: -0.3em; + width: 14px; + height: 14px; margin-right: 5px; &::before { @@ -225,6 +243,10 @@ @include variables.gd-svg-mask("date"); } + &.dataset .gd-gen-ai-chat__message-icon { + @include variables.gd-svg-mask("dataset"); + } + &.dashboard .gd-gen-ai-chat__message-icon { @include variables.gd-svg-mask("dashboard"); } diff --git a/libs/sdk-ui-gen-ai/styles/scss/variables.scss b/libs/sdk-ui-gen-ai/styles/scss/variables.scss index c1b7d7da040..326af14f5f6 100644 --- a/libs/sdk-ui-gen-ai/styles/scss/variables.scss +++ b/libs/sdk-ui-gen-ai/styles/scss/variables.scss @@ -34,6 +34,7 @@ $base_path: "@gooddata/sdk-ui-kit/styles"; mask: url($base_path + "/icons/" + $filename + ".svg"); mask-repeat: no-repeat; mask-position: center; + mask-size: contain; } } diff --git a/libs/sdk-ui-geo/package.json b/libs/sdk-ui-geo/package.json index 38ef88b15db..2904d55293a 100644 --- a/libs/sdk-ui-geo/package.json +++ b/libs/sdk-ui-geo/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-geo", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData.UI SDK - Geo Charts", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-kit/package.json b/libs/sdk-ui-kit/package.json index 493cc0080d9..35b9ab648a4 100644 --- a/libs/sdk-ui-kit/package.json +++ b/libs/sdk-ui-kit/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-kit", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK - UI Building Components", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-kit/styles/icons/dataset.svg b/libs/sdk-ui-kit/styles/icons/dataset.svg new file mode 100644 index 00000000000..f126fdcc072 --- /dev/null +++ b/libs/sdk-ui-kit/styles/icons/dataset.svg @@ -0,0 +1,3 @@ + + + diff --git a/libs/sdk-ui-kit/styles/scss/messages.scss b/libs/sdk-ui-kit/styles/scss/messages.scss index 266cf6e8154..68164d66644 100644 --- a/libs/sdk-ui-kit/styles/scss/messages.scss +++ b/libs/sdk-ui-kit/styles/scss/messages.scss @@ -95,7 +95,9 @@ $gd-message-padding-vertical: 4px; box-sizing: border-box; display: inline-block; padding: $gd-message-padding-vertical 8px $gd-message-padding-vertical 10px; - @include mixins.clearfix(); + // min-height: auto instead of the mixin default 1px - 1px overrides the flex automatic + // minimum size, letting any flex parent squeeze the message below its content. + @include mixins.clearfix(auto); line-height: 1.4em; pointer-events: all; diff --git a/libs/sdk-ui-loaders/package.json b/libs/sdk-ui-loaders/package.json index 2e2bd4052da..613b533b121 100644 --- a/libs/sdk-ui-loaders/package.json +++ b/libs/sdk-ui-loaders/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-loaders", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK Runtime Component Loaders", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-pivot/package.json b/libs/sdk-ui-pivot/package.json index f12d65d5f25..1bf72c17195 100644 --- a/libs/sdk-ui-pivot/package.json +++ b/libs/sdk-ui-pivot/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-pivot", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData.UI SDK - Pivot Table", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-pluggable-application/package.json b/libs/sdk-ui-pluggable-application/package.json index 3ab41b33a0b..90c7ba5a46c 100644 --- a/libs/sdk-ui-pluggable-application/package.json +++ b/libs/sdk-ui-pluggable-application/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-pluggable-application", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK React helpers for pluggable applications", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-pluggable-host/package.json b/libs/sdk-ui-pluggable-host/package.json index 0c7f52ca6a9..d13721a2792 100644 --- a/libs/sdk-ui-pluggable-host/package.json +++ b/libs/sdk-ui-pluggable-host/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-pluggable-host", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK runtime for hosting pluggable applications — registry, loader, routing, platform context, default UI chrome", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-semantic-search/package.json b/libs/sdk-ui-semantic-search/package.json index 21537accbed..7cc0058ec40 100644 --- a/libs/sdk-ui-semantic-search/package.json +++ b/libs/sdk-ui-semantic-search/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-semantic-search", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK TypeScript & React skeleton", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-tests-app/package.json b/libs/sdk-ui-tests-app/package.json index cdd712be05c..61c5b99bf2d 100644 --- a/libs/sdk-ui-tests-app/package.json +++ b/libs/sdk-ui-tests-app/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-tests-app", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": true, "description": "GoodData SDK e2e tests", "license": "LicenseRef-LICENSE", diff --git a/libs/sdk-ui-tests-e2e/package.json b/libs/sdk-ui-tests-e2e/package.json index bdac60caa9c..7a166179a51 100644 --- a/libs/sdk-ui-tests-e2e/package.json +++ b/libs/sdk-ui-tests-e2e/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-tests-e2e", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": true, "description": "GoodData SDK e2e tests", "license": "LicenseRef-LICENSE", diff --git a/libs/sdk-ui-tests-reference-workspace/package.json b/libs/sdk-ui-tests-reference-workspace/package.json index 75ba3106a4d..8b720b205f8 100644 --- a/libs/sdk-ui-tests-reference-workspace/package.json +++ b/libs/sdk-ui-tests-reference-workspace/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-tests-reference-workspace", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": true, "description": "GoodData SDK reference workspace", "license": "LicenseRef-LICENSE", diff --git a/libs/sdk-ui-tests-scenarios/package.json b/libs/sdk-ui-tests-scenarios/package.json index 817c806ba90..9640c907c21 100644 --- a/libs/sdk-ui-tests-scenarios/package.json +++ b/libs/sdk-ui-tests-scenarios/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-tests-scenarios", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData React components scenarios project", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-tests-storybook/package.json b/libs/sdk-ui-tests-storybook/package.json index fc9b43f1cbc..bbd4aa97a65 100644 --- a/libs/sdk-ui-tests-storybook/package.json +++ b/libs/sdk-ui-tests-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-tests-storybook", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData React components storybook", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-theme-provider/package.json b/libs/sdk-ui-theme-provider/package.json index abd6bcc3005..ca57070946f 100644 --- a/libs/sdk-ui-theme-provider/package.json +++ b/libs/sdk-ui-theme-provider/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-theme-provider", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK - Theme provider", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-vis-commons/package.json b/libs/sdk-ui-vis-commons/package.json index 2266adc1972..133237f20ba 100644 --- a/libs/sdk-ui-vis-commons/package.json +++ b/libs/sdk-ui-vis-commons/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-vis-commons", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData.UI SDK - common functionality for different types of visualizations", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/sdk-ui-web-components/package.json b/libs/sdk-ui-web-components/package.json index 423b1b20924..11096c90478 100644 --- a/libs/sdk-ui-web-components/package.json +++ b/libs/sdk-ui-web-components/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-web-components", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData Web Components wrapper for GoodData.UI", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", diff --git a/libs/sdk-ui/package.json b/libs/sdk-ui/package.json index 6260b75f075..7af11ae2ea2 100644 --- a/libs/sdk-ui/package.json +++ b/libs/sdk-ui/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData.UI SDK - Core", "license": "MIT", "author": "GoodData Corporation", diff --git a/libs/util/package.json b/libs/util/package.json index efb267a5c8a..fbb67cbf201 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/util", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData Utility Functions", "license": "MIT", "author": "GoodData", diff --git a/templates/pluggable-module/harness/package.json b/templates/pluggable-module/harness/package.json index 591ce0e1887..fac7161b946 100644 --- a/templates/pluggable-module/harness/package.json +++ b/templates/pluggable-module/harness/package.json @@ -1,6 +1,6 @@ { "name": "gdc-app-template-name-harness", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": true, "description": "Standalone harness for gdc-app-template-name module", "license": "UNLICENSED", diff --git a/templates/pluggable-module/module/package.json b/templates/pluggable-module/module/package.json index ccfbd6d5fd2..d418c3f21ab 100644 --- a/templates/pluggable-module/module/package.json +++ b/templates/pluggable-module/module/package.json @@ -1,6 +1,6 @@ { "name": "gdc-app-template-name-module", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": true, "description": "{applicationTemplateTitle} pluggable application module", "license": "UNLICENSED", diff --git a/tools/app-toolkit/package.json b/tools/app-toolkit/package.json index 993c44c6788..89b5ce7ca83 100644 --- a/tools/app-toolkit/package.json +++ b/tools/app-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/app-toolkit", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "CLI with useful tools for creating and maintaining GoodData web applications.", "license": "LicenseRef-LICENSE", "author": "GoodData", diff --git a/tools/catalog-export/package.json b/tools/catalog-export/package.json index 1fc1fae37bf..842559dbb2b 100644 --- a/tools/catalog-export/package.json +++ b/tools/catalog-export/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/catalog-export", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK Catalog Export tooling", "license": "MIT", "author": "GoodData", diff --git a/tools/create-pluggable-module/package.json b/tools/create-pluggable-module/package.json index 47a2391bd7e..6fe941f892b 100644 --- a/tools/create-pluggable-module/package.json +++ b/tools/create-pluggable-module/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/create-pluggable-module", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "Scaffolder for GoodData pluggable applications. Invoked via `npm init @gooddata/pluggable-module`.", "license": "MIT", "author": "GoodData Corporation", diff --git a/tools/dashboard-plugin-template/package.json b/tools/dashboard-plugin-template/package.json index da066a001ce..a4aae5c2298 100644 --- a/tools/dashboard-plugin-template/package.json +++ b/tools/dashboard-plugin-template/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/dashboard-plugin-template", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": true, "description": "GoodData Template for Dashboard Plugins", "license": "LicenseRef-LICENSE", diff --git a/tools/eslint-config/package.json b/tools/eslint-config/package.json index c4d2e1f25a4..5e038ce7d3a 100644 --- a/tools/eslint-config/package.json +++ b/tools/eslint-config/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/eslint-config", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "license": "MIT", "author": "GoodData", "repository": { diff --git a/tools/i18n-toolkit/package.json b/tools/i18n-toolkit/package.json index 5f451206e78..b09da4822b1 100644 --- a/tools/i18n-toolkit/package.json +++ b/tools/i18n-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/i18n-toolkit", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "Localization validator to validate localization complexity and intl and html format.", "license": "MIT", "author": "GoodData", diff --git a/tools/lint-config/package.json b/tools/lint-config/package.json index 41d18fe9d53..291c5093b90 100644 --- a/tools/lint-config/package.json +++ b/tools/lint-config/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/lint-config", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "Linter-agnostic shared rules for @gooddata/eslint-config and @gooddata/oxlint-config", "license": "MIT", "author": "GoodData", diff --git a/tools/mock-handling/package.json b/tools/mock-handling/package.json index da890435201..e44cc9d1922 100644 --- a/tools/mock-handling/package.json +++ b/tools/mock-handling/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/mock-handling", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK Mock data capture and management tool", "license": "MIT", "author": "GoodData", diff --git a/tools/oxlint-config/package.json b/tools/oxlint-config/package.json index a43dcb4f5c6..b193b87d9c0 100644 --- a/tools/oxlint-config/package.json +++ b/tools/oxlint-config/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/oxlint-config", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "license": "MIT", "author": "GoodData", "repository": { diff --git a/tools/plugin-toolkit/package.json b/tools/plugin-toolkit/package.json index 303c5b1b56e..143344701b0 100644 --- a/tools/plugin-toolkit/package.json +++ b/tools/plugin-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/plugin-toolkit", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData Set of Tools for working with Plugins", "license": "LicenseRef-LICENSE", "author": "GoodData", diff --git a/tools/react-app-template/package.json b/tools/react-app-template/package.json index 9f5ca778aa5..1261df9308e 100644 --- a/tools/react-app-template/package.json +++ b/tools/react-app-template/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/react-app-template", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "private": true, "description": "GoodData Template for React App", "license": "LicenseRef-LICENSE", diff --git a/tools/reference-workspace-mgmt/package.json b/tools/reference-workspace-mgmt/package.json index cc52f13bc8d..002bf78d639 100644 --- a/tools/reference-workspace-mgmt/package.json +++ b/tools/reference-workspace-mgmt/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/reference-workspace-mgmt", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "Command line tools for reference workspace management", "license": "MIT", "author": "GoodData", diff --git a/tools/reference-workspace/package.json b/tools/reference-workspace/package.json index 5861d113fd5..b7867a76b32 100644 --- a/tools/reference-workspace/package.json +++ b/tools/reference-workspace/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/reference-workspace", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData SDK - Reference Workspace for tests", "license": "MIT", "author": "GoodData", diff --git a/tools/stylelint-config/package.json b/tools/stylelint-config/package.json index 9926b4dc60f..8a994d0c8b0 100644 --- a/tools/stylelint-config/package.json +++ b/tools/stylelint-config/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/stylelint-config", - "version": "11.54.0-alpha.2", + "version": "11.54.0-alpha.3", "description": "GoodData CSS Style Guide", "keywords": [ "config", From 26685c8d43cf596381921103a6eec89729cd27d5 Mon Sep 17 00:00:00 2001 From: git-action Date: Fri, 21 Aug 2026 16:15:03 +0000 Subject: [PATCH 2/2] chore: update dependencies after rush update risk: low --- common/config/rush/pnpm-lock.yaml | 176 ++++++++++++++++------------- common/scripts/install-run-rush.js | 2 - common/scripts/install-run.js | 2 - 3 files changed, 99 insertions(+), 81 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 119a3be6fbc..dea504d1c47 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -4,16 +4,13 @@ settings: autoInstallPeers: false excludeLinksFromLockfile: false -overrides: - minimatch@>=10.0.0 <10.2.3: 10.2.5 - pnpmfileChecksum: sha256-E1T7OJ3DLTjpDqf4RdJzK9VDtAxgm4gDEQCLYdHD8nI= importers: .: {} - ../../../sdk/examples/playground: + ../../examples/playground: devDependencies: '@codemirror/state': specifier: 6.5.3 @@ -172,13 +169,13 @@ importers: specifier: 8.0.16 version: 8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/examples/sdk-interactive-examples: + ../../examples/sdk-interactive-examples: devDependencies: validate-npm-package-name: specifier: ^5.0.0 version: 5.0.1 - ../../../sdk/examples/sdk-interactive-examples/examples-template: + ../../examples/sdk-interactive-examples/examples-template: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -314,7 +311,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-attributefilter: + ../../examples/sdk-interactive-examples/examples/example-attributefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -450,7 +447,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-chartconfig: + ../../examples/sdk-interactive-examples/examples/example-chartconfig: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -586,7 +583,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-columnchart: + ../../examples/sdk-interactive-examples/examples/example-columnchart: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -722,7 +719,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-combochart: + ../../examples/sdk-interactive-examples/examples/example-combochart: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -858,7 +855,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-dashboard: + ../../examples/sdk-interactive-examples/examples/example-dashboard: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -994,7 +991,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-datefilter: + ../../examples/sdk-interactive-examples/examples/example-datefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1130,7 +1127,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-dependentfilters: + ../../examples/sdk-interactive-examples/examples/example-dependentfilters: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1266,7 +1263,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-execute: + ../../examples/sdk-interactive-examples/examples/example-execute: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1411,7 +1408,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-granularity: + ../../examples/sdk-interactive-examples/examples/example-granularity: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1547,7 +1544,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-headline: + ../../examples/sdk-interactive-examples/examples/example-headline: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1683,7 +1680,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-pivottable: + ../../examples/sdk-interactive-examples/examples/example-pivottable: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1819,7 +1816,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-relativedatefilter: + ../../examples/sdk-interactive-examples/examples/example-relativedatefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1955,7 +1952,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/examples/sdk-interactive-examples/examples/example-repeater: + ../../examples/sdk-interactive-examples/examples/example-repeater: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -2091,7 +2088,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/libs/api-client-tiger: + ../../libs/api-client-tiger: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2194,7 +2191,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-backend-base: + ../../libs/sdk-backend-base: dependencies: '@braintree/sanitize-url': specifier: ^6.0.0 @@ -2306,7 +2303,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-backend-mockingbird: + ../../libs/sdk-backend-mockingbird: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -2406,7 +2403,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-backend-spi: + ../../libs/sdk-backend-spi: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2491,7 +2488,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-backend-tiger: + ../../libs/sdk-backend-tiger: dependencies: '@gooddata/api-client-tiger': specifier: workspace:* @@ -2633,7 +2630,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-code-convertors: + ../../libs/sdk-code-convertors: dependencies: '@gooddata/api-client-tiger': specifier: workspace:* @@ -2715,7 +2712,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-code-schemas: + ../../libs/sdk-code-schemas: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -2790,7 +2787,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-e2e-utils: + ../../libs/sdk-e2e-utils: dependencies: '@playwright/test': specifier: 1.62.1 @@ -2878,7 +2875,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/libs/sdk-embedding: + ../../libs/sdk-embedding: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2963,7 +2960,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-model: + ../../libs/sdk-model: dependencies: '@types/geojson': specifier: ^7946.0.16 @@ -3063,7 +3060,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-pluggable-application-model: + ../../libs/sdk-pluggable-application-model: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -3142,7 +3139,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/libs/sdk-ui: + ../../libs/sdk-ui: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -3329,7 +3326,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-all: + ../../libs/sdk-ui-all: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -3426,7 +3423,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/libs/sdk-ui-application-header: + ../../libs/sdk-ui-application-header: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -3583,7 +3580,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-catalog: + ../../libs/sdk-ui-catalog: dependencies: '@babel/core': specifier: 7.28.4 @@ -3773,7 +3770,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-charts: + ../../libs/sdk-ui-charts: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -3996,7 +3993,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-dashboard: + ../../libs/sdk-ui-dashboard: dependencies: '@codemirror/language': specifier: 6.12.1 @@ -4267,7 +4264,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-ext: + ../../libs/sdk-ui-ext: dependencies: '@codemirror/commands': specifier: 6.10.1 @@ -4547,7 +4544,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-filters: + ../../libs/sdk-ui-filters: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -4746,7 +4743,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-gen-ai: + ../../libs/sdk-ui-gen-ai: dependencies: '@codemirror/autocomplete': specifier: 6.20.0 @@ -4993,7 +4990,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-geo: + ../../libs/sdk-ui-geo: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -5180,7 +5177,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-kit: + ../../libs/sdk-ui-kit: dependencies: '@aaronhayes/react-use-hubspot-form': specifier: 2.1.2 @@ -5481,7 +5478,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-loaders: + ../../libs/sdk-ui-loaders: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -5614,7 +5611,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/libs/sdk-ui-pivot: + ../../libs/sdk-ui-pivot: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -5801,7 +5798,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-pluggable-application: + ../../libs/sdk-ui-pluggable-application: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -5925,7 +5922,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-ui-pluggable-host: + ../../libs/sdk-ui-pluggable-host: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -6103,7 +6100,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-semantic-search: + ../../libs/sdk-ui-semantic-search: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -6263,7 +6260,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-tests-app: + ../../libs/sdk-ui-tests-app: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6401,7 +6398,7 @@ importers: specifier: 8.0.16 version: 8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-ui-tests-e2e: + ../../libs/sdk-ui-tests-e2e: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6500,7 +6497,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/libs/sdk-ui-tests-reference-workspace: + ../../libs/sdk-ui-tests-reference-workspace: devDependencies: '@gooddata/catalog-export': specifier: workspace:* @@ -6566,7 +6563,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/libs/sdk-ui-tests-scenarios: + ../../libs/sdk-ui-tests-scenarios: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6725,7 +6722,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-ui-tests-storybook: + ../../libs/sdk-ui-tests-storybook: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6938,7 +6935,7 @@ importers: specifier: 4.1.0 version: 4.1.0(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3)) - ../../../sdk/libs/sdk-ui-theme-provider: + ../../libs/sdk-ui-theme-provider: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -7095,7 +7092,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-ui-vis-commons: + ../../libs/sdk-ui-vis-commons: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -7264,7 +7261,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.8) - ../../../sdk/libs/sdk-ui-web-components: + ../../libs/sdk-ui-web-components: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -7439,7 +7436,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/libs/util: + ../../libs/util: dependencies: lodash-es: specifier: ^4.17.23 @@ -7521,7 +7518,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/templates/pluggable-module/harness: + ../../templates/pluggable-module/harness: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -7630,7 +7627,7 @@ importers: specifier: 8.0.16 version: 8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/templates/pluggable-module/module: + ../../templates/pluggable-module/module: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -7763,7 +7760,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/tools/app-toolkit: + ../../tools/app-toolkit: dependencies: '@babel/cli': specifier: ^7.23.4 @@ -7917,7 +7914,7 @@ importers: specifier: 5.107.2 version: 5.107.2(esbuild@0.28.1)(webpack-cli@7.0.3) - ../../../sdk/tools/catalog-export: + ../../tools/catalog-export: dependencies: '@babel/core': specifier: 7.28.4 @@ -8041,7 +8038,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/tools/create-pluggable-module: + ../../tools/create-pluggable-module: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -8116,7 +8113,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/tools/dashboard-plugin-template: + ../../tools/dashboard-plugin-template: dependencies: json-stable-stringify: specifier: 1.3.0 @@ -8312,7 +8309,7 @@ importers: specifier: 5.2.4 version: 5.2.4(tslib@2.8.1)(webpack-cli@7.0.3)(webpack@5.107.2) - ../../../sdk/tools/eslint-config: + ../../tools/eslint-config: devDependencies: '@eslint/js': specifier: 9.28.0 @@ -8408,7 +8405,7 @@ importers: specifier: ^5.2.0 version: 5.3.0(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/tools/i18n-toolkit: + ../../tools/i18n-toolkit: dependencies: '@formatjs/cli-lib': specifier: ^6.1.1 @@ -8517,7 +8514,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/tools/lint-config: + ../../tools/lint-config: devDependencies: '@typescript/native-preview': specifier: 7.0.0-dev.20260202.1 @@ -8532,7 +8529,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/tools/mock-handling: + ../../tools/mock-handling: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -8641,7 +8638,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/tools/oxlint-config: + ../../tools/oxlint-config: devDependencies: '@eslint/js': specifier: 9.28.0 @@ -8737,7 +8734,7 @@ importers: specifier: ^5.2.0 version: 5.3.0(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/tools/plugin-toolkit: + ../../tools/plugin-toolkit: dependencies: '@babel/cli': specifier: ^7.23.4 @@ -8882,7 +8879,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/tools/react-app-template: + ../../tools/react-app-template: dependencies: '@codemirror/state': specifier: 6.5.3 @@ -9045,7 +9042,7 @@ importers: specifier: 5.2.4 version: 5.2.4(tslib@2.8.1)(webpack-cli@7.0.3)(webpack@5.107.2) - ../../../sdk/tools/reference-workspace: + ../../tools/reference-workspace: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -9121,7 +9118,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/tools/reference-workspace-mgmt: + ../../tools/reference-workspace-mgmt: dependencies: '@gooddata/catalog-export': specifier: workspace:* @@ -9203,7 +9200,7 @@ importers: specifier: 4.1.8 version: 4.1.8(@types/node@24.12.0)(@vitest/coverage-v8@4.1.8)(esbuild@0.28.1)(happy-dom@20.9.0)(jiti@2.6.1)(sass@1.70.0)(terser@5.49.0)(yaml@2.8.3) - ../../../sdk/tools/stylelint-config: + ../../tools/stylelint-config: dependencies: postcss: specifier: 8.5.10 @@ -10407,6 +10404,14 @@ packages: '@internationalized/string@3.2.9': resolution: {integrity: sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} + engines: {node: 20 || >=22} + '@isaacs/cliui@9.0.0': resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} @@ -13340,10 +13345,12 @@ packages: cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} + deprecated: v4 is no longer maintained, upgrade to v5 cron-parser@5.6.2: resolution: {integrity: sha512-yJ/G1LVir6CnlkLI40CsampPLKl1SprGGlUagWtGJxewytRVYezv5xVyzzbT+Pvzx+VIRvZVF7/a0eEMTxdnTA==} engines: {node: '>=18'} + deprecated: 'Published tarball was built from a stale dist/ and is missing the fixes from #414 and #415 — its contents are effectively v5.6.1. Upgrade to v5.7.0.' cross-spawn@6.0.6: resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} @@ -13956,6 +13963,7 @@ packages: eslint@9.39.5: resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true peerDependencies: jiti: '*' @@ -15590,6 +15598,10 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@10.2.3: resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} engines: {node: 18 || 20 || >=22} @@ -19418,6 +19430,12 @@ snapshots: dependencies: '@swc/helpers': 0.5.23 + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.1': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@9.0.0': {} '@isaacs/fs-minipass@4.0.1': @@ -21102,8 +21120,8 @@ snapshots: '@typescript-eslint/project-service@8.58.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -21518,11 +21536,11 @@ snapshots: acorn-loose@8.5.2: dependencies: - acorn: 8.16.0 + acorn: 8.17.0 acorn-walk@8.3.5: dependencies: - acorn: 8.16.0 + acorn: 8.17.0 acorn@8.16.0: {} @@ -23007,7 +23025,7 @@ snapshots: functional-red-black-tree: 1.0.1 jsx-ast-utils-x: 0.1.0 lodash.merge: 4.6.2 - minimatch: 10.2.5 + minimatch: 10.1.1 scslre: 0.3.0 semver: 7.7.3 typescript: 5.9.3 @@ -24986,6 +25004,10 @@ snapshots: minimalistic-assert@1.0.1: {} + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.1 + minimatch@10.2.3: dependencies: brace-expansion: 5.0.8 @@ -27027,7 +27049,7 @@ snapshots: tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.20.1 + enhanced-resolve: 5.24.3 tapable: 2.3.3 tsconfig-paths: 4.2.0 diff --git a/common/scripts/install-run-rush.js b/common/scripts/install-run-rush.js index 4daf9508912..5b1da11a79b 100644 --- a/common/scripts/install-run-rush.js +++ b/common/scripts/install-run-rush.js @@ -1,5 +1,3 @@ -// (C) 2026 GoodData Corporation - // THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. // // This script is intended for usage in an automated build environment where the Rush command may not have diff --git a/common/scripts/install-run.js b/common/scripts/install-run.js index 875968d0f25..75d6014e61c 100644 --- a/common/scripts/install-run.js +++ b/common/scripts/install-run.js @@ -1,5 +1,3 @@ -// (C) 2026 GoodData Corporation - // THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. // // This script is intended for usage in an automated build environment where a Node tool may not have