From f059e170d5842b17e4d9355bfdcf4e74aa859594 Mon Sep 17 00:00:00 2001 From: git-action Date: Wed, 13 May 2026 03:15:05 +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(d8a7ff1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit risk: low --- NOTICE | 16 +- ...e-parameters-per-tab_2026-05-07-10-07.json | 10 + ...e-parameters-per-tab_2026-05-07-10-35.json | 10 + ...e-parameters-per-tab_2026-05-07-11-29.json | 10 + ...-context-after-dashboard-tab-deletion.json | 10 + .../SHA_master_2026-05-12-09-43.json | 10 + .../SHA_master_2026-05-12-12-47.json | 10 + ...2-llm-link-shell-app_2026-05-12-08-00.json | 10 + ...e-spi-types-to-model_2026-05-12-11-44.json | 10 + common/config/rush/.pnpmfile.cjs | 2 +- .../rush/browser-approved-packages.json | 2652 ++++++++--------- common/config/rush/pnpm-lock.yaml | 478 ++- common/config/rush/version-policies.json | 4 +- .../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/api-extractor.json | 23 - .../api/api-client-tiger.api.md | 1668 +++++++++-- libs/api-client-tiger/package.json | 4 +- .../src/endpoints/entitiesObjects/index.ts | 1 + .../src/gd-tiger-model/TigerTypes.ts | 5 + .../src/generated/ai-json-api/api.ts | 5 + .../generated/ai-json-api/openapi-spec.json | 17 + libs/api-client-tiger/src/index.ts | 214 +- .../api-client-tiger/src/metadataUtilities.ts | 3 + libs/sdk-backend-base/package.json | 4 +- libs/sdk-backend-mockingbird/package.json | 4 +- .../api/sdk-backend-spi.api.md | 24 +- libs/sdk-backend-spi/package.json | 4 +- libs/sdk-backend-spi/src/common/settings.ts | 54 +- .../src/workspace/genAI/index.ts | 6 +- libs/sdk-backend-tiger/package.json | 4 +- .../src/backend/workspace/dashboards/index.ts | 44 +- .../workspace/dashboards/tests/index.test.ts | 38 + .../workspace/genAI/ChatConversations.ts | 2 +- .../v2/AnalyticalDashboardConverter.ts | 1 + .../convertors/fromBackend/genAIConvertor.ts | 1 + .../fromBackend/tests/genAIConvertor.test.ts | 25 + .../tests/DashboardParameterConverter.test.ts | 198 +- .../toBackend/AnalyticalDashboardConverter.ts | 5 +- libs/sdk-code-convertors/api-extractor.json | 14 +- .../api/sdk-code-convertors.api.md | 2515 +++++++++++++--- libs/sdk-code-convertors/package.json | 4 +- .../sdk-code-convertors/python/pyproject.toml | 2 +- .../src/configs/areaChart.ts | 35 +- .../src/configs/barChart.ts | 35 +- .../src/configs/bubbleChart.ts | 35 +- .../src/configs/bulletChart.ts | 35 +- .../src/configs/columnChart.ts | 35 +- .../src/configs/comboChart.ts | 35 +- .../src/configs/dependencyWheelChart.ts | 35 +- .../src/configs/donutChart.ts | 35 +- .../src/configs/funnelChart.ts | 35 +- .../src/configs/geoAreaChart.ts | 37 +- .../src/configs/geoChart.ts | 37 +- .../src/configs/headlineChart.ts | 35 +- .../src/configs/heatmapChart.ts | 35 +- .../src/configs/lineChart.ts | 35 +- .../src/configs/pieChart.ts | 35 +- .../src/configs/pyramidChart.ts | 35 +- .../src/configs/repeaterChart.ts | 40 +- .../src/configs/sankeyChart.ts | 35 +- .../src/configs/scatterChart.ts | 35 +- libs/sdk-code-convertors/src/configs/table.ts | 37 +- .../src/configs/treemapChart.ts | 35 +- libs/sdk-code-convertors/src/configs/types.ts | 28 + libs/sdk-code-convertors/src/configs/utils.ts | 1 + .../src/configs/waterfallChart.ts | 35 +- libs/sdk-code-convertors/src/conts.ts | 8 + .../src/from/declarativeDashboardToYaml.ts | 9 + .../from/declarativeVisualisationToYaml.ts | 112 +- libs/sdk-code-convertors/src/index.ts | 224 +- .../src/to/yamlDashboardToDeclarative.ts | 21 +- .../src/to/yamlDatasetToDeclarative.ts | 4 + .../src/to/yamlVisualisationToDeclarative.ts | 8 +- .../src/utils/sharedUtils.ts | 1 + libs/sdk-code-schemas/package.json | 4 +- libs/sdk-e2e-utils/package.json | 4 +- libs/sdk-embedding/package.json | 4 +- libs/sdk-model/api/sdk-model.api.md | 19 + libs/sdk-model/package.json | 4 +- libs/sdk-model/src/dashboard/dashboard.ts | 20 +- libs/sdk-model/src/index.ts | 7 +- libs/sdk-model/src/settings/index.ts | 53 +- .../sdk-pluggable-application-model.api.md | 2 +- .../package.json | 5 +- .../src/platformContext.ts | 2 +- libs/sdk-ui-all/package.json | 4 +- libs/sdk-ui-catalog/package.json | 4 +- libs/sdk-ui-charts/package.json | 4 +- .../api/sdk-ui-dashboard.api.md | 23 +- libs/sdk-ui-dashboard/package.json | 4 +- libs/sdk-ui-dashboard/src/index.ts | 10 +- .../dashboard/common/parameterHydration.ts | 31 +- .../dashboard/common/stateInitializers.ts | 133 +- .../common/tests/parameterHydration.test.ts | 96 + .../dashboard/saveAsDashboardHandler.ts | 18 +- .../dashboard/saveDashboardHandler.ts | 23 +- .../src/model/store/dashboardStore.ts | 2 - .../src/model/store/meta/metaSelectors.ts | 15 +- .../src/model/store/parameters/index.ts | 19 - .../store/parameters/parametersSelectors.ts | 199 -- .../tests/parametersReducers.test.ts | 121 - .../tests/parametersSelectors.test.ts | 312 -- .../src/model/store/tabs/index.ts | 2 + .../parameters/parametersReducers.ts | 53 +- .../tabs/parameters/parametersSelectors.ts | 361 +++ .../{ => tabs}/parameters/parametersState.ts | 23 +- .../tests/parametersReducers.test.ts | 191 ++ .../tests/parametersSelectors.test.ts | 598 ++++ .../src/model/store/tabs/tabsState.ts | 2 + .../sdk-ui-dashboard/src/model/store/types.ts | 7 - .../DefaultParameterDraggingComponent.tsx | 2 +- .../dragAndDrop/useFilterDeleteDrop.ts | 4 +- .../filterBar/filterBar/DefaultFilterBar.tsx | 2 +- .../DashboardParameterFilter.tsx | 8 +- .../DashboardParameterPicker.tsx | 6 +- .../Insight/DashboardInsight.tsx | 2 +- libs/sdk-ui-ext/package.json | 4 +- libs/sdk-ui-filters/package.json | 4 +- libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md | 42 +- libs/sdk-ui-gen-ai/package.json | 4 +- .../src/components/GenAIChatConversations.tsx | 506 +++- .../src/components/GenAIChatWrapper.tsx | 54 +- .../ConversationVisualizationContent.tsx | 190 +- .../components/utils/conversationGrouper.ts | 8 + .../utils/tests/conversationGrouper.test.ts | 24 + libs/sdk-ui-gen-ai/src/index.ts | 8 + .../src/localization/bundles/en-US.json | 26 +- libs/sdk-ui-gen-ai/src/store/events.ts | 78 + .../src/store/messages/messagesSlice.ts | 61 +- .../src/store/sideEffects/index.ts | 3 + .../store/sideEffects/onConversationDelete.ts | 2 +- .../store/sideEffects/onConversationPin.ts | 53 + .../src/store/sideEffects/onEvent.ts | 63 + .../src/store/sideEffects/utils.ts | 4 - libs/sdk-ui-gen-ai/src/utils.ts | 31 + .../styles/scss/conversations.scss | 94 +- libs/sdk-ui-gen-ai/styles/scss/messages.scss | 4 + libs/sdk-ui-geo/package.json | 4 +- .../src/next/context/GeoLayersContext.tsx | 7 + .../context/tests/GeoLayersContext.test.tsx | 81 + .../src/next/layers/registry/output.ts | 1 + .../next/layers/registry/tests/output.test.ts | 12 +- libs/sdk-ui-kit/api/sdk-ui-kit.api.md | 2 +- libs/sdk-ui-kit/package.json | 4 +- libs/sdk-ui-kit/src/@ui/@types/icon.ts | 4 +- libs/sdk-ui-kit/src/@ui/UiIcon/icons.tsx | 14 + libs/sdk-ui-kit/src/@ui/UiMenu/hooks.tsx | 96 +- libs/sdk-ui-loaders/package.json | 4 +- libs/sdk-ui-pivot/package.json | 4 +- .../sdk-ui-pluggable-application/package.json | 4 +- libs/sdk-ui-semantic-search/package.json | 4 +- .../mapping-insightOnDashboard.spec.ts.json | 2 +- ...ull-featured_icon_0_document_0_desktop.png | Bin 124168 -> 125138 bytes ...i_UiIcon_-_themed_0_document_0_desktop.png | Bin 124410 -> 125390 bytes libs/sdk-ui-theme-provider/package.json | 4 +- libs/sdk-ui-vis-commons/package.json | 4 +- libs/sdk-ui/package.json | 4 +- libs/util/package.json | 4 +- tools/app-toolkit/package.json | 4 +- tools/catalog-export/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 | 4 +- tools/reference-workspace/package.json | 2 +- tools/stylelint-config/package.json | 2 +- 182 files changed, 9486 insertions(+), 3811 deletions(-) create mode 100644 common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-07.json create mode 100644 common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-35.json create mode 100644 common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-11-29.json create mode 100644 common/changes/@gooddata/sdk-ui-all/MPAV-LX-2173-delete-filter-context-after-dashboard-tab-deletion.json create mode 100644 common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-09-43.json create mode 100644 common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-12-47.json create mode 100644 common/changes/@gooddata/sdk-ui-all/pdo-gdai-1732-llm-link-shell-app_2026-05-12-08-00.json create mode 100644 common/changes/@gooddata/sdk-ui-all/pdo-lx-2351-move-spi-types-to-model_2026-05-12-11-44.json create mode 100644 libs/sdk-backend-tiger/src/backend/workspace/dashboards/tests/index.test.ts create mode 100644 libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/parameterHydration.test.ts delete mode 100644 libs/sdk-ui-dashboard/src/model/store/parameters/index.ts delete mode 100644 libs/sdk-ui-dashboard/src/model/store/parameters/parametersSelectors.ts delete mode 100644 libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersReducers.test.ts delete mode 100644 libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersSelectors.test.ts rename libs/sdk-ui-dashboard/src/model/store/{ => tabs}/parameters/parametersReducers.ts (50%) create mode 100644 libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersSelectors.ts rename libs/sdk-ui-dashboard/src/model/store/{ => tabs}/parameters/parametersState.ts (57%) create mode 100644 libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersReducers.test.ts create mode 100644 libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersSelectors.test.ts create mode 100644 libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationPin.ts create mode 100644 libs/sdk-ui-geo/src/next/context/tests/GeoLayersContext.test.tsx diff --git a/NOTICE b/NOTICE index 2f2780b900e..1c8c4e5143b 100644 --- a/NOTICE +++ b/NOTICE @@ -7,9 +7,9 @@ The following 3rd-party software packages may be used by or distributed with gooddata-ui-sdk. Any information relevant to third-party vendors listed below are collected using common, reasonable means. -Date generated: 2026-5-4 +Date generated: 2026-5-12 -Revision ID: 0c39c460e837a54efedde9d37131feb930e4b8a1 +Revision ID: 52d6a5f81cbc391c8c918fe465fad2be3e3de86f ================================================================================ ================================================================================ @@ -376,7 +376,7 @@ Revision ID: 0c39c460e837a54efedde9d37131feb930e4b8a1 - bail (2.0.2) [MIT] - balanced-match (2.0.0) [MIT] - base64-js (1.5.1) [MIT] -- baseline-browser-mapping (2.10.27) [Apache-2.0] +- baseline-browser-mapping (2.10.29) [Apache-2.0] - batch (0.6.1) [MIT] - binary-extensions (2.3.0) [MIT] - bl (4.1.0) [MIT] @@ -710,7 +710,7 @@ Revision ID: 0c39c460e837a54efedde9d37131feb930e4b8a1 - magic-string (0.30.21) [MIT] - make-dir (2.1.0) [MIT] - mapbox-gl (2.15.0) [BSD-3-Clause, MIT] -- maplibre-gl (4.7.1) [MIT, BSD-3-Clause, ISC, 0BSD] +- maplibre-gl (4.7.1) [MIT, BSD-3-Clause, 0BSD, ISC] - markdown-table (3.0.4) [MIT] - matchmediaquery (0.4.2) [MIT] - math-intrinsics (1.1.0) [MIT] @@ -5367,9 +5367,9 @@ MIT -------------------------------------------------------------------------------- -Package Title: baseline-browser-mapping (2.10.27) +Package Title: baseline-browser-mapping (2.10.29) -Package Locator: npm+baseline-browser-mapping$2.10.27 +Package Locator: npm+baseline-browser-mapping$2.10.29 Package Depth: Transitive -------------------------------------------------------------------------------- @@ -9407,7 +9407,7 @@ MIT, BSD-3-Clause * Other Licenses * -ISC, 0BSD +0BSD, ISC -------------------------------------------------------------------------------- @@ -38277,4 +38277,4 @@ POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -Report Generated by FOSSA on 2026-5-4 +Report Generated by FOSSA on 2026-5-12 diff --git a/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-07.json b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-07.json new file mode 100644 index 00000000000..17f4a684c92 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-07.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "comment": "sdk-model: Add per-tab `IDashboardTab.parameters`; deprecate root `IDashboard.parameters`", + "type": "none", + "packageName": "@gooddata/sdk-ui-all" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-35.json b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-35.json new file mode 100644 index 00000000000..678a780fcc7 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-35.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "comment": "api-client-tiger: Add `ITigerDashboardTab.parameters`", + "type": "none", + "packageName": "@gooddata/sdk-ui-all" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-11-29.json b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-11-29.json new file mode 100644 index 00000000000..906c3be0b22 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-11-29.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "comment": "sdk-backend-tiger: Read/write per-tab `parameters`; V1 root fallback only when no tab declares any", + "type": "none", + "packageName": "@gooddata/sdk-ui-all" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/MPAV-LX-2173-delete-filter-context-after-dashboard-tab-deletion.json b/common/changes/@gooddata/sdk-ui-all/MPAV-LX-2173-delete-filter-context-after-dashboard-tab-deletion.json new file mode 100644 index 00000000000..31d0c5dbdb2 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/MPAV-LX-2173-delete-filter-context-after-dashboard-tab-deletion.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-backend-tiger: Prevented creating new orphaned filter contexts on FE.", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-09-43.json b/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-09-43.json new file mode 100644 index 00000000000..6d2b0202a0c --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-09-43.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-gen-ai: implement conversation drag and drop using native browser DnD across pinned and rest sections", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-12-47.json b/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-12-47.json new file mode 100644 index 00000000000..01cbf739e87 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-12-47.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-gen-ai: refactor drill state management by replacing useDrillState hook with DrillState component and integrating it into ConversationVisualizationContent", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/pdo-gdai-1732-llm-link-shell-app_2026-05-12-08-00.json b/common/changes/@gooddata/sdk-ui-all/pdo-gdai-1732-llm-link-shell-app_2026-05-12-08-00.json new file mode 100644 index 00000000000..2fdd41cb6a6 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/pdo-gdai-1732-llm-link-shell-app_2026-05-12-08-00.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-gen-ai: build shell-host setting URLs in the AI chat when enableShellApplication is on, so the \"Change LLM model\" link lands on /organization/settings/workspaces/{id}/configuration with the #/ai/change-llm-model deep-link intact", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/pdo-lx-2351-move-spi-types-to-model_2026-05-12-11-44.json b/common/changes/@gooddata/sdk-ui-all/pdo-lx-2351-move-spi-types-to-model_2026-05-12-11-44.json new file mode 100644 index 00000000000..bf9ecbc86a6 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/pdo-lx-2351-move-spi-types-to-model_2026-05-12-11-44.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-model, spi-backend-spi: move ISettings related types from spi to model", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index 8725da6f96d..b2163c1ec4b 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -3,7 +3,7 @@ "use strict"; // baseline-browser-mapping needs to be updated to the latest version every 14 days -const baselineBrowserMappingVersion = "2.10.27"; +const baselineBrowserMappingVersion = "2.10.29"; // browserslist needs to be updated every 6 months const browserslistVersion = "4.28.2"; diff --git a/common/config/rush/browser-approved-packages.json b/common/config/rush/browser-approved-packages.json index 1b5483ed840..14c4dd5da82 100644 --- a/common/config/rush/browser-approved-packages.json +++ b/common/config/rush/browser-approved-packages.json @@ -1,1434 +1,1218 @@ -// DO NOT ADD COMMENTS IN THIS FILE. They will be lost when the Rush tool resaves it. -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/approved-packages.schema.json", - "packages": [ - { - "name": "@aaronhayes/react-use-hubspot-form", - "allowedCategories": [ "production" ] - }, - { - "name": "@babel/cli", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@babel/core", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@babel/plugin-proposal-export-default-from", - "allowedCategories": [ "production" ] - }, - { - "name": "@babel/plugin-transform-async-to-generator", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@babel/plugin-transform-class-properties", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@babel/plugin-transform-object-rest-spread", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@babel/plugin-transform-typescript", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@babel/preset-env", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@babel/preset-react", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@babel/preset-typescript", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@babel/runtime", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@braintree/sanitize-url", - "allowedCategories": [ "production" ] - }, - { - "name": "@codemirror/autocomplete", - "allowedCategories": [ "production" ] - }, - { - "name": "@codemirror/commands", - "allowedCategories": [ "production" ] - }, - { - "name": "@codemirror/lang-yaml", - "allowedCategories": [ "production" ] - }, - { - "name": "@codemirror/language", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@codemirror/lint", - "allowedCategories": [ "production" ] - }, - { - "name": "@codemirror/state", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@codemirror/view", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@componentdriven/csf", - "allowedCategories": [ "production" ] - }, - { - "name": "@eslint/js", - "allowedCategories": [ "tools" ] - }, - { - "name": "@evil-internetmann/react-dnd", - "allowedCategories": [ "production" ] - }, - { - "name": "@floating-ui/dom", - "allowedCategories": [ "production" ] - }, - { - "name": "@floating-ui/react", - "allowedCategories": [ "production" ] - }, - { - "name": "@floating-ui/react-dom", - "allowedCategories": [ "production" ] - }, - { - "name": "@formatjs/cli-lib", - "allowedCategories": [ "tools" ] - }, - { - "name": "@formatjs/icu-messageformat-parser", - "allowedCategories": [ "tools" ] - }, - { - "name": "@gooddata/api-client-tiger", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@gooddata/catalog-export", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/emailjs-mime-codec-new", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/eslint-config", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/fixtures", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@gooddata/i18n-toolkit", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/lint-config", - "allowedCategories": [ "tools" ] - }, - { - "name": "@gooddata/mock-handling", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@gooddata/number-formatter", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/oxlint-config", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/plugin-toolkit", - "allowedCategories": [ "tools" ] - }, - { - "name": "@gooddata/reference-workspace", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-backend-base", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-backend-mockingbird", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-backend-spi", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-backend-tiger", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-code-convertors", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-code-schemas", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-e2e-utils", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-embedding", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-model", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-pluggable-application-model", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-ui", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-catalog", - "allowedCategories": [ "examples" ] - }, - { - "name": "@gooddata/sdk-ui-charts", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-dashboard", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-ext", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-filters", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-gen-ai", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-geo", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-kit", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-loaders", - "allowedCategories": [ "examples", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-pivot", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@gooddata/sdk-ui-semantic-search", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@gooddata/sdk-ui-tests-app", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-ui-tests-reference-workspace", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-ui-tests-scenarios", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-ui-theme-provider", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@gooddata/sdk-ui-vis-commons", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/sdk-ui-web-components", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/stylelint-config", - "allowedCategories": [ "production" ] - }, - { - "name": "@gooddata/util", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@joint/core", - "allowedCategories": [ "production" ] - }, - { - "name": "@joint/layout-directed-graph", - "allowedCategories": [ "production" ] - }, - { - "name": "@lezer/highlight", - "allowedCategories": [ "production" ] - }, - { - "name": "@microsoft/api-documenter", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@microsoft/api-extractor", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@openapitools/openapi-generator-cli", - "allowedCategories": [ "production" ] - }, - { - "name": "@playwright/test", - "allowedCategories": [ "production" ] - }, - { - "name": "@react-aria/interactions", - "allowedCategories": [ "production" ] - }, - { - "name": "@reduxjs/toolkit", - "allowedCategories": [ "production" ] - }, - { - "name": "@storybook/addon-a11y", - "allowedCategories": [ "production" ] - }, - { - "name": "@storybook/builder-vite", - "allowedCategories": [ "production" ] - }, - { - "name": "@storybook/builder-webpack5", - "allowedCategories": [ "production" ] - }, - { - "name": "@storybook/cli", - "allowedCategories": [ "production" ] - }, - { - "name": "@storybook/manager-webpack5", - "allowedCategories": [ "production" ] - }, - { - "name": "@storybook/preset-scss", - "allowedCategories": [ "production" ] - }, - { - "name": "@storybook/react", - "allowedCategories": [ "production" ] - }, - { - "name": "@storybook/react-vite", - "allowedCategories": [ "production" ] - }, - { - "name": "@storybook/react-webpack5", - "allowedCategories": [ "production" ] - }, - { - "name": "@tanstack/react-virtual", - "allowedCategories": [ "production" ] - }, - { - "name": "@testing-library/dom", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@testing-library/react", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@testing-library/user-event", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/babel__core", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/blessed", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/columnify", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/cross-spawn", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/debounce-promise", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/fast-levenshtein", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/fs-extra", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/geojson", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/history", - "allowedCategories": [ "examples" ] - }, - { - "name": "@types/hoist-non-react-statics", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/inquirer", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/isomorphic-fetch", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@types/js-yaml", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/json5", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/kefir", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/lodash-es", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@types/mapbox-gl", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/maplibre-gl", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/mdast", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/node", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@types/node-fetch", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/pdf-parse", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/qs", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/raf", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@types/react", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@types/react-datepicker", - "allowedCategories": [ "examples" ] - }, - { - "name": "@types/react-dom", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@types/react-google-recaptcha", - "allowedCategories": [ "examples" ] - }, - { - "name": "@types/react-helmet", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@types/react-lines-ellipsis", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/react-measure", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@types/react-native-listener", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/react-portal", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/react-redux", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/react-router-dom", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@types/react-syntax-highlighter", - "allowedCategories": [ "examples" ] - }, - { - "name": "@types/react-textarea-autosize", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/react-transition-group", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/rimraf", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/semver", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/spark-md5", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/stringify-object", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/tar", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/tinycolor2", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/tough-cookie", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/unist", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/uuid", - "allowedCategories": [ "production" ] - }, - { - "name": "@types/validate-npm-package-name", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/watchpack", - "allowedCategories": [ "tools" ] - }, - { - "name": "@types/webpack-env", - "allowedCategories": [ "examples" ] - }, - { - "name": "@typescript-eslint/eslint-plugin", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@typescript-eslint/parser", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@typescript/native-preview", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "@vitejs/plugin-react", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "@vitejs/plugin-react-swc", - "allowedCategories": [ "examples" ] - }, - { - "name": "@vitest/eslint-plugin", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "@welldone-software/why-did-you-render", - "allowedCategories": [ "examples" ] - }, - { - "name": "ag-grid-community", - "allowedCategories": [ "production" ] - }, - { - "name": "ag-grid-enterprise", - "allowedCategories": [ "production" ] - }, - { - "name": "ag-grid-react", - "allowedCategories": [ "production" ] - }, - { - "name": "async", - "allowedCategories": [ "production" ] - }, - { - "name": "axios", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "axios-cache-interceptor", - "allowedCategories": [ "production" ] - }, - { - "name": "babel-loader", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "babel-plugin-lodash", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "babel-plugin-require-context-hook", - "allowedCategories": [ "production" ] - }, - { - "name": "blessed", - "allowedCategories": [ "tools" ] - }, - { - "name": "blob-polyfill", - "allowedCategories": [ "production" ] - }, - { - "name": "case-sensitive-paths-webpack-plugin", - "allowedCategories": [ "examples", "tools" ] - }, - { - "name": "chalk", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "chokidar", - "allowedCategories": [ "tools" ] - }, - { - "name": "circular-dependency-plugin", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "classnames", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "clean-webpack-plugin", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "codemirror", - "allowedCategories": [ "production" ] - }, - { - "name": "columnify", - "allowedCategories": [ "tools" ] - }, - { - "name": "commander", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "compression-webpack-plugin", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "concurrently", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "copy-to-clipboard", - "allowedCategories": [ "production" ] - }, - { - "name": "copy-webpack-plugin", - "allowedCategories": [ "production" ] - }, - { - "name": "core-js", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "cron-parser", - "allowedCategories": [ "production" ] - }, - { - "name": "cross-spawn", - "allowedCategories": [ "tools" ] - }, - { - "name": "css-loader", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "date-fns", - "allowedCategories": [ "production" ] - }, - { - "name": "date-fns-tz", - "allowedCategories": [ "production" ] - }, - { - "name": "debounce-promise", - "allowedCategories": [ "production" ] - }, - { - "name": "default-import", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "dependency-cruiser", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "dotenv", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "dotenv-webpack", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "downshift", - "allowedCategories": [ "production" ] - }, - { - "name": "esbuild-loader", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-import-resolver-typescript", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-chai-friendly", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "eslint-plugin-header", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-headers", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-import", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-import-esm", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-import-x", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-jsdoc", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-no-barrel-files", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-no-only-tests", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-playwright", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "eslint-plugin-react", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-react-hooks", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-regexp", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-sonarjs", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eslint-plugin-storybook", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "eslint-plugin-tsdoc", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "eventsource-parser", - "allowedCategories": [ "production" ] - }, - { - "name": "exponential-backoff", - "allowedCategories": [ "production" ] - }, - { - "name": "fast-equals", - "allowedCategories": [ "production" ] - }, - { - "name": "fast-glob", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "fast-levenshtein", - "allowedCategories": [ "production" ] - }, - { - "name": "fetch-cookie", - "allowedCategories": [ "production" ] - }, - { - "name": "fetch-mock", - "allowedCategories": [ "production" ] - }, - { - "name": "find-up", - "allowedCategories": [ "tools" ] - }, - { - "name": "fix-esm-import-path", - "allowedCategories": [ "production" ] - }, - { - "name": "fixed-data-table-2", - "allowedCategories": [ "production" ] - }, - { - "name": "fork-ts-checker-webpack-plugin", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "fs-extra", - "allowedCategories": [ "tools" ] - }, - { - "name": "full-icu", - "allowedCategories": [ "production" ] - }, - { - "name": "glob", - "allowedCategories": [ "production" ] - }, - { - "name": "globals", - "allowedCategories": [ "tools" ] - }, - { - "name": "happy-dom", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "highcharts", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "highcharts-react-official", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "history", - "allowedCategories": [ "examples" ] - }, - { - "name": "hoist-non-react-statics", - "allowedCategories": [ "production" ] - }, - { - "name": "html-validate", - "allowedCategories": [ "tools" ] - }, - { - "name": "html-webpack-plugin", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "http-status-codes", - "allowedCategories": [ "production" ] - }, - { - "name": "immer", - "allowedCategories": [ "production" ] - }, - { - "name": "inquirer", - "allowedCategories": [ "tools" ] - }, - { - "name": "isomorphic-fetch", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "jiti", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "js-object-pretty-print", - "allowedCategories": [ "production" ] - }, - { - "name": "js-yaml", - "allowedCategories": [ "production" ] - }, - { - "name": "jsdom", - "allowedCategories": [ "production" ] - }, - { - "name": "json-loader", - "allowedCategories": [ "production" ] - }, - { - "name": "json-schema-to-typescript", - "allowedCategories": [ "production" ] - }, - { - "name": "json-stable-stringify", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "json5", - "allowedCategories": [ "tools" ] - }, - { - "name": "jsonschema", - "allowedCategories": [ "tools" ] - }, - { - "name": "kefir", - "allowedCategories": [ "production" ] - }, - { - "name": "lodash-es", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "lru-cache", - "allowedCategories": [ "production" ] - }, - { - "name": "lz-string", - "allowedCategories": [ "production" ] - }, - { - "name": "mapbox-gl", - "allowedCategories": [ "production" ] - }, - { - "name": "maplibre-gl", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "mdast", - "allowedCategories": [ "production" ] - }, - { - "name": "mini-css-extract-plugin", - "allowedCategories": [ "production" ] - }, - { - "name": "mkdirp", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "mocha", - "allowedCategories": [ "production" ] - }, - { - "name": "mocha-junit-reporter", - "allowedCategories": [ "production" ] - }, - { - "name": "moment", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "moment-timezone", - "allowedCategories": [ "production" ] - }, - { - "name": "node-fetch", - "allowedCategories": [ "production" ] - }, - { - "name": "node-xlsx", - "allowedCategories": [ "production" ] - }, - { - "name": "npm-run-all", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "open", - "allowedCategories": [ "tools" ] - }, - { - "name": "ora", - "allowedCategories": [ "tools" ] - }, - { - "name": "oxfmt", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "oxlint", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "oxlint-tsgolint", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "p-map", - "allowedCategories": [ "tools" ] - }, - { - "name": "pdf-parse", - "allowedCategories": [ "production" ] - }, - { - "name": "polished", - "allowedCategories": [ "production" ] - }, - { - "name": "postcss", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "postcss-scss", - "allowedCategories": [ "tools" ] - }, - { - "name": "postcss-value-parser", - "allowedCategories": [ "production" ] - }, - { - "name": "prettier", - "allowedCategories": [ "production" ] - }, - { - "name": "process", - "allowedCategories": [ "examples", "tools" ] - }, - { - "name": "qs", - "allowedCategories": [ "production" ] - }, - { - "name": "raf", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "react", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "react-content-loader", - "allowedCategories": [ "production" ] - }, - { - "name": "react-datepicker", - "allowedCategories": [ "examples" ] - }, - { - "name": "react-day-picker", - "allowedCategories": [ "production" ] - }, - { - "name": "react-dnd", - "allowedCategories": [ "production" ] - }, - { - "name": "react-dnd-html5-backend", - "allowedCategories": [ "production" ] - }, - { - "name": "react-dom", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "react-fast-compare", - "allowedCategories": [ "production" ] - }, - { - "name": "react-ga", - "allowedCategories": [ "examples" ] - }, - { - "name": "react-google-recaptcha", - "allowedCategories": [ "examples" ] - }, - { - "name": "react-grid-system", - "allowedCategories": [ "production" ] - }, - { - "name": "react-helmet", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "react-intl", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "react-lines-ellipsis", - "allowedCategories": [ "production" ] - }, - { - "name": "react-loading-skeleton", - "allowedCategories": [ "production" ] - }, - { - "name": "react-markdown", - "allowedCategories": [ "production" ] - }, - { - "name": "react-measure", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "react-native-listener", - "allowedCategories": [ "production" ] - }, - { - "name": "react-portal", - "allowedCategories": [ "production" ] - }, - { - "name": "react-redux", - "allowedCategories": [ "production" ] - }, - { - "name": "react-responsive", - "allowedCategories": [ "production" ] - }, - { - "name": "react-router-dom", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "react-select", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "react-select-async-paginate", - "allowedCategories": [ "production" ] - }, - { - "name": "react-syntax-highlighter", - "allowedCategories": [ "examples" ] - }, - { - "name": "react-textarea-autosize", - "allowedCategories": [ "production" ] - }, - { - "name": "react-transition-group", - "allowedCategories": [ "production" ] - }, - { - "name": "react-window", - "allowedCategories": [ "production" ] - }, - { - "name": "readdirp", - "allowedCategories": [ "production" ] - }, - { - "name": "recharts", - "allowedCategories": [ "examples" ] - }, - { - "name": "redux", - "allowedCategories": [ "production" ] - }, - { - "name": "redux-batched-actions", - "allowedCategories": [ "production" ] - }, - { - "name": "redux-saga", - "allowedCategories": [ "production" ] - }, - { - "name": "remark", - "allowedCategories": [ "production" ] - }, - { - "name": "remark-emoji", - "allowedCategories": [ "production" ] - }, - { - "name": "remark-gfm", - "allowedCategories": [ "production" ] - }, - { - "name": "require-from-string", - "allowedCategories": [ "production" ] - }, - { - "name": "reselect", - "allowedCategories": [ "production" ] - }, - { - "name": "rolldown", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "rollup", - "allowedCategories": [ "production" ] - }, - { - "name": "sass", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "sass-loader", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "semver", - "allowedCategories": [ "production" ] - }, - { - "name": "source-map-loader", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "spark-md5", - "allowedCategories": [ "production" ] - }, - { - "name": "speed-measure-webpack-plugin", - "allowedCategories": [ "examples" ] - }, - { - "name": "storybook", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "stringify-object", - "allowedCategories": [ "production" ] - }, - { - "name": "strip-ansi", - "allowedCategories": [ "tools" ] - }, - { - "name": "style-loader", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "styled-jsx", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "stylelint", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "stylelint-config-standard", - "allowedCategories": [ "tools" ] - }, - { - "name": "stylelint-order", - "allowedCategories": [ "tools" ] - }, - { - "name": "stylelint-plugin-defensive-css", - "allowedCategories": [ "tools" ] - }, - { - "name": "stylelint-scss", - "allowedCategories": [ "tools" ] - }, - { - "name": "svgo", - "allowedCategories": [ "production" ] - }, - { - "name": "tar", - "allowedCategories": [ "tools" ] - }, - { - "name": "tinycolor2", - "allowedCategories": [ "production" ] - }, - { - "name": "ts-invariant", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "ts-loader", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "ts-morph", - "allowedCategories": [ "tools" ] - }, - { - "name": "tsd", - "allowedCategories": [ "production" ] - }, - { - "name": "tslib", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "typescript", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "unified", - "allowedCategories": [ "production" ] - }, - { - "name": "util", - "allowedCategories": [ "examples", "tools" ] - }, - { - "name": "uuid", - "allowedCategories": [ "production" ] - }, - { - "name": "validate-npm-package-name", - "allowedCategories": [ "examples", "tools" ] - }, - { - "name": "vite", - "allowedCategories": [ "examples", "production" ] - }, - { - "name": "vite-node", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "vite-plugin-css-injected-by-js", - "allowedCategories": [ "production" ] - }, - { - "name": "vite-plugin-environment", - "allowedCategories": [ "production" ] - }, - { - "name": "vite-plugin-html", - "allowedCategories": [ "examples" ] - }, - { - "name": "vite-plugin-mkcert", - "allowedCategories": [ "examples" ] - }, - { - "name": "vite-plugin-static-copy", - "allowedCategories": [ "production" ] - }, - { - "name": "vitest", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "vitest-dom", - "allowedCategories": [ "production" ] - }, - { - "name": "wait-on", - "allowedCategories": [ "production" ] - }, - { - "name": "watchpack", - "allowedCategories": [ "tools" ] - }, - { - "name": "webpack", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "webpack-bundle-analyzer", - "allowedCategories": [ "production", "tools" ] - }, - { - "name": "webpack-cli", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "webpack-dev-server", - "allowedCategories": [ "examples", "production", "tools" ] - }, - { - "name": "xml2js", - "allowedCategories": [ "production" ] - }, - { - "name": "yaml", - "allowedCategories": [ "production" ] - }, - { - "name": "zod", - "allowedCategories": [ "production" ] - } - ] -} +// DO NOT ADD COMMENTS IN THIS FILE. They will be lost when the Rush tool resaves it. +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/approved-packages.schema.json", + "packages": [ + { + "name": "@aaronhayes/react-use-hubspot-form", + "allowedCategories": ["production"] + }, + { + "name": "@babel/cli", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@babel/core", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@babel/plugin-proposal-export-default-from", + "allowedCategories": ["production"] + }, + { + "name": "@babel/plugin-transform-async-to-generator", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@babel/plugin-transform-class-properties", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@babel/plugin-transform-object-rest-spread", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@babel/plugin-transform-typescript", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@babel/preset-env", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@babel/preset-react", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@babel/preset-typescript", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@babel/runtime", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@braintree/sanitize-url", + "allowedCategories": ["production"] + }, + { + "name": "@codemirror/autocomplete", + "allowedCategories": ["production"] + }, + { + "name": "@codemirror/commands", + "allowedCategories": ["production"] + }, + { + "name": "@codemirror/lang-yaml", + "allowedCategories": ["production"] + }, + { + "name": "@codemirror/language", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@codemirror/lint", + "allowedCategories": ["production"] + }, + { + "name": "@codemirror/state", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@codemirror/view", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@componentdriven/csf", + "allowedCategories": ["production"] + }, + { + "name": "@floating-ui/dom", + "allowedCategories": ["production"] + }, + { + "name": "@floating-ui/react", + "allowedCategories": ["production"] + }, + { + "name": "@floating-ui/react-dom", + "allowedCategories": ["production"] + }, + { + "name": "@formatjs/cli-lib", + "allowedCategories": ["tools"] + }, + { + "name": "@formatjs/icu-messageformat-parser", + "allowedCategories": ["tools"] + }, + { + "name": "@gooddata/api-client-tiger", + "allowedCategories": ["production", "tools"] + }, + { + "name": "@gooddata/catalog-export", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/eslint-config", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/fixtures", + "allowedCategories": ["production", "tools"] + }, + { + "name": "@gooddata/i18n-toolkit", + "allowedCategories": ["production"] + }, + { + "name": "@gooddata/mock-handling", + "allowedCategories": ["production", "tools"] + }, + { + "name": "@gooddata/number-formatter", + "allowedCategories": ["production"] + }, + { + "name": "@gooddata/plugin-toolkit", + "allowedCategories": ["tools"] + }, + { + "name": "@gooddata/reference-workspace", + "allowedCategories": ["production"] + }, + { + "name": "@gooddata/sdk-backend-base", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-backend-mockingbird", + "allowedCategories": ["production"] + }, + { + "name": "@gooddata/sdk-backend-spi", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-backend-tiger", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-embedding", + "allowedCategories": ["production"] + }, + { + "name": "@gooddata/sdk-model", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui-dashboard", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui-ext", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui-filters", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui-gen-ai", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui-geo", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui-charts", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui-kit", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui-loaders", + "allowedCategories": ["examples", "tools"] + }, + { + "name": "@gooddata/sdk-ui-pivot", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@gooddata/sdk-ui-semantic-search", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@gooddata/sdk-ui-theme-provider", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@gooddata/sdk-ui-vis-commons", + "allowedCategories": ["production"] + }, + { + "name": "@gooddata/sdk-ui-web-components", + "allowedCategories": ["production"] + }, + { + "name": "@gooddata/stylelint-config", + "allowedCategories": ["production"] + }, + { + "name": "@gooddata/util", + "allowedCategories": ["production"] + }, + { + "name": "@lezer/highlight", + "allowedCategories": ["production"] + }, + { + "name": "@microsoft/api-documenter", + "allowedCategories": ["production", "tools"] + }, + { + "name": "@microsoft/api-extractor", + "allowedCategories": ["production", "tools"] + }, + { + "name": "@openapitools/openapi-generator-cli", + "allowedCategories": ["production"] + }, + { + "name": "@react-aria/interactions", + "allowedCategories": ["production"] + }, + { + "name": "@reduxjs/toolkit", + "allowedCategories": ["production"] + }, + { + "name": "@storybook/builder-vite", + "allowedCategories": ["production"] + }, + { + "name": "@storybook/builder-webpack5", + "allowedCategories": ["production"] + }, + { + "name": "@storybook/cli", + "allowedCategories": ["production"] + }, + { + "name": "@storybook/manager-webpack5", + "allowedCategories": ["production"] + }, + { + "name": "@storybook/preset-scss", + "allowedCategories": ["production"] + }, + { + "name": "@storybook/react", + "allowedCategories": ["production"] + }, + { + "name": "@storybook/react-vite", + "allowedCategories": ["production"] + }, + { + "name": "@storybook/react-webpack5", + "allowedCategories": ["production"] + }, + { + "name": "@tanstack/react-virtual", + "allowedCategories": ["production"] + }, + { + "name": "@testing-library/dom", + "allowedCategories": ["production", "tools"] + }, + { + "name": "@testing-library/react", + "allowedCategories": ["production", "tools"] + }, + { + "name": "@testing-library/user-event", + "allowedCategories": ["production"] + }, + { + "name": "@types/babel__core", + "allowedCategories": ["tools"] + }, + { + "name": "@types/blessed", + "allowedCategories": ["tools"] + }, + { + "name": "@types/columnify", + "allowedCategories": ["tools"] + }, + { + "name": "@types/cross-spawn", + "allowedCategories": ["tools"] + }, + { + "name": "@types/debounce-promise", + "allowedCategories": ["production"] + }, + { + "name": "@types/fast-levenshtein", + "allowedCategories": ["production"] + }, + { + "name": "@types/fs-extra", + "allowedCategories": ["tools"] + }, + { + "name": "@types/history", + "allowedCategories": ["examples"] + }, + { + "name": "@types/hoist-non-react-statics", + "allowedCategories": ["production"] + }, + { + "name": "@types/inquirer", + "allowedCategories": ["tools"] + }, + { + "name": "@types/isomorphic-fetch", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@types/js-yaml", + "allowedCategories": ["production"] + }, + { + "name": "@types/json5", + "allowedCategories": ["tools"] + }, + { + "name": "@types/kefir", + "allowedCategories": ["production"] + }, + { + "name": "@types/mapbox-gl", + "allowedCategories": ["production"] + }, + { + "name": "@types/mdast", + "allowedCategories": ["production"] + }, + { + "name": "@types/node", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@types/node-fetch", + "allowedCategories": ["production"] + }, + { + "name": "@types/pdf-parse", + "allowedCategories": ["production"] + }, + { + "name": "@types/qs", + "allowedCategories": ["production"] + }, + { + "name": "@types/raf", + "allowedCategories": ["production", "tools"] + }, + { + "name": "@types/react", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@types/react-datepicker", + "allowedCategories": ["examples"] + }, + { + "name": "@types/react-dom", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@types/react-google-recaptcha", + "allowedCategories": ["examples"] + }, + { + "name": "@types/react-helmet", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@types/react-lines-ellipsis", + "allowedCategories": ["production"] + }, + { + "name": "@types/react-measure", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@types/react-native-listener", + "allowedCategories": ["production"] + }, + { + "name": "@types/react-portal", + "allowedCategories": ["production"] + }, + { + "name": "@types/react-redux", + "allowedCategories": ["production"] + }, + { + "name": "@types/react-router-dom", + "allowedCategories": ["examples", "production"] + }, + { + "name": "@types/react-syntax-highlighter", + "allowedCategories": ["examples"] + }, + { + "name": "@types/react-textarea-autosize", + "allowedCategories": ["production"] + }, + { + "name": "@types/react-transition-group", + "allowedCategories": ["production"] + }, + { + "name": "@types/rimraf", + "allowedCategories": ["tools"] + }, + { + "name": "@types/semver", + "allowedCategories": ["production"] + }, + { + "name": "@types/spark-md5", + "allowedCategories": ["production"] + }, + { + "name": "@types/stringify-object", + "allowedCategories": ["production"] + }, + { + "name": "@types/tar", + "allowedCategories": ["tools"] + }, + { + "name": "@types/tinycolor2", + "allowedCategories": ["production"] + }, + { + "name": "@types/tough-cookie", + "allowedCategories": ["production"] + }, + { + "name": "@types/unist", + "allowedCategories": ["production"] + }, + { + "name": "@types/uuid", + "allowedCategories": ["production"] + }, + { + "name": "@types/validate-npm-package-name", + "allowedCategories": ["tools"] + }, + { + "name": "@types/watchpack", + "allowedCategories": ["tools"] + }, + { + "name": "@types/webpack-env", + "allowedCategories": ["examples"] + }, + { + "name": "@typescript-eslint/eslint-plugin", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@typescript-eslint/parser", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "@vitejs/plugin-react", + "allowedCategories": ["examples"] + }, + { + "name": "@vitejs/plugin-react-swc", + "allowedCategories": ["examples"] + }, + { + "name": "@welldone-software/why-did-you-render", + "allowedCategories": ["examples"] + }, + { + "name": "ag-grid-community", + "allowedCategories": ["production"] + }, + { + "name": "ag-grid-enterprise", + "allowedCategories": ["production"] + }, + { + "name": "ag-grid-react", + "allowedCategories": ["production"] + }, + { + "name": "async", + "allowedCategories": ["production"] + }, + { + "name": "axios", + "allowedCategories": ["production", "tools"] + }, + { + "name": "axios-cache-interceptor", + "allowedCategories": ["production"] + }, + { + "name": "babel-loader", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "babel-plugin-lodash", + "allowedCategories": ["examples", "production"] + }, + { + "name": "babel-plugin-require-context-hook", + "allowedCategories": ["production"] + }, + { + "name": "blessed", + "allowedCategories": ["tools"] + }, + { + "name": "blob-polyfill", + "allowedCategories": ["production"] + }, + { + "name": "case-sensitive-paths-webpack-plugin", + "allowedCategories": ["examples", "tools"] + }, + { + "name": "circular-dependency-plugin", + "allowedCategories": ["examples", "production"] + }, + { + "name": "classnames", + "allowedCategories": ["examples", "production"] + }, + { + "name": "clean-webpack-plugin", + "allowedCategories": ["examples", "production"] + }, + { + "name": "codemirror", + "allowedCategories": ["production"] + }, + { + "name": "columnify", + "allowedCategories": ["tools"] + }, + { + "name": "commander", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "compression-webpack-plugin", + "allowedCategories": ["examples", "production"] + }, + { + "name": "concurrently", + "allowedCategories": ["production", "tools"] + }, + { + "name": "copy-to-clipboard", + "allowedCategories": ["production"] + }, + { + "name": "copy-webpack-plugin", + "allowedCategories": ["production"] + }, + { + "name": "core-js", + "allowedCategories": ["examples", "production"] + }, + { + "name": "cron-parser", + "allowedCategories": ["production"] + }, + { + "name": "cross-spawn", + "allowedCategories": ["tools"] + }, + { + "name": "css-loader", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "date-fns", + "allowedCategories": ["production"] + }, + { + "name": "date-fns-tz", + "allowedCategories": ["production"] + }, + { + "name": "debounce-promise", + "allowedCategories": ["production"] + }, + { + "name": "default-import", + "allowedCategories": ["examples", "production"] + }, + { + "name": "dependency-cruiser", + "allowedCategories": ["production", "tools"] + }, + { + "name": "dotenv", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "dotenv-webpack", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "downshift", + "allowedCategories": ["production"] + }, + { + "name": "@gooddata/emailjs-mime-codec-new", + "allowedCategories": ["production"] + }, + { + "name": "esbuild-loader", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint-import-resolver-typescript", + "allowedCategories": ["examples", "production"] + }, + { + "name": "eslint-plugin-header", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint-plugin-import", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint-plugin-import-esm", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint-plugin-no-only-tests", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint-plugin-react", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint-plugin-react-hooks", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint-plugin-regexp", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint-plugin-sonarjs", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eslint-plugin-tsdoc", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "eventsource-parser", + "allowedCategories": ["production"] + }, + { + "name": "exponential-backoff", + "allowedCategories": ["production"] + }, + { + "name": "fast-glob", + "allowedCategories": ["production", "tools"] + }, + { + "name": "fast-levenshtein", + "allowedCategories": ["production"] + }, + { + "name": "fetch-cookie", + "allowedCategories": ["production"] + }, + { + "name": "fetch-mock", + "allowedCategories": ["production"] + }, + { + "name": "find-up", + "allowedCategories": ["tools"] + }, + { + "name": "fix-esm-import-path", + "allowedCategories": ["production"] + }, + { + "name": "fixed-data-table-2", + "allowedCategories": ["production"] + }, + { + "name": "fork-ts-checker-webpack-plugin", + "allowedCategories": ["examples", "production"] + }, + { + "name": "fs-extra", + "allowedCategories": ["tools"] + }, + { + "name": "full-icu", + "allowedCategories": ["production"] + }, + { + "name": "glob", + "allowedCategories": ["production"] + }, + { + "name": "happy-dom", + "allowedCategories": ["production", "tools"] + }, + { + "name": "highcharts", + "allowedCategories": ["examples", "production"] + }, + { + "name": "highcharts-react-official", + "allowedCategories": ["examples", "production"] + }, + { + "name": "history", + "allowedCategories": ["examples"] + }, + { + "name": "hoist-non-react-statics", + "allowedCategories": ["production"] + }, + { + "name": "html-validate", + "allowedCategories": ["tools"] + }, + { + "name": "html-webpack-plugin", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "http-status-codes", + "allowedCategories": ["production"] + }, + { + "name": "chalk", + "allowedCategories": ["production", "tools"] + }, + { + "name": "chokidar", + "allowedCategories": ["tools"] + }, + { + "name": "immer", + "allowedCategories": ["production"] + }, + { + "name": "inquirer", + "allowedCategories": ["tools"] + }, + { + "name": "isomorphic-fetch", + "allowedCategories": ["examples", "production"] + }, + { + "name": "js-object-pretty-print", + "allowedCategories": ["production"] + }, + { + "name": "js-yaml", + "allowedCategories": ["production"] + }, + { + "name": "jsdom", + "allowedCategories": ["production"] + }, + { + "name": "json-loader", + "allowedCategories": ["production"] + }, + { + "name": "json-stable-stringify", + "allowedCategories": ["production", "tools"] + }, + { + "name": "json5", + "allowedCategories": ["tools"] + }, + { + "name": "jsonschema", + "allowedCategories": ["tools"] + }, + { + "name": "kefir", + "allowedCategories": ["production"] + }, + { + "name": "lru-cache", + "allowedCategories": ["production"] + }, + { + "name": "lz-string", + "allowedCategories": ["production"] + }, + { + "name": "mapbox-gl", + "allowedCategories": ["production"] + }, + { + "name": "mdast", + "allowedCategories": ["production"] + }, + { + "name": "mini-css-extract-plugin", + "allowedCategories": ["production"] + }, + { + "name": "mkdirp", + "allowedCategories": ["production", "tools"] + }, + { + "name": "mocha", + "allowedCategories": ["production"] + }, + { + "name": "mocha-junit-reporter", + "allowedCategories": ["production"] + }, + { + "name": "moment", + "allowedCategories": ["examples", "production"] + }, + { + "name": "node-fetch", + "allowedCategories": ["production"] + }, + { + "name": "node-xlsx", + "allowedCategories": ["production"] + }, + { + "name": "npm-run-all", + "allowedCategories": ["examples", "production"] + }, + { + "name": "open", + "allowedCategories": ["tools"] + }, + { + "name": "ora", + "allowedCategories": ["tools"] + }, + { + "name": "p-map", + "allowedCategories": ["tools"] + }, + { + "name": "pdf-parse", + "allowedCategories": ["production"] + }, + { + "name": "polished", + "allowedCategories": ["production"] + }, + { + "name": "postcss", + "allowedCategories": ["production"] + }, + { + "name": "postcss-value-parser", + "allowedCategories": ["production"] + }, + { + "name": "process", + "allowedCategories": ["examples", "tools"] + }, + { + "name": "qs", + "allowedCategories": ["production"] + }, + { + "name": "raf", + "allowedCategories": ["production", "tools"] + }, + { + "name": "react", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "react-content-loader", + "allowedCategories": ["production"] + }, + { + "name": "react-datepicker", + "allowedCategories": ["examples"] + }, + { + "name": "react-day-picker", + "allowedCategories": ["production"] + }, + { + "name": "react-dnd", + "allowedCategories": ["production"] + }, + { + "name": "react-dnd-html5-backend", + "allowedCategories": ["production"] + }, + { + "name": "react-dom", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "react-fast-compare", + "allowedCategories": ["production"] + }, + { + "name": "react-ga", + "allowedCategories": ["examples"] + }, + { + "name": "react-google-recaptcha", + "allowedCategories": ["examples"] + }, + { + "name": "react-grid-system", + "allowedCategories": ["production"] + }, + { + "name": "react-helmet", + "allowedCategories": ["examples", "production"] + }, + { + "name": "react-intl", + "allowedCategories": ["production", "tools"] + }, + { + "name": "react-lines-ellipsis", + "allowedCategories": ["production"] + }, + { + "name": "react-loading-skeleton", + "allowedCategories": ["production"] + }, + { + "name": "react-markdown", + "allowedCategories": ["production"] + }, + { + "name": "react-measure", + "allowedCategories": ["examples", "production"] + }, + { + "name": "react-native-listener", + "allowedCategories": ["production"] + }, + { + "name": "react-portal", + "allowedCategories": ["production"] + }, + { + "name": "react-redux", + "allowedCategories": ["production"] + }, + { + "name": "react-responsive", + "allowedCategories": ["production"] + }, + { + "name": "react-router-dom", + "allowedCategories": ["examples", "production"] + }, + { + "name": "react-select", + "allowedCategories": ["examples", "production"] + }, + { + "name": "react-select-async-paginate", + "allowedCategories": ["production"] + }, + { + "name": "react-syntax-highlighter", + "allowedCategories": ["examples"] + }, + { + "name": "react-textarea-autosize", + "allowedCategories": ["production"] + }, + { + "name": "react-transition-group", + "allowedCategories": ["production"] + }, + { + "name": "react-window", + "allowedCategories": ["production"] + }, + { + "name": "redux-batched-actions", + "allowedCategories": ["production"] + }, + { + "name": "redux-saga", + "allowedCategories": ["production"] + }, + { + "name": "recharts", + "allowedCategories": ["examples"] + }, + { + "name": "remark", + "allowedCategories": ["production"] + }, + { + "name": "remark-emoji", + "allowedCategories": ["production"] + }, + { + "name": "require-from-string", + "allowedCategories": ["production"] + }, + { + "name": "reselect", + "allowedCategories": ["production"] + }, + { + "name": "sass", + "allowedCategories": ["examples", "production"] + }, + { + "name": "sass-loader", + "allowedCategories": ["examples", "production"] + }, + { + "name": "semver", + "allowedCategories": ["production"] + }, + { + "name": "source-map-loader", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "spark-md5", + "allowedCategories": ["production"] + }, + { + "name": "speed-measure-webpack-plugin", + "allowedCategories": ["examples"] + }, + { + "name": "storybook", + "allowedCategories": ["production"] + }, + { + "name": "stringify-object", + "allowedCategories": ["production"] + }, + { + "name": "strip-ansi", + "allowedCategories": ["tools"] + }, + { + "name": "style-loader", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "styled-jsx", + "allowedCategories": ["examples", "production"] + }, + { + "name": "stylelint", + "allowedCategories": ["production"] + }, + { + "name": "svgo", + "allowedCategories": ["production"] + }, + { + "name": "tar", + "allowedCategories": ["tools"] + }, + { + "name": "tinycolor2", + "allowedCategories": ["production"] + }, + { + "name": "ts-invariant", + "allowedCategories": ["examples", "production"] + }, + { + "name": "ts-loader", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "ts-morph", + "allowedCategories": ["tools"] + }, + { + "name": "tsd", + "allowedCategories": ["production"] + }, + { + "name": "tslib", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "typescript", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "unified", + "allowedCategories": ["production"] + }, + { + "name": "util", + "allowedCategories": ["examples", "tools"] + }, + { + "name": "uuid", + "allowedCategories": ["production"] + }, + { + "name": "validate-npm-package-name", + "allowedCategories": ["examples", "tools"] + }, + { + "name": "vite", + "allowedCategories": ["examples", "production"] + }, + { + "name": "vite-plugin-html", + "allowedCategories": ["examples"] + }, + { + "name": "vite-plugin-mkcert", + "allowedCategories": ["examples"] + }, + { + "name": "vite-plugin-static-copy", + "allowedCategories": ["production"] + }, + { + "name": "vitest", + "allowedCategories": ["production", "tools"] + }, + { + "name": "vitest-dom", + "allowedCategories": ["production"] + }, + { + "name": "wait-on", + "allowedCategories": ["production"] + }, + { + "name": "watchpack", + "allowedCategories": ["tools"] + }, + { + "name": "webpack", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "webpack-bundle-analyzer", + "allowedCategories": ["production", "tools"] + }, + { + "name": "webpack-cli", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "webpack-dev-server", + "allowedCategories": ["examples", "production", "tools"] + }, + { + "name": "xml2js", + "allowedCategories": ["production"] + } + ] +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 6b799da641a..b4a4665422e 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -8,7 +8,7 @@ importers: .: {} - ../../examples/playground: + ../../../sdk/examples/playground: devDependencies: '@codemirror/state': specifier: 6.5.3 @@ -167,13 +167,13 @@ importers: specifier: 8.0.0 version: 8.0.0(@types/node@24.12.0)(sass@1.70.0) - ../../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:* @@ -309,7 +309,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-attributefilter: + ../../../sdk/examples/sdk-interactive-examples/examples/example-attributefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -445,7 +445,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-chartconfig: + ../../../sdk/examples/sdk-interactive-examples/examples/example-chartconfig: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -581,7 +581,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-columnchart: + ../../../sdk/examples/sdk-interactive-examples/examples/example-columnchart: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -717,7 +717,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-combochart: + ../../../sdk/examples/sdk-interactive-examples/examples/example-combochart: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -853,7 +853,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-dashboard: + ../../../sdk/examples/sdk-interactive-examples/examples/example-dashboard: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -989,7 +989,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-datefilter: + ../../../sdk/examples/sdk-interactive-examples/examples/example-datefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1125,7 +1125,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-dependentfilters: + ../../../sdk/examples/sdk-interactive-examples/examples/example-dependentfilters: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1261,7 +1261,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-execute: + ../../../sdk/examples/sdk-interactive-examples/examples/example-execute: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1406,7 +1406,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-granularity: + ../../../sdk/examples/sdk-interactive-examples/examples/example-granularity: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1542,7 +1542,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-headline: + ../../../sdk/examples/sdk-interactive-examples/examples/example-headline: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1678,7 +1678,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-pivottable: + ../../../sdk/examples/sdk-interactive-examples/examples/example-pivottable: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1814,7 +1814,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-relativedatefilter: + ../../../sdk/examples/sdk-interactive-examples/examples/example-relativedatefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1950,7 +1950,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../examples/sdk-interactive-examples/examples/example-repeater: + ../../../sdk/examples/sdk-interactive-examples/examples/example-repeater: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -2086,7 +2086,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../libs/api-client-tiger: + ../../../sdk/libs/api-client-tiger: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2189,7 +2189,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../libs/sdk-backend-base: + ../../../sdk/libs/sdk-backend-base: dependencies: '@braintree/sanitize-url': specifier: ^6.0.0 @@ -2301,7 +2301,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../libs/sdk-backend-mockingbird: + ../../../sdk/libs/sdk-backend-mockingbird: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -2401,7 +2401,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../libs/sdk-backend-spi: + ../../../sdk/libs/sdk-backend-spi: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2486,7 +2486,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../libs/sdk-backend-tiger: + ../../../sdk/libs/sdk-backend-tiger: dependencies: '@gooddata/api-client-tiger': specifier: workspace:* @@ -2628,7 +2628,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../libs/sdk-code-convertors: + ../../../sdk/libs/sdk-code-convertors: dependencies: '@gooddata/api-client-tiger': specifier: workspace:* @@ -2710,7 +2710,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0)(yaml@2.8.3) - ../../libs/sdk-code-schemas: + ../../../sdk/libs/sdk-code-schemas: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -2788,7 +2788,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../libs/sdk-e2e-utils: + ../../../sdk/libs/sdk-e2e-utils: dependencies: '@playwright/test': specifier: 1.59.1 @@ -2876,7 +2876,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../libs/sdk-embedding: + ../../../sdk/libs/sdk-embedding: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2961,7 +2961,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../libs/sdk-model: + ../../../sdk/libs/sdk-model: dependencies: '@types/geojson': specifier: ^7946.0.16 @@ -3061,11 +3061,8 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../libs/sdk-pluggable-application-model: + ../../../sdk/libs/sdk-pluggable-application-model: dependencies: - '@gooddata/sdk-backend-spi': - specifier: workspace:* - version: link:../sdk-backend-spi '@gooddata/sdk-model': specifier: workspace:* version: link:../sdk-model @@ -3146,7 +3143,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../libs/sdk-ui: + ../../../sdk/libs/sdk-ui: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -3333,7 +3330,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-all: + ../../../sdk/libs/sdk-ui-all: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -3430,7 +3427,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../libs/sdk-ui-catalog: + ../../../sdk/libs/sdk-ui-catalog: dependencies: '@babel/core': specifier: 7.28.4 @@ -3626,7 +3623,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-charts: + ../../../sdk/libs/sdk-ui-charts: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -3849,7 +3846,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-dashboard: + ../../../sdk/libs/sdk-ui-dashboard: dependencies: '@codemirror/language': specifier: 6.12.1 @@ -4117,7 +4114,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-ext: + ../../../sdk/libs/sdk-ui-ext: dependencies: '@codemirror/commands': specifier: 6.10.1 @@ -4400,7 +4397,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-filters: + ../../../sdk/libs/sdk-ui-filters: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -4602,7 +4599,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-gen-ai: + ../../../sdk/libs/sdk-ui-gen-ai: dependencies: '@codemirror/autocomplete': specifier: 6.20.0 @@ -4849,7 +4846,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-geo: + ../../../sdk/libs/sdk-ui-geo: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -5036,7 +5033,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-kit: + ../../../sdk/libs/sdk-ui-kit: dependencies: '@aaronhayes/react-use-hubspot-form': specifier: 2.1.2 @@ -5328,7 +5325,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-loaders: + ../../../sdk/libs/sdk-ui-loaders: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -5461,7 +5458,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 @@ -5651,7 +5648,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-pluggable-application: + ../../../sdk/libs/sdk-ui-pluggable-application: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -5775,7 +5772,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../libs/sdk-ui-semantic-search: + ../../../sdk/libs/sdk-ui-semantic-search: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -5935,7 +5932,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-tests-app: + ../../../sdk/libs/sdk-ui-tests-app: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6070,7 +6067,7 @@ importers: specifier: 8.0.0 version: 8.0.0(@types/node@24.12.0)(sass@1.70.0) - ../../libs/sdk-ui-tests-e2e: + ../../../sdk/libs/sdk-ui-tests-e2e: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6169,7 +6166,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:* @@ -6235,7 +6232,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:* @@ -6397,7 +6394,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../libs/sdk-ui-tests-storybook: + ../../../sdk/libs/sdk-ui-tests-storybook: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6625,7 +6622,7 @@ importers: specifier: 3.1.2 version: 3.1.2(vite@8.0.0) - ../../libs/sdk-ui-theme-provider: + ../../../sdk/libs/sdk-ui-theme-provider: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -6782,7 +6779,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../libs/sdk-ui-vis-commons: + ../../../sdk/libs/sdk-ui-vis-commons: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -6951,7 +6948,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../libs/sdk-ui-web-components: + ../../../sdk/libs/sdk-ui-web-components: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -7120,7 +7117,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../libs/util: + ../../../sdk/libs/util: dependencies: lodash-es: specifier: ^4.17.23 @@ -7202,7 +7199,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../tools/app-toolkit: + ../../../sdk/tools/app-toolkit: dependencies: '@babel/cli': specifier: ^7.23.4 @@ -7359,7 +7356,7 @@ importers: specifier: 5.93.0 version: 5.93.0(webpack-cli@6.0.1) - ../../tools/applink: + ../../../sdk/tools/applink: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -7464,7 +7461,7 @@ importers: specifier: ^2.4.4 version: 2.4.4 - ../../tools/catalog-export: + ../../../sdk/tools/catalog-export: dependencies: '@babel/core': specifier: 7.28.4 @@ -7588,7 +7585,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../tools/dashboard-plugin-template: + ../../../sdk/tools/dashboard-plugin-template: dependencies: json-stable-stringify: specifier: 1.3.0 @@ -7784,7 +7781,7 @@ importers: specifier: 5.2.2 version: 5.2.2(webpack-cli@6.0.1)(webpack@5.93.0) - ../../tools/eslint-config: + ../../../sdk/tools/eslint-config: devDependencies: '@eslint/js': specifier: 9.28.0 @@ -7877,7 +7874,7 @@ importers: specifier: ^5.2.0 version: 5.2.0(@types/node@24.12.0)(jiti@2.6.1) - ../../tools/i18n-toolkit: + ../../../sdk/tools/i18n-toolkit: dependencies: '@formatjs/cli-lib': specifier: ^6.1.1 @@ -7986,7 +7983,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../tools/lint-config: + ../../../sdk/tools/lint-config: devDependencies: '@typescript/native-preview': specifier: 7.0.0-dev.20260202.1 @@ -8001,7 +7998,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../tools/mock-handling: + ../../../sdk/tools/mock-handling: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -8110,7 +8107,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../tools/oxlint-config: + ../../../sdk/tools/oxlint-config: devDependencies: '@eslint/js': specifier: 9.28.0 @@ -8188,7 +8185,7 @@ importers: specifier: ^5.2.0 version: 5.2.0(@types/node@24.12.0)(jiti@2.6.1) - ../../tools/plugin-toolkit: + ../../../sdk/tools/plugin-toolkit: dependencies: '@babel/cli': specifier: ^7.23.4 @@ -8336,7 +8333,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../tools/react-app-template: + ../../../sdk/tools/react-app-template: dependencies: '@codemirror/state': specifier: 6.5.3 @@ -8499,7 +8496,7 @@ importers: specifier: 5.2.2 version: 5.2.2(webpack-cli@6.0.1)(webpack@5.93.0) - ../../tools/reference-workspace: + ../../../sdk/tools/reference-workspace: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -8575,7 +8572,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:* @@ -8657,7 +8654,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../tools/stylelint-config: + ../../../sdk/tools/stylelint-config: dependencies: postcss: specifier: 8.5.6 @@ -8789,7 +8786,7 @@ packages: resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.4 /@babel/helper-compilation-targets@7.28.6: resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} @@ -8813,7 +8810,7 @@ packages: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.4 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -8856,6 +8853,15 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helper-module-imports@7.27.1: + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + /@babel/helper-module-imports@7.28.6: resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} @@ -8865,6 +8871,19 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4): + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + /@babel/helper-module-transforms@7.28.6(@babel/core@7.28.4): resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} @@ -8924,7 +8943,7 @@ packages: '@babel/core': 7.28.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -8932,8 +8951,8 @@ packages: resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color @@ -8941,6 +8960,10 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.27.1: + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.28.5: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -9458,7 +9481,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.4) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -9667,10 +9690,10 @@ packages: dependencies: '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.28.6 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/types': 7.29.0 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color dev: true @@ -9977,6 +10000,20 @@ packages: '@babel/parser': 7.29.0 '@babel/types': 7.29.0 + /@babel/traverse@7.28.4: + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + /@babel/traverse@7.29.0: resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} @@ -9991,6 +10028,13 @@ packages: transitivePeerDependencies: - supports-color + /@babel/types@7.28.4: + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + /@babel/types@7.29.0: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -10117,13 +10161,13 @@ packages: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - /@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.1): + /@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0): resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} engines: {node: '>=18'} peerDependencies: postcss-selector-parser: ^7.0.0 dependencies: - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.0 /@dagrejs/dagre@1.1.8: resolution: {integrity: sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw==} @@ -11544,7 +11588,7 @@ packages: /@nestjs/axios@4.0.1(@nestjs/common@11.1.6)(axios@1.12.2)(rxjs@7.8.2): resolution: {integrity: sha512-68pFJgu+/AZbWkGu65Z3r55bTsCPlgyKaV4BSG8yUAD72q1PPuyVRgUwFv6BxdnibTUHlyxm06FmYWNC+bjN7A==} peerDependencies: - '@nestjs/common': ^10.0.0 || ^11.0.0 || 9.3.11 + '@nestjs/common': ^10.0.0 || ^11.0.0 axios: ^1.3.1 rxjs: ^7.0.0 dependencies: @@ -11582,7 +11626,7 @@ packages: engines: {node: '>= 20'} requiresBuild: true peerDependencies: - '@nestjs/common': ^11.0.0 || 9.3.11 + '@nestjs/common': ^11.0.0 '@nestjs/microservices': ^11.0.0 '@nestjs/platform-express': ^11.0.0 '@nestjs/websockets': ^11.0.0 @@ -12099,7 +12143,7 @@ packages: react-redux: optional: true dependencies: - '@standard-schema/spec': 1.1.0 + '@standard-schema/spec': 1.0.0 '@standard-schema/utils': 0.3.0 immer: 10.1.1 react: 19.1.1 @@ -12256,7 +12300,7 @@ packages: dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.3 dev: true /@rollup/rollup-android-arm-eabi@4.54.0: @@ -12568,6 +12612,10 @@ packages: engines: {node: '>=10'} dev: false + /@standard-schema/spec@1.0.0: + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + dev: false + /@standard-schema/spec@1.1.0: resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -12609,7 +12657,7 @@ packages: dependencies: '@storybook/codemod': 10.1.11(@testing-library/dom@10.4.1)(react-dom@19.1.1)(react@19.1.1) '@types/semver': 7.3.13 - commander: 14.0.3 + commander: 14.0.2 create-storybook: 10.1.11(@testing-library/dom@10.4.1)(react-dom@19.1.1)(react@19.1.1) jscodeshift: 0.15.2 storybook: 10.1.11(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.1.1)(react@19.1.1) @@ -13378,6 +13426,20 @@ packages: - supports-color dev: true + /@typescript-eslint/project-service@8.52.0(typescript@5.9.3): + resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/project-service@8.58.0(typescript@5.9.3): resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13392,6 +13454,14 @@ packages: - supports-color dev: true + /@typescript-eslint/scope-manager@8.52.0: + resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/visitor-keys': 8.52.0 + dev: true + /@typescript-eslint/scope-manager@8.58.0: resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13400,6 +13470,15 @@ packages: '@typescript-eslint/visitor-keys': 8.58.0 dev: true + /@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3): + resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + dependencies: + typescript: 5.9.3 + dev: true + /@typescript-eslint/tsconfig-utils@8.58.0(typescript@5.9.3): resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13427,11 +13506,41 @@ packages: - supports-color dev: true + /@typescript-eslint/types@8.52.0: + resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@typescript-eslint/types@8.53.0: + resolution: {integrity: sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + /@typescript-eslint/types@8.58.0: resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true + /@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3): + resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/visitor-keys': 8.52.0 + debug: 4.4.3 + minimatch: 10.1.2 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/typescript-estree@8.58.0(typescript@5.9.3): resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13452,6 +13561,23 @@ packages: - supports-color dev: true + /@typescript-eslint/utils@8.52.0(eslint@9.39.2)(typescript@5.9.3): + resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@8.58.0(eslint@9.39.2)(typescript@5.9.3): resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13469,6 +13595,14 @@ packages: - supports-color dev: true + /@typescript-eslint/visitor-keys@8.52.0: + resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.52.0 + eslint-visitor-keys: 4.2.1 + dev: true + /@typescript-eslint/visitor-keys@8.58.0: resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13548,7 +13682,6 @@ packages: /@ungap/structured-clone@1.3.0: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - deprecated: Potential CWE-502 - Update to 1.3.1 or higher dev: false /@unrs/resolver-binding-android-arm-eabi@1.11.1: @@ -13735,8 +13868,8 @@ packages: vitest: optional: true dependencies: - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/utils': 8.58.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 vitest: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) @@ -13951,9 +14084,6 @@ packages: peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x - peerDependenciesMeta: - webpack: - optional: true dependencies: webpack: 5.93.0(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.93.0) @@ -13964,9 +14094,6 @@ packages: peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x - peerDependenciesMeta: - webpack: - optional: true dependencies: webpack: 5.93.0(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.93.0) @@ -13979,8 +14106,6 @@ packages: webpack-cli: 6.x.x webpack-dev-server: '*' peerDependenciesMeta: - webpack: - optional: true webpack-dev-server: optional: true dependencies: @@ -14001,17 +14126,25 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-import-attributes@1.9.5(acorn@8.16.0): + /acorn-import-attributes@1.9.5(acorn@8.15.0): resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.16.0 + acorn: 8.15.0 /acorn-jsx-walk@2.0.0: resolution: {integrity: sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==} dev: true + /acorn-jsx@5.3.2(acorn@8.15.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.15.0 + dev: true + /acorn-jsx@5.3.2(acorn@8.16.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -14027,16 +14160,29 @@ packages: acorn: 8.16.0 dev: true + /acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.15.0 + /acorn-walk@8.3.5: resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} dependencies: acorn: 8.16.0 + dev: true + + /acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true /acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /ag-charts-community@13.1.0: resolution: {integrity: sha512-w+uFTjxlAoTq1+8tgUORtB/zr9jm38ibXzbbWnkBP9Dep9yahi5a1jZL7yExAX35uq3g9QtjTh0Oj/QPDBQ9Ew==} @@ -14481,9 +14627,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' - peerDependenciesMeta: - webpack: - optional: true dependencies: '@babel/core': 7.28.4 find-cache-dir: 3.3.2 @@ -14545,15 +14688,14 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /baseline-browser-mapping@2.10.27: - resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + /baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} engines: {node: '>=6.0.0'} hasBin: true /basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.1, please upgrade dev: true /batch@0.6.1: @@ -14626,7 +14768,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - baseline-browser-mapping: 2.10.27 + baseline-browser-mapping: 2.10.29 caniuse-lite: 1.0.30001787 electron-to-chromium: 1.5.334 node-releases: 2.0.37 @@ -14962,6 +15104,11 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + /commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + dev: true + /commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -15628,14 +15775,16 @@ packages: engines: {node: '>=10'} peerDependencies: webpack: ^4 || ^5 - peerDependenciesMeta: - webpack: - optional: true dependencies: dotenv-defaults: 2.0.2 webpack: 5.93.0(webpack-cli@6.0.1) dev: true + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: true + /dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -15748,12 +15897,20 @@ packages: tapable: 1.1.3 dev: true + /enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.3 + /enhanced-resolve@5.20.1: resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.3.2 + dev: true /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -15955,9 +16112,6 @@ packages: resolution: {integrity: sha512-D7HeJNdkDKKMarPQO/3dlJT6RwN2YJO7ENU6RPlpOz5YxSHnUNi2yvW41Bckvi1EVwctIaLzlb0ni5ag2GINYA==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true dependencies: esbuild: 0.25.9 get-tsconfig: 4.10.1 @@ -16301,7 +16455,7 @@ packages: eslint: '>=8' storybook: ^10.1.11 dependencies: - '@typescript-eslint/utils': 8.58.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) storybook: 10.1.11(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.1.1)(react@19.1.1) transitivePeerDependencies: @@ -16413,8 +16567,8 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 dev: true @@ -16604,7 +16758,7 @@ packages: pend: 1.2.0 dev: true - /fdir@6.5.0(picomatch@4.0.4): + /fdir@6.5.0(picomatch@4.0.3): resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -16613,7 +16767,7 @@ packages: picomatch: optional: true dependencies: - picomatch: 4.0.4 + picomatch: 4.0.3 /fetch-cookie@0.7.3: resolution: {integrity: sha512-rZPkLnI8x5V+zYAiz8QonAHsTb4BY+iFowFBI1RFn0zrO343AVp9X7/yUj/9wL6Ef/8fLls8b/vGtzUvmyAUGA==} @@ -17023,7 +17177,6 @@ packages: /glob@11.0.3: resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true dependencies: foreground-child: 3.3.1 @@ -17366,7 +17519,7 @@ packages: html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 - tapable: 2.3.2 + tapable: 2.2.3 webpack: 5.93.0(webpack-cli@6.0.1) dev: true @@ -19863,9 +20016,14 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + /picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + dev: true /pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} @@ -19997,6 +20155,13 @@ packages: postcss: 8.5.6 dev: false + /postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + /postcss-selector-parser@7.1.1: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} @@ -20576,9 +20741,6 @@ packages: resolution: {integrity: sha512-6orZWyCnIQXMGY4DUGM0oj0L7oYnwTACsfsru/J7r94RM3P9eS7SORGpr3LCeRCMoIMQcpfKZ7X4NdyFHBS8Eg==} peerDependencies: redux: '>=1.0.0' - peerDependenciesMeta: - redux: - optional: true dependencies: redux: 5.0.1 dev: false @@ -20593,9 +20755,6 @@ packages: resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} peerDependencies: redux: ^5.0.0 - peerDependenciesMeta: - redux: - optional: true dependencies: redux: 5.0.1 dev: false @@ -21330,9 +21489,6 @@ packages: engines: {node: '>= 14.15.0'} peerDependencies: webpack: ^5.72.1 - peerDependenciesMeta: - webpack: - optional: true dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 @@ -21465,7 +21621,7 @@ packages: '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 - esbuild: 0.27.2 + esbuild: 0.25.9 open: 10.2.0 prettier: 3.6.2 recast: 0.23.11 @@ -21640,9 +21796,6 @@ packages: engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true dependencies: webpack: 5.93.0(webpack-cli@6.0.1) dev: true @@ -21725,7 +21878,7 @@ packages: '@csstools/css-syntax-patches-for-csstree': 1.0.26 '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) '@dual-bundle/import-meta-resolve': 4.2.1 balanced-match: 2.0.0 colord: 2.9.3 @@ -21752,7 +21905,7 @@ packages: postcss: 8.5.6 postcss-resolve-nested-selector: 0.1.6 postcss-safe-parser: 7.0.1(postcss@8.5.6) - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 string-width: 4.2.3 @@ -21847,9 +22000,14 @@ packages: engines: {node: '>=6'} dev: true + /tapable@2.2.3: + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} + engines: {node: '>=6'} + /tapable@2.3.2: resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} + dev: true /tar-stream@1.6.2: resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} @@ -21867,7 +22025,6 @@ packages: /tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -21899,8 +22056,6 @@ packages: optional: true uglify-js: optional: true - webpack: - optional: true dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 @@ -21915,7 +22070,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -21978,8 +22133,8 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 /tinypool@2.1.0: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} @@ -22094,6 +22249,15 @@ packages: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: false + /ts-api-utils@2.4.0(typescript@5.9.3): + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + dependencies: + typescript: 5.9.3 + dev: true + /ts-api-utils@2.5.0(typescript@5.9.3): resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -22126,9 +22290,6 @@ packages: peerDependencies: typescript: '*' webpack: '*' - peerDependenciesMeta: - webpack: - optional: true dependencies: chalk: 4.1.2 enhanced-resolve: 4.5.0 @@ -22152,7 +22313,7 @@ packages: dependencies: chalk: 4.1.2 enhanced-resolve: 5.20.1 - tapable: 2.3.2 + tapable: 2.2.3 tsconfig-paths: 4.2.0 dev: true @@ -22405,8 +22566,8 @@ packages: engines: {node: '>=18.12.0'} dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.16.0 - picomatch: 4.0.4 + acorn: 8.15.0 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 dev: true @@ -22533,7 +22694,6 @@ packages: /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true /validate-npm-package-license@3.0.4: @@ -22614,7 +22774,7 @@ packages: colorette: 2.0.20 connect-history-api-fallback: 1.6.0 consola: 2.15.3 - dotenv: 16.4.5 + dotenv: 16.0.3 dotenv-expand: 8.0.3 ejs: 3.1.10 fast-glob: 3.3.3 @@ -22681,9 +22841,9 @@ packages: dependencies: '@types/node': 24.12.0 esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.3) jiti: 2.6.1 - picomatch: 4.0.4 + picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.54.0 tinyglobby: 0.2.15 @@ -22737,7 +22897,7 @@ packages: '@oxc-project/runtime': 0.115.0 '@types/node': 24.12.0 lightningcss: 1.32.0 - picomatch: 4.0.4 + picomatch: 4.0.3 postcss: 8.5.8 rolldown: 1.0.0-rc.9 sass: 1.70.0 @@ -22790,7 +22950,7 @@ packages: dependencies: '@oxc-project/runtime': 0.115.0 lightningcss: 1.32.0 - picomatch: 4.0.4 + picomatch: 4.0.3 postcss: 8.5.8 rolldown: 1.0.0-rc.9 sass: 1.70.0 @@ -22862,7 +23022,7 @@ packages: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.3 std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 @@ -22932,7 +23092,7 @@ packages: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.3 std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 @@ -23002,7 +23162,7 @@ packages: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.3 std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 @@ -23072,7 +23232,7 @@ packages: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.3 std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 @@ -23143,8 +23303,8 @@ packages: hasBin: true dependencies: '@discoveryjs/json-ext': 0.5.7 - acorn: 8.16.0 - acorn-walk: 8.3.5 + acorn: 8.15.0 + acorn-walk: 8.3.4 commander: 7.2.0 debounce: 1.2.1 escape-string-regexp: 4.0.0 @@ -23167,8 +23327,6 @@ packages: webpack-bundle-analyzer: '*' webpack-dev-server: '*' peerDependenciesMeta: - webpack: - optional: true webpack-bundle-analyzer: optional: true webpack-dev-server: @@ -23295,11 +23453,11 @@ packages: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-attributes: 1.9.5(acorn@8.16.0) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.20.1 + enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -23310,7 +23468,7 @@ packages: mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 3.3.0 - tapable: 2.3.2 + tapable: 2.2.3 terser-webpack-plugin: 5.3.14(webpack@5.93.0) watchpack: 2.4.4 webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.93.0) diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json index 362f47a7325..6fcdb69563a 100644 --- a/common/config/rush/version-policies.json +++ b/common/config/rush/version-policies.json @@ -12,14 +12,14 @@ { "definitionName": "lockStepVersion", "policyName": "sdk", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "nextBump": "prerelease", "mainProject": "@gooddata/sdk-ui-all" }, { "definitionName": "lockStepVersion", "policyName": "sdk-examples", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "nextBump": "prerelease", "mainProject": "@gooddata/sdk-ui-all" } diff --git a/examples/sdk-interactive-examples/examples-template/package.json b/examples/sdk-interactive-examples/examples-template/package.json index 27d1273089f..dfed4df447d 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 ce7b65b0d22..9d3873a5d12 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 0aa611f8cb8..32c6eea2a00 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 9b1f1c6071c..338c324154e 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 ce9368dd7b7..11efa2d3d80 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 eb3e68f8047..bcec164f05d 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 705cf23ce31..0e1b08b30cc 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 9f254c70bfa..b3bf54a7b46 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 02dd67f95d6..65db2090836 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 48ca4be58e7..b70ec2c89e9 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 5be04920f83..0d5e8fc48e0 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 b60790f610d..365f0c3d546 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 4b511b2afe4..f0fd8f6d78d 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 61512b54b26..292e8bfc98a 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "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 ec2324ab678..c3e999b67c4 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "GoodData React interactive examples", "license": "LicenseRef-LICENSE", diff --git a/libs/api-client-tiger/api-extractor.json b/libs/api-client-tiger/api-extractor.json index 607428ee17f..1088f274838 100644 --- a/libs/api-client-tiger/api-extractor.json +++ b/libs/api-client-tiger/api-extractor.json @@ -108,22 +108,7 @@ "default": { "logLevel": "none" // "addToApiReportFile": false - }, - - // workaround for the false negative about - // > The symbol "AutomationAlertCondition_2" needs to be exported by the entry point index.d.ts - // remove this once the above error is not there anymore (bug in API extractor) - "ae-forgotten-export": { - "logLevel": "warning", - "addToApiReportFile": true } - - // "ae-extra-release-tag": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . }, /** @@ -136,15 +121,7 @@ "tsdocMessageReporting": { "default": { "logLevel": "none" - // "addToApiReportFile": false } - - // "tsdoc-link-tag-unescaped-text": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . } } } diff --git a/libs/api-client-tiger/api/api-client-tiger.api.md b/libs/api-client-tiger/api/api-client-tiger.api.md index 8f580443ae8..8ce7d1cbf73 100644 --- a/libs/api-client-tiger/api/api-client-tiger.api.md +++ b/libs/api-client-tiger/api/api-client-tiger.api.md @@ -51,10 +51,8 @@ export interface AbsoluteDateFilterAbsoluteDateFilter { // @public (undocumented) export type AbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; -// Warning: (ae-forgotten-export) The symbol "CompoundMeasureValueFilter_2" needs to be exported by the entry point index.d.ts -// // @public -export type AbstractMeasureValueFilter = AfmComparisonMeasureValueFilter | CompoundMeasureValueFilter_2 | AfmRangeMeasureValueFilter | AfmRankingFilter; +export type AbstractMeasureValueFilter = AfmComparisonMeasureValueFilter | AfmCompoundMeasureValueFilter | AfmRangeMeasureValueFilter | AfmRankingFilter; // @public export class ActionsApi extends MetadataBaseApi implements ActionsApiInterface { @@ -144,8 +142,6 @@ export function ActionsApi_InheritedEntityConflicts(axios: AxiosInstance, basePa // @public export function ActionsApi_InheritedEntityPrefixes(axios: AxiosInstance, basePath: string, requestParameters: ActionsApiInheritedEntityPrefixesRequest, options?: AxiosRequestConfig, configuration?: MetadataConfiguration): AxiosPromise>; -// Warning: (ae-forgotten-export) The symbol "ListLlmProviderModelsResponse" needs to be exported by the entry point index.d.ts -// // @public export function ActionsApi_ListLlmProviderModels(axios: AxiosInstance, basePath: string, requestParameters: ActionsApiListLlmProviderModelsRequest, options?: AxiosRequestConfig, configuration?: LabelElementsConfiguration): AxiosPromise; @@ -441,6 +437,24 @@ export interface ActionsApiCancelExecutionsRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiCancelWorkflowRequest { + readonly runId: string; + readonly workspaceId: string; +} + +// @public +export interface ActionsApiChangeAnalysisRequest { + readonly changeAnalysisRequest: AfmChangeAnalysisRequest; + readonly workspaceId: string; +} + +// @public +export interface ActionsApiChangeAnalysisResultRequest { + readonly resultId: string; + readonly workspaceId: string; +} + // @public export interface ActionsApiCheckEntityOverridesRequest { readonly hierarchyObjectIdentification: Array; @@ -484,6 +498,14 @@ export interface ActionsApiComputeLabelElementsPostRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiComputeReportForVisualizationObjectRequest { + readonly skipCache?: boolean; + readonly visualizationObjectExecution?: VisualizationObjectExecution; + readonly visualizationObjectId: string; + readonly workspaceId: string; +} + // @public export interface ActionsApiComputeReportRequest { readonly afmExecution: AfmExecution; @@ -504,6 +526,16 @@ export interface ActionsApiComputeValidObjectsRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiConvertGeoFileRequest { + readonly convertGeoFileRequest: ConvertGeoFileRequest; +} + +// @public +export interface ActionsApiCustomGeoCollectionStagingUploadRequest { + readonly file: File; +} + // @public export interface ActionsApiDashboardPermissionsRequest { readonly dashboardId: string; @@ -550,12 +582,30 @@ export interface ActionsApiForecastResultRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiGenerateDashboardSummaryRequest { + readonly workflowDashboardSummaryRequestDto: WorkflowDashboardSummaryRequestDto; + readonly workspaceId: string; +} + +// @public +export interface ActionsApiGenerateDescriptionRequest { + readonly generateDescriptionRequest: GenerateDescriptionRequest; + readonly workspaceId: string; +} + // @public export interface ActionsApiGenerateLogicalModelRequest { readonly dataSourceId: string; readonly generateLdmRequest: GenerateLdmRequest; } +// @public +export interface ActionsApiGenerateTitleRequest { + readonly generateTitleRequest: GenerateTitleRequest; + readonly workspaceId: string; +} + // @public export interface ActionsApiGetDataSourceSchemataRequest { readonly dataSourceId: string; @@ -584,12 +634,24 @@ export interface ActionsApiGetTranslationTagsRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiGetWorkflowStatusRequest { + readonly runId: string; + readonly workspaceId: string; +} + // @public export interface ActionsApiImportCsvRequest { readonly dataSourceId: string; readonly importCsvRequest: ImportCsvRequest; } +// @public +export interface ActionsApiImportCustomGeoCollectionRequest { + readonly collectionId: string; + readonly importGeoCollectionRequest: ImportGeoCollectionRequest; +} + // @public export interface ActionsApiInheritedEntityConflictsRequest { readonly workspaceId: string; @@ -676,7 +738,6 @@ export interface ActionsApiListLlmProviderModelsByIdRequest { // @public export interface ActionsApiListLlmProviderModelsRequest { - // Warning: (ae-forgotten-export) The symbol "ListLlmProviderModelsRequest" needs to be exported by the entry point index.d.ts readonly listLlmProviderModelsRequest: ListLlmProviderModelsRequest; } @@ -725,6 +786,21 @@ export interface ActionsApiMetadataSyncRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiOutlierDetectionRequest { + readonly outlierDetectionRequest: OutlierDetectionRequest; + readonly skipCache?: boolean; + readonly workspaceId: string; +} + +// @public +export interface ActionsApiOutlierDetectionResultRequest { + readonly limit?: number; + readonly offset?: number; + readonly resultId: string; + readonly workspaceId: string; +} + // @public export interface ActionsApiOverriddenChildEntitiesRequest { readonly workspaceId: string; @@ -772,6 +848,11 @@ export interface ActionsApiResolveLlmEndpointsRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiResolveLlmProvidersRequest { + readonly workspaceId: string; +} + // @public export interface ActionsApiResolveRequestedEntitlementsRequest { readonly entitlementsRequest: EntitlementsRequest; @@ -789,6 +870,13 @@ export interface ActionsApiRetrieveExecutionMetadataRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiRetrieveResultBinaryRequest { + readonly resultId: string; + readonly workspaceId: string; + readonly xGDCCANCELTOKEN?: string; +} + // @public export interface ActionsApiRetrieveResultRequest { readonly excludedTotalDimensions?: Array; @@ -817,6 +905,12 @@ export interface ActionsApiScanSqlRequest { readonly scanSqlRequest: ScanSqlRequest; } +// @public +export interface ActionsApiScanStatisticsRequest { + readonly dataSourceId: string; + readonly tableStatisticsRequest: TableStatisticsRequest; +} + // @public export interface ActionsApiSetCertificationRequest { readonly setCertificationRequest: SetCertificationRequest; @@ -850,6 +944,11 @@ export interface ActionsApiTestDataSourceRequest { readonly testRequest: TestRequest; } +// @public +export interface ActionsApiTrendingObjectsRequest { + readonly workspaceId: string; +} + // @public interface ActionsApiTriggerQualityIssuesCalculationRequest { readonly workspaceId: string; @@ -1228,8 +1327,7 @@ export interface AfmAbsoluteDateFilterAbsoluteDateFilter { 'applyOnResult'?: boolean; // (undocumented) 'dataset': AfmModelObjectIdentifierDataset; - // Warning: (ae-forgotten-export) The symbol "AbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum_2" needs to be exported by the entry point index.d.ts - 'emptyValueHandling'?: AbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum_2; + 'emptyValueHandling'?: AfmAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum; // (undocumented) 'from': string; // (undocumented) @@ -1238,6 +1336,9 @@ export interface AfmAbsoluteDateFilterAbsoluteDateFilter { 'to': string; } +// @public (undocumented) +export type AfmAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + // @public export class AfmActionsApi extends LabelElementsBaseApi implements AfmActionsApiInterface { aiChat(requestParameters: ActionsApiAiChatRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -1248,23 +1349,16 @@ export class AfmActionsApi extends LabelElementsBaseApi implements AfmActionsApi anomalyDetection(requestParameters: ActionsApiAnomalyDetectionRequest, options?: AxiosRequestConfig): AxiosPromise; anomalyDetectionResult(requestParameters: ActionsApiAnomalyDetectionResultRequest, options?: AxiosRequestConfig): AxiosPromise; cancelExecutions(requestParameters: ActionsApiCancelExecutionsRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiCancelWorkflowRequest" needs to be exported by the entry point index.d.ts - // // (undocumented) cancelWorkflow(requestParameters: ActionsApiCancelWorkflowRequest, options?: AxiosRequestConfig): AxiosPromise<{ [key: string]: string; }>; - // Warning: (ae-forgotten-export) The symbol "ActionsApiChangeAnalysisRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ChangeAnalysisResponse" needs to be exported by the entry point index.d.ts changeAnalysis(requestParameters: ActionsApiChangeAnalysisRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiChangeAnalysisResultRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ChangeAnalysisResult" needs to be exported by the entry point index.d.ts changeAnalysisResult(requestParameters: ActionsApiChangeAnalysisResultRequest, options?: AxiosRequestConfig): AxiosPromise; clustering(requestParameters: ActionsApiClusteringRequest, options?: AxiosRequestConfig): AxiosPromise; clusteringResult(requestParameters: ActionsApiClusteringResultRequest, options?: AxiosRequestConfig): AxiosPromise; computeLabelElementsPost(requestParameters: ActionsApiComputeLabelElementsPostRequest, options?: AxiosRequestConfig): AxiosPromise; computeReport(requestParameters: ActionsApiComputeReportRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiComputeReportForVisualizationObjectRequest" needs to be exported by the entry point index.d.ts computeReportForVisualizationObject(requestParameters: ActionsApiComputeReportForVisualizationObjectRequest, options?: AxiosRequestConfig): AxiosPromise; computeValidDescendants(requestParameters: ActionsApiComputeValidDescendantsRequest, options?: AxiosRequestConfig): AxiosPromise; computeValidObjects(requestParameters: ActionsApiComputeValidObjectsRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -1272,22 +1366,12 @@ export class AfmActionsApi extends LabelElementsBaseApi implements AfmActionsApi explainAFM(requestParameters: ActionsApiExplainAFMRequest, options?: AxiosRequestConfig): AxiosPromise; forecast(requestParameters: ActionsApiForecastRequest, options?: AxiosRequestConfig): AxiosPromise; forecastResult(requestParameters: ActionsApiForecastResultRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiGenerateDashboardSummaryRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "WorkflowDashboardSummaryResponseDto" needs to be exported by the entry point index.d.ts - // // (undocumented) generateDashboardSummary(requestParameters: ActionsApiGenerateDashboardSummaryRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiGenerateDescriptionRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "GenerateDescriptionResponse" needs to be exported by the entry point index.d.ts generateDescription(requestParameters: ActionsApiGenerateDescriptionRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiGenerateTitleRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "GenerateTitleResponse" needs to be exported by the entry point index.d.ts generateTitle(requestParameters: ActionsApiGenerateTitleRequest, options?: AxiosRequestConfig): AxiosPromise; getQualityIssues(requestParameters: ActionsApiGetQualityIssuesRequest, options?: AxiosRequestConfig): AxiosPromise; getQualityIssuesCalculationStatus(requestParameters: AfmActionsApiGetQualityIssuesCalculationStatusRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiGetWorkflowStatusRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "WorkflowStatusResponseDto" needs to be exported by the entry point index.d.ts - // // (undocumented) getWorkflowStatus(requestParameters: ActionsApiGetWorkflowStatusRequest, options?: AxiosRequestConfig): AxiosPromise; keyDriverAnalysis(requestParameters: ActionsApiKeyDriverAnalysisRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -1295,27 +1379,17 @@ export class AfmActionsApi extends LabelElementsBaseApi implements AfmActionsApi listLlmProviderModels(requestParameters: ActionsApiListLlmProviderModelsRequest, options?: AxiosRequestConfig): AxiosPromise; listLlmProviderModelsById(requestParameters: ActionsApiListLlmProviderModelsByIdRequest, options?: AxiosRequestConfig): AxiosPromise; memoryCreatedByUsers(requestParameters: GenAiApiMemoryCreatedByUsersRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiOutlierDetectionRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "OutlierDetectionResponse" needs to be exported by the entry point index.d.ts outlierDetection(requestParameters: ActionsApiOutlierDetectionRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiOutlierDetectionResultRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "OutlierDetectionResult" needs to be exported by the entry point index.d.ts outlierDetectionResult(requestParameters: ActionsApiOutlierDetectionResultRequest, options?: AxiosRequestConfig): AxiosPromise; // @deprecated resolveLlmEndpoints(requestParameters: ActionsApiResolveLlmEndpointsRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiResolveLlmProvidersRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ResolvedLlms" needs to be exported by the entry point index.d.ts resolveLlmProviders(requestParameters: ActionsApiResolveLlmProvidersRequest, options?: AxiosRequestConfig): AxiosPromise; retrieveExecutionMetadata(requestParameters: ActionsApiRetrieveExecutionMetadataRequest, options?: AxiosRequestConfig): AxiosPromise; retrieveResult(requestParameters: ActionsApiRetrieveResultRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiRetrieveResultBinaryRequest" needs to be exported by the entry point index.d.ts retrieveResultBinary(requestParameters: ActionsApiRetrieveResultBinaryRequest, options?: AxiosRequestConfig): AxiosPromise; tags(requestParameters: GenAiApiTagsRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "TestLlmProviderResponse" needs to be exported by the entry point index.d.ts testLlmProvider(requestParameters: GenAiApiTestLlmProviderRequest, options?: AxiosRequestConfig): AxiosPromise; testLlmProviderById(requestParameters: GenAiApiTestLlmProviderByIdRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiTrendingObjectsRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "TrendingObjectsResult" needs to be exported by the entry point index.d.ts trendingObjects(requestParameters: ActionsApiTrendingObjectsRequest, options?: AxiosRequestConfig): AxiosPromise; triggerQualityIssuesCalculation(requestParameters: ActionsApiTriggerQualityIssuesCalculationRequest, options?: AxiosRequestConfig): AxiosPromise; // @deprecated @@ -1389,6 +1463,47 @@ export interface AfmActionsApiInterface { validateLLMEndpointById(requestParameters: ActionsApiValidateLLMEndpointByIdRequest, options?: AxiosRequestConfig): AxiosPromise; } +// @public +export interface AfmAfmObjectIdentifierParameter { + // (undocumented) + 'identifier': AfmAfmObjectIdentifierParameterIdentifier; +} + +// @public (undocumented) +export interface AfmAfmObjectIdentifierParameterIdentifier { + // (undocumented) + 'id': string; + // (undocumented) + 'type': AfmAfmObjectIdentifierParameterIdentifierTypeEnum; +} + +// @public (undocumented) +export type AfmAfmObjectIdentifierParameterIdentifierTypeEnum = 'parameter'; + +// @public +export interface AfmAllTimeDateFilter { + // (undocumented) + 'allTimeDateFilter': AfmAllTimeDateFilterAllTimeDateFilter; +} + +// @public (undocumented) +export interface AfmAllTimeDateFilterAllTimeDateFilter { + // (undocumented) + 'applyOnResult'?: boolean; + // (undocumented) + 'dataset': AfmModelObjectIdentifierDataset; + 'emptyValueHandling'?: AfmAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum; + 'granularity'?: AfmAllTimeDateFilterAllTimeDateFilterGranularityEnum; + // (undocumented) + 'localIdentifier'?: string; +} + +// @public (undocumented) +export type AfmAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + +// @public (undocumented) +export type AfmAllTimeDateFilterAllTimeDateFilterGranularityEnum = 'MINUTE' | 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR' | 'MINUTE_OF_HOUR' | 'HOUR_OF_DAY' | 'DAY_OF_WEEK' | 'DAY_OF_MONTH' | 'DAY_OF_QUARTER' | 'DAY_OF_YEAR' | 'WEEK_OF_YEAR' | 'MONTH_OF_YEAR' | 'QUARTER_OF_YEAR' | 'FISCAL_MONTH' | 'FISCAL_QUARTER' | 'FISCAL_YEAR'; + // @public (undocumented) export interface AfmAnalyticsCatalogCreatedBy { 'reasoning': string; @@ -1423,10 +1538,8 @@ export interface AfmArithmeticMeasureDefinitionArithmeticMeasure { // @public (undocumented) export type AfmArithmeticMeasureDefinitionArithmeticMeasureOperatorEnum = 'SUM' | 'DIFFERENCE' | 'MULTIPLICATION' | 'RATIO' | 'CHANGE'; -// Warning: (ae-forgotten-export) The symbol "MatchAttributeFilter_2" needs to be exported by the entry point index.d.ts -// // @public -export type AfmAttributeFilter = MatchAttributeFilter_2 | AfmNegativeAttributeFilter | AfmPositiveAttributeFilter; +export type AfmAttributeFilter = AfmMatchAttributeFilter | AfmNegativeAttributeFilter | AfmPositiveAttributeFilter; // @public export interface AfmAttributeFilterElements { @@ -1441,6 +1554,48 @@ export interface AfmAttributeItem { 'showAllValues'?: boolean; } +// @public (undocumented) +export interface AfmAwsBedrockAccessKeyAuth { + 'accessKeyId'?: string | null; + 'secretAccessKey'?: string | null; + 'sessionToken'?: string | null; + 'type': AfmAwsBedrockAccessKeyAuthTypeEnum; +} + +// @public (undocumented) +export type AfmAwsBedrockAccessKeyAuthTypeEnum = 'ACCESS_KEY'; + +// @public +export interface AfmAwsBedrockProviderConfig { + // (undocumented) + 'auth': AfmAwsBedrockAccessKeyAuth; + 'region': string; + 'type': AfmAwsBedrockProviderConfigTypeEnum; +} + +// @public (undocumented) +export type AfmAwsBedrockProviderConfigTypeEnum = 'AWS_BEDROCK'; + +// @public (undocumented) +export interface AfmAzureFoundryApiKeyAuth { + 'apiKey'?: string | null; + 'type': AfmAzureFoundryApiKeyAuthTypeEnum; +} + +// @public (undocumented) +export type AfmAzureFoundryApiKeyAuthTypeEnum = 'API_KEY'; + +// @public +export interface AfmAzureFoundryProviderConfig { + // (undocumented) + 'auth': AfmAzureFoundryApiKeyAuth; + 'endpoint': string; + 'type': AfmAzureFoundryProviderConfigTypeEnum; +} + +// @public (undocumented) +export type AfmAzureFoundryProviderConfigTypeEnum = 'AZURE_FOUNDRY'; + // @public export interface AfmBoundedFilter { 'from'?: number | null; @@ -1466,7 +1621,6 @@ export interface AfmChangeAnalysisRequest { // (undocumented) 'dateAttribute': AfmAttributeItem; 'excludeTags'?: Array; - // Warning: (ae-forgotten-export) The symbol "OutlierDetectionRequestFiltersInner" needs to be exported by the entry point index.d.ts 'filters'?: Array; 'includeTags'?: Array; // (undocumented) @@ -1475,6 +1629,23 @@ export interface AfmChangeAnalysisRequest { 'useSmartAttributeSelection'?: boolean; } +// @public +export interface AfmComparisonCondition { + // (undocumented) + 'comparison': AfmComparisonConditionComparison; +} + +// @public (undocumented) +export interface AfmComparisonConditionComparison { + // (undocumented) + 'operator': AfmComparisonConditionComparisonOperatorEnum; + // (undocumented) + 'value': number; +} + +// @public (undocumented) +export type AfmComparisonConditionComparisonOperatorEnum = 'GREATER_THAN' | 'GREATER_THAN_OR_EQUAL_TO' | 'LESS_THAN' | 'LESS_THAN_OR_EQUAL_TO' | 'EQUAL_TO' | 'NOT_EQUAL_TO'; + // @public export interface AfmComparisonMeasureValueFilter { // (undocumented) @@ -1500,10 +1671,27 @@ export interface AfmComparisonMeasureValueFilterComparisonMeasureValueFilter { // @public (undocumented) export type AfmComparisonMeasureValueFilterComparisonMeasureValueFilterOperatorEnum = 'GREATER_THAN' | 'GREATER_THAN_OR_EQUAL_TO' | 'LESS_THAN' | 'LESS_THAN_OR_EQUAL_TO' | 'EQUAL_TO' | 'NOT_EQUAL_TO'; -// Warning: (ae-forgotten-export) The symbol "AllTimeDateFilter_2" needs to be exported by the entry point index.d.ts -// // @public -export type AfmDateFilter = AfmAbsoluteDateFilter | AllTimeDateFilter_2 | AfmRelativeDateFilter; +export interface AfmCompoundMeasureValueFilter { + // (undocumented) + 'compoundMeasureValueFilter': AfmCompoundMeasureValueFilterCompoundMeasureValueFilter; +} + +// @public (undocumented) +export interface AfmCompoundMeasureValueFilterCompoundMeasureValueFilter { + // (undocumented) + 'applyOnResult'?: boolean; + 'conditions': Array; + 'dimensionality'?: Array; + // (undocumented) + 'localIdentifier'?: string; + // (undocumented) + 'measure': AfmModelIdentifier; + 'treatNullValuesAs'?: number; +} + +// @public +export type AfmDateFilter = AfmAbsoluteDateFilter | AfmAllTimeDateFilter | AfmRelativeDateFilter; // @public (undocumented) export interface AfmExecution { @@ -1528,15 +1716,29 @@ export interface AfmExecutionSettings { } // @public -export type AfmFilterDefinition = AfmAbsoluteDateFilter | AllTimeDateFilter_2 | AfmComparisonMeasureValueFilter | CompoundMeasureValueFilter_2 | AfmInlineFilterDefinition | MatchAttributeFilter_2 | AfmNegativeAttributeFilter | AfmPositiveAttributeFilter | AfmRangeMeasureValueFilter | AfmRankingFilter | AfmRelativeDateFilter; +export type AfmFilterDefinition = AfmAbsoluteDateFilter | AfmAllTimeDateFilter | AfmComparisonMeasureValueFilter | AfmCompoundMeasureValueFilter | AfmInlineFilterDefinition | AfmMatchAttributeFilter | AfmNegativeAttributeFilter | AfmPositiveAttributeFilter | AfmRangeMeasureValueFilter | AfmRankingFilter | AfmRelativeDateFilter; // @public export type AfmFilterDefinitionForSimpleMeasure = AfmAttributeFilter | AfmDateFilter; +// @public +export interface AfmGeoAreaConfig { + // (undocumented) + 'collection': AfmGeoCollectionIdentifier; +} + +// @public (undocumented) +export interface AfmGeoCollectionIdentifier { + 'id': string; + 'kind'?: AfmGeoCollectionIdentifierKindEnum; +} + +// @public (undocumented) +export type AfmGeoCollectionIdentifierKindEnum = 'STATIC' | 'CUSTOM'; + // @public (undocumented) export interface AfmGetQualityIssuesResponse { 'issues': Array; - // Warning: (ae-forgotten-export) The symbol "GetQualityIssuesResponseStatusEnum" needs to be exported by the entry point index.d.ts 'status': GetQualityIssuesResponseStatusEnum; 'updatedAt'?: string; } @@ -1576,6 +1778,29 @@ export interface AfmLocalIdentifier { 'localIdentifier': string; } +// @public +export interface AfmMatchAttributeFilter { + // (undocumented) + 'matchAttributeFilter': AfmMatchAttributeFilterMatchAttributeFilter; +} + +// @public (undocumented) +export interface AfmMatchAttributeFilterMatchAttributeFilter { + // (undocumented) + 'applyOnResult'?: boolean; + 'caseSensitive'?: boolean; + // (undocumented) + 'label': AfmModelIdentifier; + 'literal': string; + // (undocumented) + 'localIdentifier'?: string; + 'matchType': AfmMatchAttributeFilterMatchAttributeFilterMatchTypeEnum; + 'negate'?: boolean; +} + +// @public (undocumented) +export type AfmMatchAttributeFilterMatchAttributeFilterMatchTypeEnum = 'STARTS_WITH' | 'ENDS_WITH' | 'CONTAINS'; + // @public export type AfmMeasureDefinition = AfmArithmeticMeasureDefinition | AfmInlineMeasureDefinition | AfmPopMeasureDefinition | AfmSimpleMeasureDefinition; @@ -1586,6 +1811,9 @@ export interface AfmMeasureItem { 'localIdentifier': string; } +// @public +export type AfmMeasureValueCondition = AfmComparisonCondition | AfmRangeCondition; + // @public (undocumented) export interface AfmMemoryItemCreatedByUsers { 'reasoning': string; @@ -1629,7 +1857,6 @@ export interface AfmModel { 'filters': Array; 'measureDefinitionOverrides'?: Array; 'measures': Array; - // Warning: (ae-forgotten-export) The symbol "ParameterItem_2" needs to be exported by the entry point index.d.ts 'parameters'?: Array; } @@ -1848,6 +2075,27 @@ export interface AfmObjectIdentifierParameterIdentifier { // @public (undocumented) export type AfmObjectIdentifierParameterIdentifierTypeEnum = 'parameter'; +// @public (undocumented) +export interface AfmOpenAiApiKeyAuth { + 'apiKey'?: string | null; + 'type': AfmOpenAiApiKeyAuthTypeEnum; +} + +// @public (undocumented) +export type AfmOpenAiApiKeyAuthTypeEnum = 'API_KEY'; + +// @public +export interface AfmOpenAIProviderConfig { + // (undocumented) + 'auth': AfmOpenAiApiKeyAuth; + 'baseUrl'?: string; + 'organization'?: string | null; + 'type': AfmOpenAIProviderConfigTypeEnum; +} + +// @public (undocumented) +export type AfmOpenAIProviderConfigTypeEnum = 'OPENAI'; + // @public export interface AfmPopDataset { // (undocumented) @@ -1918,7 +2166,6 @@ export interface AfmQualityIssue { }; 'id': string; 'objects': Array; - // Warning: (ae-forgotten-export) The symbol "QualityIssueSeverityEnum" needs to be exported by the entry point index.d.ts 'severity': QualityIssueSeverityEnum; } @@ -1940,6 +2187,25 @@ export interface AfmQualityIssuesCalculationStatusResponse { // @public (undocumented) export type AfmQualityIssuesCalculationStatusResponseStatusEnum = 'RUNNING' | 'SYNCING' | 'COMPLETED' | 'FAILED' | 'CANCELLED' | 'NOT_FOUND' | 'DISABLED'; +// @public +export interface AfmRangeCondition { + // (undocumented) + 'range': AfmRangeConditionRange; +} + +// @public (undocumented) +export interface AfmRangeConditionRange { + // (undocumented) + 'from': number; + // (undocumented) + 'operator': AfmRangeConditionRangeOperatorEnum; + // (undocumented) + 'to': number; +} + +// @public (undocumented) +export type AfmRangeConditionRangeOperatorEnum = 'BETWEEN' | 'NOT_BETWEEN'; + // @public export interface AfmRangeMeasureValueFilter { // (undocumented) @@ -2002,8 +2268,7 @@ export interface AfmRelativeDateFilterRelativeDateFilter { 'boundedFilter'?: AfmBoundedFilter; // (undocumented) 'dataset': AfmModelObjectIdentifierDataset; - // Warning: (ae-forgotten-export) The symbol "RelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum_2" needs to be exported by the entry point index.d.ts - 'emptyValueHandling'?: RelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum_2; + 'emptyValueHandling'?: AfmRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum; 'from': number; 'granularity': AfmRelativeDateFilterRelativeDateFilterGranularityEnum; // (undocumented) @@ -2011,6 +2276,9 @@ export interface AfmRelativeDateFilterRelativeDateFilter { 'to': number; } +// @public (undocumented) +export type AfmRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + // @public (undocumented) export type AfmRelativeDateFilterRelativeDateFilterGranularityEnum = 'MINUTE' | 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR' | 'MINUTE_OF_HOUR' | 'HOUR_OF_DAY' | 'DAY_OF_WEEK' | 'DAY_OF_MONTH' | 'DAY_OF_QUARTER' | 'DAY_OF_YEAR' | 'WEEK_OF_YEAR' | 'MONTH_OF_YEAR' | 'QUARTER_OF_YEAR' | 'FISCAL_MONTH' | 'FISCAL_QUARTER' | 'FISCAL_YEAR'; @@ -2035,7 +2303,6 @@ export type AfmSimpleMeasureDefinitionMeasureAggregationEnum = 'SUM' | 'COUNT' | // @public (undocumented) export interface AfmTriggerQualityIssuesCalculationResponse { 'processId': string; - // Warning: (ae-forgotten-export) The symbol "TriggerQualityIssuesCalculationResponseStatusEnum" needs to be exported by the entry point index.d.ts 'status': TriggerQualityIssuesCalculationResponseStatusEnum; } @@ -2068,22 +2335,16 @@ export interface AfmValidObjectsResponse { 'items': Array; } -// Warning: (ae-forgotten-export) The symbol "BaseAPI" needs to be exported by the entry point index.d.ts -// // @public -export class AgentAi extends BaseAPI implements AgentAiInterface { +export class AgentAi extends AiBaseAPI implements AgentAiInterface { listAvailableSkills(options?: AxiosRequestConfig): AxiosPromise; } -// Warning: (ae-forgotten-export) The symbol "Configuration_2" needs to be exported by the entry point index.d.ts -// // @public -export function AgentAi_ListAvailableSkills(axios: AxiosInstance, basePath: string, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise>; +export function AgentAi_ListAvailableSkills(axios: AxiosInstance, basePath: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise>; -// Warning: (ae-forgotten-export) The symbol "RequestArgs" needs to be exported by the entry point index.d.ts -// // @public -export function AgentAiAxiosParamCreator_ListAvailableSkills(options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function AgentAiAxiosParamCreator_ListAvailableSkills(options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public export interface AgentAiInterface { @@ -2682,6 +2943,17 @@ export type AiAttributeSortItemDirectionEnum = 'ASC' | 'DESC'; // @public (undocumented) export type AiAttributeSortItemTypeEnum = 'attribute_sort'; +// @public (undocumented) +export class AiBaseAPI { + constructor(configuration?: AiConfiguration, basePath?: string, axios?: AxiosInstance); + // (undocumented) + protected axios: AxiosInstance; + // (undocumented) + protected basePath: string; + // (undocumented) + protected configuration: AiConfiguration | undefined; +} + // @public (undocumented) export interface AiBucketRefObject { // (undocumented) @@ -2692,6 +2964,40 @@ export interface AiBucketRefObject { export interface AiClusteringAmount { } +// @public (undocumented) +export class AiConfiguration { + constructor(param?: AiConfigurationParameters); + accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); + apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise); + baseOptions?: any; + basePath?: string; + formDataCtor?: new () => any; + isJsonMime(mime: string): boolean; + password?: string; + serverIndex?: number; + username?: string; +} + +// @public +export interface AiConfigurationParameters { + // (undocumented) + accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); + // (undocumented) + apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise); + // (undocumented) + baseOptions?: any; + // (undocumented) + basePath?: string; + // (undocumented) + formDataCtor?: new () => any; + // (undocumented) + password?: string; + // (undocumented) + serverIndex?: number; + // (undocumented) + username?: string; +} + // @public export type AiContent = ({ type: 'multipart'; @@ -2760,6 +3066,7 @@ export interface AiConversationResponse { 'isPreview'?: boolean; 'lastActivityAt': string; 'organizationId': string; + 'pinned'?: boolean; // (undocumented) 'title'?: string | null; 'userId': string; @@ -2782,6 +3089,8 @@ export interface AiConversationTurnResponse { // @public export interface AiConversationUpdateRequest { + // (undocumented) + 'pinned'?: boolean | null; // (undocumented) 'title'?: string | null; } @@ -3226,6 +3535,14 @@ export interface AiReasoningContent { // @public (undocumented) export type AiReasoningContentTypeEnum = 'reasoning'; +// @public (undocumented) +export interface AiRequestArgs { + // (undocumented) + options: RawAxiosRequestConfig; + // (undocumented) + url: string; +} + // @public (undocumented) export interface AiResponseFeedback { // (undocumented) @@ -3478,6 +3795,13 @@ export interface AiUploadDocumentResponse { 'success': boolean; } +// @public +export interface AiUsageMetadataItem { + 'counterType': string; + 'currentValue': number; + 'limit': number; +} + // @public (undocumented) export interface AiUserContext { // (undocumented) @@ -4707,10 +5031,8 @@ export interface AttributeHeaderAttributeHeader { 'attributeName': string; // (undocumented) 'format'?: AttributeFormat; - // Warning: (ae-forgotten-export) The symbol "GeoAreaConfig_2" needs to be exported by the entry point index.d.ts - // // (undocumented) - 'geoAreaConfig'?: GeoAreaConfig_2; + 'geoAreaConfig'?: AfmGeoAreaConfig; 'granularity'?: AttributeHeaderAttributeHeaderGranularityEnum; // (undocumented) 'label': RestApiIdentifier; @@ -5108,7 +5430,6 @@ export interface AutomationAbsoluteDateFilterAbsoluteDateFilter { 'applyOnResult'?: boolean; // (undocumented) 'dataset': AutomationAfmObjectIdentifierDataset; - // Warning: (ae-forgotten-export) The symbol "AutomationAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum" needs to be exported by the entry point index.d.ts 'emptyValueHandling'?: AutomationAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum; // (undocumented) 'from': string; @@ -5118,8 +5439,9 @@ export interface AutomationAbsoluteDateFilterAbsoluteDateFilter { 'to': string; } -// Warning: (ae-forgotten-export) The symbol "AutomationCompoundMeasureValueFilter" needs to be exported by the entry point index.d.ts -// +// @public (undocumented) +export type AutomationAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + // @public export type AutomationAbstractMeasureValueFilter = AutomationComparisonMeasureValueFilter | AutomationCompoundMeasureValueFilter | AutomationRangeMeasureValueFilter | AutomationRankingFilter; @@ -5163,10 +5485,8 @@ export interface AutomationAFM { 'attributes': Array; 'auxMeasures'?: Array; 'filters': Array; - // Warning: (ae-forgotten-export) The symbol "AutomationMetricDefinitionOverride" needs to be exported by the entry point index.d.ts 'measureDefinitionOverrides'?: Array; 'measures': Array; - // Warning: (ae-forgotten-export) The symbol "AutomationParameterItem" needs to be exported by the entry point index.d.ts 'parameters'?: Array; } @@ -5267,12 +5587,27 @@ export interface AutomationAfmObjectIdentifierLabelIdentifier { // @public (undocumented) export type AutomationAfmObjectIdentifierLabelIdentifierTypeEnum = 'label'; +// @public +export interface AutomationAfmObjectIdentifierParameter { + // (undocumented) + 'identifier': AutomationAfmObjectIdentifierParameterIdentifier; +} + +// @public (undocumented) +export interface AutomationAfmObjectIdentifierParameterIdentifier { + // (undocumented) + 'id': string; + // (undocumented) + 'type': AutomationAfmObjectIdentifierParameterIdentifierTypeEnum; +} + +// @public (undocumented) +export type AutomationAfmObjectIdentifierParameterIdentifierTypeEnum = 'parameter'; + // @public (undocumented) export interface AutomationAlert { - // Warning: (ae-forgotten-export) The symbol "AutomationAlertCondition_2" needs to be exported by the entry point index.d.ts - // // (undocumented) - 'condition': AutomationAlertCondition_2; + 'condition': MdAutomationAlertCondition; // (undocumented) 'execution': AlertAfm; 'interval'?: AutomationAlertIntervalEnum; @@ -5287,8 +5622,6 @@ export interface AutomationAlertAfm { 'measures': Array; } -// Warning: (ae-forgotten-export) The symbol "AutomationAnomalyDetectionWrapper" needs to be exported by the entry point index.d.ts -// // @public export type AutomationAlertCondition = AutomationAnomalyDetectionWrapper | AutomationComparisonWrapper | AutomationRangeWrapper | AutomationRelativeWrapper; @@ -5350,6 +5683,52 @@ export type AutomationAlertIntervalEnum = 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | // @public (undocumented) export type AutomationAlertTriggerEnum = 'ALWAYS' | 'ONCE' | 'ONCE_PER_INTERVAL'; +// @public +export interface AutomationAllTimeDateFilter { + // (undocumented) + 'allTimeDateFilter': AutomationAllTimeDateFilterAllTimeDateFilter; +} + +// @public (undocumented) +export interface AutomationAllTimeDateFilterAllTimeDateFilter { + // (undocumented) + 'applyOnResult'?: boolean; + // (undocumented) + 'dataset': AutomationAfmObjectIdentifierDataset; + 'emptyValueHandling'?: AutomationAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum; + 'granularity'?: AutomationAllTimeDateFilterAllTimeDateFilterGranularityEnum; + // (undocumented) + 'localIdentifier'?: string; +} + +// @public (undocumented) +export type AutomationAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + +// @public (undocumented) +export type AutomationAllTimeDateFilterAllTimeDateFilterGranularityEnum = 'MINUTE' | 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR' | 'MINUTE_OF_HOUR' | 'HOUR_OF_DAY' | 'DAY_OF_WEEK' | 'DAY_OF_MONTH' | 'DAY_OF_QUARTER' | 'DAY_OF_YEAR' | 'WEEK_OF_YEAR' | 'MONTH_OF_YEAR' | 'QUARTER_OF_YEAR' | 'FISCAL_MONTH' | 'FISCAL_QUARTER' | 'FISCAL_YEAR'; + +// @public (undocumented) +export interface AutomationAnomalyDetection { + // (undocumented) + 'dataset': AutomationAfmObjectIdentifierDataset; + 'granularity': AutomationAnomalyDetectionGranularityEnum; + // (undocumented) + 'measure': AutomationLocalIdentifier; + 'sensitivity': AutomationAnomalyDetectionSensitivityEnum; +} + +// @public (undocumented) +export type AutomationAnomalyDetectionGranularityEnum = 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR'; + +// @public (undocumented) +export type AutomationAnomalyDetectionSensitivityEnum = 'LOW' | 'MEDIUM' | 'HIGH'; + +// @public (undocumented) +export interface AutomationAnomalyDetectionWrapper { + // (undocumented) + 'anomaly': AutomationAnomalyDetection; +} + // @public (undocumented) export interface AutomationArithmeticMeasure { // (undocumented) @@ -5390,8 +5769,6 @@ export interface AutomationAttributeElementsByValue { 'values': Array; } -// Warning: (ae-forgotten-export) The symbol "AutomationMatchAttributeFilter" needs to be exported by the entry point index.d.ts -// // @public export type AutomationAttributeFilter = AutomationMatchAttributeFilter | AutomationNegativeAttributeFilter | AutomationPositiveAttributeFilter; @@ -5430,7 +5807,6 @@ export interface AutomationAutomationAlert { 'condition': AutomationAutomationAlertCondition; // (undocumented) 'execution': AutomationAlertAfm; - // Warning: (ae-forgotten-export) The symbol "AutomationAutomationAlertIntervalEnum" needs to be exported by the entry point index.d.ts 'interval'?: AutomationAutomationAlertIntervalEnum; 'trigger'?: AutomationAutomationAlertTriggerEnum; } @@ -5438,6 +5814,9 @@ export interface AutomationAutomationAlert { // @public export type AutomationAutomationAlertCondition = AutomationAnomalyDetectionWrapper | AutomationComparisonWrapper | AutomationRangeWrapper | AutomationRelativeWrapper; +// @public (undocumented) +export type AutomationAutomationAlertIntervalEnum = 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR'; + // @public (undocumented) export type AutomationAutomationAlertTriggerEnum = 'ALWAYS' | 'ONCE' | 'ONCE_PER_INTERVAL'; @@ -5529,6 +5908,23 @@ export interface AutomationComparison { 'right': AutomationAlertConditionOperand; } +// @public +export interface AutomationComparisonCondition { + // (undocumented) + 'comparison': AutomationComparisonConditionComparison; +} + +// @public (undocumented) +export interface AutomationComparisonConditionComparison { + // (undocumented) + 'operator': AutomationComparisonConditionComparisonOperatorEnum; + // (undocumented) + 'value': number; +} + +// @public (undocumented) +export type AutomationComparisonConditionComparisonOperatorEnum = 'GREATER_THAN' | 'GREATER_THAN_OR_EQUAL_TO' | 'LESS_THAN' | 'LESS_THAN_OR_EQUAL_TO' | 'EQUAL_TO' | 'NOT_EQUAL_TO'; + // @public export interface AutomationComparisonMeasureValueFilter { // (undocumented) @@ -5563,6 +5959,25 @@ export interface AutomationComparisonWrapper { 'comparison': AutomationComparison; } +// @public +export interface AutomationCompoundMeasureValueFilter { + // (undocumented) + 'compoundMeasureValueFilter': AutomationCompoundMeasureValueFilterCompoundMeasureValueFilter; +} + +// @public (undocumented) +export interface AutomationCompoundMeasureValueFilterCompoundMeasureValueFilter { + // (undocumented) + 'applyOnResult'?: boolean; + 'conditions': Array; + 'dimensionality'?: Array; + // (undocumented) + 'localIdentifier'?: string; + // (undocumented) + 'measure': AutomationAfmIdentifier; + 'treatNullValuesAs'?: number; +} + // @public (undocumented) export class AutomationConfiguration { constructor(param?: AutomationConfigurationParameters); @@ -5816,8 +6231,6 @@ export interface AutomationDashboardDateFilterDateFilter { 'boundedFilter'?: AutomationRelativeBoundedDateFilter; // (undocumented) 'dataSet'?: AutomationIdentifierRef; - // Warning: (ae-forgotten-export) The symbol "AutomationDashboardDateFilterDateFilterEmptyValueHandlingEnum" needs to be exported by the entry point index.d.ts - // // (undocumented) 'emptyValueHandling'?: AutomationDashboardDateFilterDateFilterEmptyValueHandlingEnum; // (undocumented) @@ -5832,6 +6245,9 @@ export interface AutomationDashboardDateFilterDateFilter { 'type': AutomationDashboardDateFilterDateFilterTypeEnum; } +// @public (undocumented) +export type AutomationDashboardDateFilterDateFilterEmptyValueHandlingEnum = 'include' | 'exclude' | 'only'; + // @public export type AutomationDashboardDateFilterDateFilterFrom = number | string; @@ -5845,12 +6261,16 @@ export type AutomationDashboardDateFilterDateFilterTypeEnum = 'relative' | 'abso export interface AutomationDashboardExportSettings { 'exportInfo'?: boolean; 'mergeHeaders'?: boolean; - // Warning: (ae-forgotten-export) The symbol "AutomationDashboardExportSettingsPageOrientationEnum" needs to be exported by the entry point index.d.ts 'pageOrientation'?: AutomationDashboardExportSettingsPageOrientationEnum; - // Warning: (ae-forgotten-export) The symbol "AutomationDashboardExportSettingsPageSizeEnum" needs to be exported by the entry point index.d.ts 'pageSize'?: AutomationDashboardExportSettingsPageSizeEnum; } +// @public (undocumented) +export type AutomationDashboardExportSettingsPageOrientationEnum = 'PORTRAIT' | 'LANDSCAPE'; + +// @public (undocumented) +export type AutomationDashboardExportSettingsPageSizeEnum = 'A3' | 'A4' | 'LETTER'; + // @public export type AutomationDashboardFilter = AutomationDashboardArbitraryAttributeFilter | AutomationDashboardAttributeFilter | AutomationDashboardDateFilter | AutomationDashboardMatchAttributeFilter; @@ -5904,8 +6324,6 @@ export interface AutomationDashboardTabularExportRequestV2 { // @public (undocumented) export type AutomationDashboardTabularExportRequestV2FormatEnum = 'XLSX' | 'PDF'; -// Warning: (ae-forgotten-export) The symbol "AutomationAllTimeDateFilter" needs to be exported by the entry point index.d.ts -// // @public export type AutomationDateFilter = AutomationAbsoluteDateFilter | AutomationAllTimeDateFilter | AutomationRelativeDateFilter; @@ -6072,6 +6490,29 @@ export interface AutomationLocalIdentifier { 'title'?: string | null; } +// @public +export interface AutomationMatchAttributeFilter { + // (undocumented) + 'matchAttributeFilter': AutomationMatchAttributeFilterMatchAttributeFilter; +} + +// @public (undocumented) +export interface AutomationMatchAttributeFilterMatchAttributeFilter { + // (undocumented) + 'applyOnResult'?: boolean; + 'caseSensitive'?: boolean; + // (undocumented) + 'label': AutomationAfmIdentifier; + 'literal': string; + // (undocumented) + 'localIdentifier'?: string; + 'matchType': AutomationMatchAttributeFilterMatchAttributeFilterMatchTypeEnum; + 'negate'?: boolean; +} + +// @public (undocumented) +export type AutomationMatchAttributeFilterMatchAttributeFilterMatchTypeEnum = 'STARTS_WITH' | 'ENDS_WITH' | 'CONTAINS'; + // @public export type AutomationMeasureDefinition = AutomationArithmeticMeasureDefinition | AutomationInlineMeasureDefinition | AutomationPopMeasureDefinition | AutomationSimpleMeasureDefinition; @@ -6085,6 +6526,9 @@ export interface AutomationMeasureItem { // @public export type AutomationMeasureItemDefinition = AutomationArithmeticMeasureDefinition | AutomationInlineMeasureDefinition | AutomationPopDatasetMeasureDefinition | AutomationPopDateMeasureDefinition | AutomationPopMeasureDefinition | AutomationSimpleMeasureDefinition; +// @public +export type AutomationMeasureValueCondition = AutomationComparisonCondition | AutomationRangeCondition; + // @public export type AutomationMeasureValueFilter = AutomationComparisonMeasureValueFilter | AutomationCompoundMeasureValueFilter | AutomationRangeMeasureValueFilter; @@ -6098,6 +6542,14 @@ export interface AutomationMetadata { 'widget'?: string; } +// @public +export interface AutomationMetricDefinitionOverride { + // (undocumented) + 'definition': AutomationInlineMeasureDefinition; + // (undocumented) + 'item': AutomationAfmObjectIdentifierCore; +} + // @public (undocumented) export interface AutomationMetricRecord { // (undocumented) @@ -6215,6 +6667,13 @@ export interface AutomationOver { 'attributes': Array; } +// @public +export interface AutomationParameterItem { + // (undocumented) + 'parameter': AutomationAfmObjectIdentifierParameter; + 'value': string; +} + // @public export interface AutomationPdfTableStyle { 'properties'?: Array; @@ -6301,6 +6760,25 @@ export interface AutomationRange { 'to': AutomationValue; } +// @public +export interface AutomationRangeCondition { + // (undocumented) + 'range': AutomationRangeConditionRange; +} + +// @public (undocumented) +export interface AutomationRangeConditionRange { + // (undocumented) + 'from': number; + // (undocumented) + 'operator': AutomationRangeConditionRangeOperatorEnum; + // (undocumented) + 'to': number; +} + +// @public (undocumented) +export type AutomationRangeConditionRangeOperatorEnum = 'BETWEEN' | 'NOT_BETWEEN'; + // @public export interface AutomationRangeMeasureValueFilter { // (undocumented) @@ -6437,7 +6915,6 @@ export interface AutomationRelativeDateFilterRelativeDateFilter { 'boundedFilter'?: AutomationBoundedFilter; // (undocumented) 'dataset': AutomationAfmObjectIdentifierDataset; - // Warning: (ae-forgotten-export) The symbol "AutomationRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum" needs to be exported by the entry point index.d.ts 'emptyValueHandling'?: AutomationRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum; 'from': number; 'granularity': AutomationRelativeDateFilterRelativeDateFilterGranularityEnum; @@ -6446,6 +6923,9 @@ export interface AutomationRelativeDateFilterRelativeDateFilter { 'to': number; } +// @public (undocumented) +export type AutomationRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + // @public (undocumented) export type AutomationRelativeDateFilterRelativeDateFilterGranularityEnum = 'MINUTE' | 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR' | 'MINUTE_OF_HOUR' | 'HOUR_OF_DAY' | 'DAY_OF_WEEK' | 'DAY_OF_MONTH' | 'DAY_OF_QUARTER' | 'DAY_OF_YEAR' | 'WEEK_OF_YEAR' | 'MONTH_OF_YEAR' | 'QUARTER_OF_YEAR' | 'FISCAL_MONTH' | 'FISCAL_QUARTER' | 'FISCAL_YEAR'; @@ -6858,12 +7338,9 @@ export interface AutomationSchedule { export interface AutomationSettings { 'delimiter'?: string; 'exportInfo'?: boolean; - // Warning: (ae-forgotten-export) The symbol "AutomationSettingsGrandTotalsPositionEnum" needs to be exported by the entry point index.d.ts 'grandTotalsPosition'?: AutomationSettingsGrandTotalsPositionEnum; 'mergeHeaders'?: boolean; - // Warning: (ae-forgotten-export) The symbol "AutomationSettingsPageOrientationEnum" needs to be exported by the entry point index.d.ts 'pageOrientation'?: AutomationSettingsPageOrientationEnum; - // Warning: (ae-forgotten-export) The symbol "AutomationSettingsPageSizeEnum" needs to be exported by the entry point index.d.ts 'pageSize'?: AutomationSettingsPageSizeEnum; // @deprecated 'pdfPageSize'?: string; @@ -6877,6 +7354,15 @@ export interface AutomationSettings { 'showFilters'?: boolean; } +// @public (undocumented) +export type AutomationSettingsGrandTotalsPositionEnum = 'pinnedBottom' | 'pinnedTop' | 'bottom' | 'top'; + +// @public (undocumented) +export type AutomationSettingsPageOrientationEnum = 'PORTRAIT' | 'LANDSCAPE'; + +// @public (undocumented) +export type AutomationSettingsPageSizeEnum = 'A3' | 'A4' | 'LETTER'; + // @public export interface AutomationSimpleMeasureDefinition { // (undocumented) @@ -7209,10 +7695,33 @@ export interface CertificationApiSetCertificationRequest { readonly workspaceId: string; } +// @public +export interface ChangeAnalysisParams { + 'analyzedPeriod': string; + 'attributes': Array; + // (undocumented) + 'dateAttribute': AfmAttributeItem; + 'filters': Array; + // (undocumented) + 'measure': AfmMeasureItem; + 'measureTitle': string; + 'referencePeriod': string; + 'useSmartAttributeSelection': boolean; +} + +// @public +export interface ChangeAnalysisResponse { + // (undocumented) + 'links': ExecutionLinks; +} + +// @public +export interface ChangeAnalysisResult { + 'data': Array; +} + // @public export interface ChatHistoryInteraction { - // Warning: (ae-forgotten-export) The symbol "ChangeAnalysisParams" needs to be exported by the entry point index.d.ts - // // (undocumented) 'changeAnalysisParams'?: ChangeAnalysisParams; 'chatHistoryInteractionId': string; @@ -7223,8 +7732,6 @@ export interface ChatHistoryInteraction { 'foundObjects'?: FoundObjects; 'interactionFinished': boolean; 'question': string; - // Warning: (ae-forgotten-export) The symbol "Reasoning" needs to be exported by the entry point index.d.ts - // // (undocumented) 'reasoning'?: Reasoning; // (undocumented) @@ -7270,7 +7777,6 @@ export interface ChatRequest { 'limitCreate'?: number; 'limitCreateContext'?: number; 'limitSearch'?: number; - // Warning: (ae-forgotten-export) The symbol "ChatRequestObjectTypesEnum" needs to be exported by the entry point index.d.ts 'objectTypes'?: Array; 'question': string; 'relevantScoreThreshold'?: number; @@ -7281,6 +7787,9 @@ export interface ChatRequest { 'userContext'?: UserContext; } +// @public (undocumented) +export type ChatRequestObjectTypesEnum = 'attribute' | 'metric' | 'fact' | 'label' | 'date' | 'dataset' | 'visualization' | 'dashboard'; + // @public (undocumented) export interface ChatResult { // (undocumented) @@ -7299,9 +7808,7 @@ export interface ChatResult { 'semanticSearch'?: SearchResult; 'textResponse'?: string; 'threadIdSuffix'?: string; - // Warning: (ae-forgotten-export) The symbol "ToolCallEventResult" needs to be exported by the entry point index.d.ts 'toolCallEvents'?: Array; - // Warning: (ae-forgotten-export) The symbol "AiUsageMetadataItem" needs to be exported by the entry point index.d.ts 'usage'?: Array; } @@ -7648,7 +8155,7 @@ export interface ContentSlideTemplate { } // @public -export class ConversationsAi extends BaseAPI implements ConversationsAiInterface { +export class ConversationsAi extends AiBaseAPI implements ConversationsAiInterface { deleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(requestParameters: ConversationsAiDeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDeleteRequest, options?: AxiosRequestConfig): AxiosPromise; getConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(requestParameters: ConversationsAiGetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGetRequest, options?: AxiosRequestConfig): AxiosPromise; getConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(requestParameters: ConversationsAiGetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGetRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -7658,52 +8165,52 @@ export class ConversationsAi extends BaseAPI implements ConversationsAiInterface } // @public -function ConversationsAi_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiDeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDeleteRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiDeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDeleteRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete } export { ConversationsAi_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete as GenAiApi_DeleteConversation } // @public -function ConversationsAi_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiGetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGetRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiGetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGetRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet } export { ConversationsAi_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet as GenAiApi_GetConversation } // @public -function ConversationsAi_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiGetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGetRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiGetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGetRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet } export { ConversationsAi_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet as GenAiApi_GetConversations } // @public -function ConversationsAi_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatchRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatchRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch } export { ConversationsAi_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch as GenAiApi_PatchConversation } // @public -function ConversationsAi_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPostRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPostRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost } export { ConversationsAi_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost as GenAiApi_PostConversations } // @public -function ConversationsAi_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePostRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePostRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost } export { ConversationsAi_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost as GenAiApi_PostGenerateConversationTitle } // @public -export function ConversationsAiAxiosParamCreator_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(workspaceId: string, isPreview?: boolean, page?: number, size?: number, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(workspaceId: string, isPreview?: boolean, page?: number, size?: number, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch(workspaceId: string, conversationId: string, aiConversationUpdateRequest: AiConversationUpdateRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch(workspaceId: string, conversationId: string, aiConversationUpdateRequest: AiConversationUpdateRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost(workspaceId: string, isPreview?: boolean, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost(workspaceId: string, isPreview?: boolean, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public interface ConversationsAiDeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDeleteRequest { @@ -7766,6 +8273,16 @@ interface ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspace export { ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePostRequest } export { ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePostRequest as GenAiApiPostGenerateConversationTitleRequest } +// @public +export interface ConvertGeoFileRequest { + 'location': string; +} + +// @public +export interface ConvertGeoFileResponse { + 'location': string; +} + // @public export class CookieSecurityConfigurationApi extends MetadataBaseApi implements CookieSecurityConfigurationApiInterface { getEntityCookieSecurityConfigurations(requestParameters: CookieSecurityConfigurationApiGetEntityCookieSecurityConfigurationsRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -8452,6 +8969,12 @@ export interface DashboardAttributeFilterAttributeFilter { // @public (undocumented) export type DashboardAttributeFilterAttributeFilterSelectionModeEnum = 'single' | 'multi'; +// @public +export interface DashboardContext { + 'id': string; + 'widgets': Array; +} + // @public (undocumented) export interface DashboardDateFilter { // (undocumented) @@ -11052,7 +11575,7 @@ export interface DependsOnDateFilter { // @public export interface DependsOnMatchFilter { // (undocumented) - 'matchFilter': MatchAttributeFilter_2; + 'matchFilter': AfmMatchAttributeFilter; } // @public @@ -17920,13 +18443,11 @@ export interface GenAiApiTagsRequest { // @public export interface GenAiApiTestLlmProviderByIdRequest { readonly llmProviderId: string; - // Warning: (ae-forgotten-export) The symbol "TestLlmProviderByIdRequest" needs to be exported by the entry point index.d.ts readonly testLlmProviderByIdRequest?: TestLlmProviderByIdRequest; } // @public export interface GenAiApiTestLlmProviderRequest { - // Warning: (ae-forgotten-export) The symbol "TestLlmProviderDefinitionRequest" needs to be exported by the entry point index.d.ts readonly testLlmProviderDefinitionRequest: TestLlmProviderDefinitionRequest; } @@ -17935,6 +18456,21 @@ export type GenAiApiTrendingObjectsRequest = { readonly workspaceId: string; }; +// @public (undocumented) +export interface GenerateDescriptionRequest { + 'objectId': string; + 'objectType': GenerateDescriptionRequestObjectTypeEnum; +} + +// @public (undocumented) +export type GenerateDescriptionRequestObjectTypeEnum = 'Visualization' | 'Dashboard' | 'Metric' | 'Fact' | 'Attribute'; + +// @public (undocumented) +export interface GenerateDescriptionResponse { + 'description'?: string; + 'note'?: string; +} + // @public export interface GenerateLdmRequest { 'aggregatedFactPrefix'?: string; @@ -17984,6 +18520,21 @@ export interface GenerateLogicalDataModelApiInterface { generateLogicalModel(requestParameters: GenerateLogicalDataModelApiGenerateLogicalModelRequest, options?: AxiosRequestConfig): AxiosPromise; } +// @public (undocumented) +export interface GenerateTitleRequest { + 'objectId': string; + 'objectType': GenerateTitleRequestObjectTypeEnum; +} + +// @public (undocumented) +export type GenerateTitleRequestObjectTypeEnum = 'Visualization' | 'Dashboard' | 'Metric' | 'Fact' | 'Attribute'; + +// @public (undocumented) +export interface GenerateTitleResponse { + 'note'?: string; + 'title'?: string; +} + // @public export interface GeoAreaConfig { // (undocumented) @@ -18094,6 +18645,41 @@ export interface GeographicDataApiUpdateEntityCustomGeoCollectionsRequest { readonly jsonApiCustomGeoCollectionInDocument: JsonApiCustomGeoCollectionInDocument; } +// @public +export interface GeoJsonFeature { + // (undocumented) + 'geometry'?: GeoJsonGeometry; + // (undocumented) + 'id'?: object; + // (undocumented) + 'properties': { + [key: string]: object; + }; + // (undocumented) + 'type': string; +} + +// @public +export interface GeoJsonFeatureCollection { + // (undocumented) + 'bbox'?: Array; + // (undocumented) + 'features': Array; + // (undocumented) + 'type': string; +} + +// @public +export interface GeoJsonGeometry { + // (undocumented) + 'coordinates': object; + // (undocumented) + 'type': string; +} + +// @public (undocumented) +export type GetQualityIssuesResponseStatusEnum = 'RUNNING' | 'SYNCING' | 'COMPLETED' | 'FAILED' | 'CANCELLED' | 'NOT_FOUND' | 'DISABLED'; + // @public export interface GrainIdentifier { 'id': string; @@ -18660,6 +19246,13 @@ export interface ILiveFeatures { }; } +// @public +export interface ILocationStyleListItem { + id: string; + link: string; + title: string; +} + // @public export interface ILocationStyleParams { language?: string; @@ -18777,6 +19370,16 @@ export interface ImportCsvResponse { 'version': number; } +// @public +export interface ImportGeoCollectionRequest { + 'location': string; +} + +// @public +export interface ImportGeoCollectionResponse { + 'version': number; +} + // @public export interface InlineFilterDefinition { // (undocumented) @@ -18973,17 +19576,17 @@ function isVisualizationObject_2(visualizationObject: unknown): visualizationObj export function isVisualizationObjectsItem(visualizationObject: unknown): visualizationObject is JsonApiVisualizationObjectOutWithLinks; // @public -export class ItemsAi extends BaseAPI implements ItemsAiInterface { +export class ItemsAi extends AiBaseAPI implements ItemsAiInterface { getConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(requestParameters: ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest, options?: AxiosRequestConfig): AxiosPromise; } // @public -function ItemsAi_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(axios: AxiosInstance, basePath: string, requestParameters: ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ItemsAi_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(axios: AxiosInstance, basePath: string, requestParameters: ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ItemsAi_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet as GenAiApi_GetConversationItems } export { ItemsAi_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet } // @public -export function ItemsAiAxiosParamCreator_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ItemsAiAxiosParamCreator_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public interface ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest { @@ -18998,6 +19601,40 @@ export interface ItemsAiInterface { getConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(requestParameters: ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest, options?: AxiosRequestConfig): AxiosPromise; } +// @public +export interface ITigerAbsoluteDateFilter { + // (undocumented) + absoluteDateFilter: { + dataSet: ObjRef; + from: string; + to: string; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerArithmeticMeasure { + // (undocumented) + alias?: string; + // (undocumented) + definition: ITigerArithmeticMeasureDefinition; + // (undocumented) + format?: string; + // (undocumented) + localIdentifier: string; + // (undocumented) + title?: string; +} + +// @public (undocumented) +export interface ITigerArithmeticMeasureDefinition { + // (undocumented) + arithmeticMeasure: { + measureIdentifiers: string[]; + operator: "sum" | "difference" | "multiplication" | "ratio" | "change"; + }; +} + // @public export interface ITigerAttribute { // (undocumented) @@ -19009,6 +19646,21 @@ export interface ITigerAttribute { }; } +// @public (undocumented) +export type ITigerAttributeElements = ITigerAttributeElementsByRef | ITigerAttributeElementsByValue; + +// @public +export interface ITigerAttributeElementsByRef { + // (undocumented) + uris: Array; +} + +// @public +export interface ITigerAttributeElementsByValue { + // (undocumented) + values: Array; +} + // @public export interface ITigerAttributeFilterConfig { // (undocumented) @@ -19053,14 +19705,24 @@ export interface ITigerAttributeSortItem { }; } +// @public +export interface ITigerBaseWidget { + // (undocumented) + localIdentifier?: string; + // (undocumented) + size?: ITigerDashboardLayoutSize; + // (undocumented) + sizeByScreen?: ITigerDashboardLayoutSizeByScreenSize; + // (undocumented) + type: string; +} + // @public export interface ITigerBucket { // (undocumented) items: ITigerAttributeOrMeasure[]; // (undocumented) localIdentifier?: string; - // Warning: (ae-forgotten-export) The symbol "ITigerTotal" needs to be exported by the entry point index.d.ts - // // (undocumented) totals?: ITigerTotal[]; } @@ -19075,8 +19737,6 @@ export interface ITigerClient extends ITigerClientBase { automation: ReturnType; // (undocumented) declarativeLayout: ReturnType; - // Warning: (ae-forgotten-export) The symbol "tigerEntitiesObjectsClientFactory" needs to be exported by the entry point index.d.ts - // // (undocumented) entities: ReturnType; // (undocumented) @@ -19089,8 +19749,6 @@ export interface ITigerClient extends ITigerClientBase { export: ReturnType; // @beta (undocumented) genAI: ReturnType; - // Warning: (ae-forgotten-export) The symbol "tigerGeoCollectionsClientFactory" needs to be exported by the entry point index.d.ts - // // (undocumented) geoCollections: ReturnType; // (undocumented) @@ -19166,6 +19824,14 @@ export interface ITigerDashboardArbitraryAttributeFilter { }; } +// @public +export interface ITigerDashboardAttributeFilterByDate { + // (undocumented) + filterLocalIdentifier: string; + // (undocumented) + isCommonDate: boolean; +} + // @public export interface ITigerDashboardAttributeFilterConfig { // (undocumented) @@ -19187,6 +19853,16 @@ export interface ITigerDashboardAttributeFilterConfig { title?: string; } +// @public +export interface ITigerDashboardAttributeFilterParent { + // (undocumented) + filterLocalIdentifier: string; + // (undocumented) + over: { + attributes: ObjRef[]; + }; +} + // @public export interface ITigerDashboardDateFilterConfig { // (undocumented) @@ -19215,26 +19891,98 @@ export interface ITigerDashboardDateFilterConfig { mode?: "readonly" | "hidden" | "active"; } +// @public +export interface ITigerDashboardFilterGroup { + // (undocumented) + filters: Array<{ + filterLocalIdentifier: string; + }>; + // (undocumented) + localIdentifier?: string; + // (undocumented) + title: string; +} + // @public export interface ITigerDashboardFilterGroupsConfig { - // Warning: (ae-forgotten-export) The symbol "ITigerDashboardFilterGroup" needs to be exported by the entry point index.d.ts - // // (undocumented) groups: ITigerDashboardFilterGroup[]; } -// Warning: (ae-forgotten-export) The symbol "ITigerWidget" needs to be exported by the entry point index.d.ts -// // @public export interface ITigerDashboardLayout { - // Warning: (ae-forgotten-export) The symbol "ITigerDashboardLayoutSection" needs to be exported by the entry point index.d.ts - // // (undocumented) sections?: Array>; // (undocumented) type: "IDashboardLayout"; } +// @public +export interface ITigerDashboardLayoutColumn { + // (undocumented) + items?: Array>; + // (undocumented) + size?: ITigerDashboardLayoutSize; + // (undocumented) + sizeByScreen?: ITigerDashboardLayoutSizeByScreenSize; + // (undocumented) + type: "IDashboardLayoutColumn"; +} + +// @public +export interface ITigerDashboardLayoutItem { + // (undocumented) + size?: ITigerDashboardLayoutSize; + // (undocumented) + sizeByScreen?: ITigerDashboardLayoutSizeByScreenSize; + // (undocumented) + type: "IDashboardLayoutItem"; + // (undocumented) + widget?: TWidget | ITigerDashboardLayout; +} + +// @public +export interface ITigerDashboardLayoutSection { + // (undocumented) + header?: ITigerDashboardLayoutSectionHeader; + // (undocumented) + items?: Array>; + // (undocumented) + type: "IDashboardLayoutSection"; +} + +// @public +export interface ITigerDashboardLayoutSectionHeader { + // (undocumented) + description?: string; + // (undocumented) + title?: string; +} + +// @public +export interface ITigerDashboardLayoutSize { + // (undocumented) + gridHeight?: number; + // (undocumented) + gridWidth: number; + // (undocumented) + heightAsRatio?: number; +} + +// @public +export interface ITigerDashboardLayoutSizeByScreenSize { + // (undocumented) + lg?: ITigerDashboardLayoutSize; + // (undocumented) + md?: ITigerDashboardLayoutSize; + // (undocumented) + sm?: ITigerDashboardLayoutSize; + // (undocumented) + xl?: ITigerDashboardLayoutSize; + // (undocumented) + xs?: ITigerDashboardLayoutSize; +} + // @public export interface ITigerDashboardMatchAttributeFilter { // (undocumented) @@ -19304,16 +20052,12 @@ export interface ITigerDashboardTab { localIdentifier: string; // (undocumented) measureValueFilterConfigs?: ITigerDashboardMeasureValueFilterConfig[]; + // @alpha + parameters?: ITigerDashboardParameter[]; // (undocumented) title: string; } -// Warning: (ae-forgotten-export) The symbol "ITigerAbsoluteDateFilter" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerRelativeDateFilter" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerPositiveAttributeFilter" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerNegativeAttributeFilter" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerRankingFilter" needs to be exported by the entry point index.d.ts -// // @public export type ITigerFilter = ITigerAbsoluteDateFilter | ITigerRelativeDateFilter | ITigerPositiveAttributeFilter | ITigerNegativeAttributeFilter | ITigerMeasureValueFilter | ITigerRankingFilter | ITigerDashboardArbitraryAttributeFilter | ITigerDashboardMatchAttributeFilter; @@ -19348,14 +20092,67 @@ export interface ITigerInsightParameterValue { value: number; } -// Warning: (ae-forgotten-export) The symbol "ITigerSimpleMeasure" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerArithmeticMeasure" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerPopMeasure" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerPreviousPeriodMeasure" needs to be exported by the entry point index.d.ts -// +// @public +export interface ITigerInsightWidget extends ITigerBaseWidget { + // (undocumented) + description?: string; + // (undocumented) + drills?: any[]; + // (undocumented) + ignoreDashboardFilters?: Array<{ + type: "attributeFilterReference" | "dateFilterReference"; + displayForm?: ObjRef; + dataSet?: ObjRef; + }>; + // (undocumented) + insight: ObjRef; + // (undocumented) + title?: string; + // (undocumented) + type: "insight"; +} + +// @public +export interface ITigerKpiWidget extends ITigerBaseWidget { + // (undocumented) + description?: string; + // (undocumented) + ignoreDashboardFilters?: Array<{ + type: "attributeFilterReference" | "dateFilterReference"; + displayForm?: ObjRef; + dataSet?: ObjRef; + }>; + // (undocumented) + kpi: ObjRef; + // (undocumented) + title?: string; + // (undocumented) + type: "kpi"; +} + +// @public (undocumented) +export type ITigerLocatorItem = ITigerAttributeLocatorItem | ITigerMeasureLocatorItem | ITigerTotalLocatorItem; + // @public export type ITigerMeasure = ITigerSimpleMeasure | ITigerArithmeticMeasure | ITigerPopMeasure | ITigerPreviousPeriodMeasure; +// @public +export interface ITigerMeasureLocatorItem { + // (undocumented) + measureLocatorItem: { + measureIdentifier: string; + }; +} + +// @public +export interface ITigerMeasureSortItem { + // (undocumented) + measureSortItem: { + direction: "asc" | "desc"; + locators: ITigerLocatorItem[]; + }; +} + // @public export interface ITigerMeasureValueFilter { // (undocumented) @@ -19369,6 +20166,75 @@ export interface ITigerMeasureValueFilter { // @public (undocumented) export type ITigerMeasureValueFilterCondition = ITigerComparisonCondition | ITigerRangeCondition | ITigerCompoundCondition; +// @public +export interface ITigerNegativeAttributeFilter { + // (undocumented) + negativeAttributeFilter: { + displayForm: ObjRef; + notIn: ITigerAttributeElements; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerPopMeasure { + // (undocumented) + alias?: string; + // (undocumented) + definition: ITigerPopMeasureDefinition; + // (undocumented) + format?: string; + // (undocumented) + localIdentifier: string; + // (undocumented) + title?: string; +} + +// @public (undocumented) +export interface ITigerPopMeasureDefinition { + // (undocumented) + popMeasure: { + measureIdentifier: string; + popAttribute: ObjRef; + }; +} + +// @public +export interface ITigerPositiveAttributeFilter { + // (undocumented) + positiveAttributeFilter: { + displayForm: ObjRef; + in: ITigerAttributeElements; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerPreviousPeriodMeasure { + // (undocumented) + alias?: string; + // (undocumented) + definition: ITigerPreviousPeriodMeasureDefinition; + // (undocumented) + format?: string; + // (undocumented) + localIdentifier: string; + // (undocumented) + title?: string; +} + +// @public (undocumented) +export interface ITigerPreviousPeriodMeasureDefinition { + // (undocumented) + previousPeriodMeasure: { + measureIdentifier: string; + dateDataSets: Array<{ + dataSet: ObjRef; + periodsAgo: number; + }>; + }; +} + // @public export interface ITigerRangeCondition { // (undocumented) @@ -19390,16 +20256,95 @@ export interface ITigerRangeConditionInCompound { }; } -// Warning: (ae-forgotten-export) The symbol "ITigerMeasureSortItem" needs to be exported by the entry point index.d.ts -// +// @public +export interface ITigerRankingFilter { + // (undocumented) + rankingFilter: { + measure: ObjRef; + attributes?: ObjRef[]; + operator: "TOP" | "BOTTOM"; + value: number; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerRelativeDateFilter { + // (undocumented) + relativeDateFilter: { + dataSet: ObjRef; + granularity: string; + from: number; + to: number; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerRichTextWidget extends ITigerBaseWidget { + // (undocumented) + content?: string; + // (undocumented) + type: "richText"; +} + +// @public +export interface ITigerSimpleMeasure { + // (undocumented) + alias?: string; + // (undocumented) + definition: ITigerSimpleMeasureDefinition; + // (undocumented) + format?: string; + // (undocumented) + localIdentifier: string; + // (undocumented) + title?: string; +} + +// @public (undocumented) +export interface ITigerSimpleMeasureDefinition { + // (undocumented) + measure: { + item: ObjRef; + aggregation?: "sum" | "count" | "avg" | "min" | "max" | "median" | "runsum"; + filters?: ITigerFilter[]; + computeRatio?: boolean; + }; +} + // @public export type ITigerSortItem = ITigerAttributeSortItem | ITigerMeasureSortItem; +// @public +export interface ITigerTotal { + // (undocumented) + alias?: string; + // (undocumented) + attributeIdentifier: string; + // (undocumented) + measureIdentifier: string; + // (undocumented) + type: "sum" | "avg" | "max" | "min" | "nat" | "med"; +} + +// @public +export interface ITigerTotalLocatorItem { + // (undocumented) + totalLocatorItem: { + attributeIdentifier: string; + totalFunction: string; + }; +} + // @public export type ITigerVisualizationProperties = { [key: string]: any; }; +// @public (undocumented) +export type ITigerWidget = ITigerInsightWidget | ITigerKpiWidget | ITigerRichTextWidget; + // @public @deprecated interface ITotalItem { // (undocumented) @@ -25998,7 +26943,7 @@ export interface KeyDriversResult { } // @public -export class KnowledgeAi extends BaseAPI implements KnowledgeAiInterface { +export class KnowledgeAi extends AiBaseAPI implements KnowledgeAiInterface { createDocument(requestParameters: KnowledgeAiCreateDocumentRequest, options?: AxiosRequestConfig): AxiosPromise; createOrgDocument(requestParameters: KnowledgeAiCreateOrgDocumentRequest, options?: AxiosRequestConfig): AxiosPromise; deleteDocument(requestParameters: KnowledgeAiDeleteDocumentRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -26018,128 +26963,128 @@ export class KnowledgeAi extends BaseAPI implements KnowledgeAiInterface { } // @public -function KnowledgeAi_CreateDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiCreateDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_CreateDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiCreateDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_CreateDocument as GenAiApi_CreateKnowledgeDocument } export { KnowledgeAi_CreateDocument } // @public -function KnowledgeAi_CreateOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiCreateOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_CreateOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiCreateOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_CreateOrgDocument as GenAiApi_CreateOrgKnowledgeDocument } export { KnowledgeAi_CreateOrgDocument } // @public -function KnowledgeAi_DeleteDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDeleteDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_DeleteDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDeleteDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_DeleteDocument as GenAiApi_DeleteKnowledgeDocument } export { KnowledgeAi_DeleteDocument } // @public -function KnowledgeAi_DeleteOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDeleteOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_DeleteOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDeleteOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_DeleteOrgDocument as GenAiApi_DeleteOrgKnowledgeDocument } export { KnowledgeAi_DeleteOrgDocument } // @public -export function KnowledgeAi_DownloadDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDownloadDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +export function KnowledgeAi_DownloadDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDownloadDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; // @public -export function KnowledgeAi_DownloadOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDownloadOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +export function KnowledgeAi_DownloadOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDownloadOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; // @public -function KnowledgeAi_GetDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiGetDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_GetDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiGetDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_GetDocument as GenAiApi_GetKnowledgeDocument } export { KnowledgeAi_GetDocument } // @public -function KnowledgeAi_GetOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiGetOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_GetOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiGetOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_GetOrgDocument as GenAiApi_GetOrgKnowledgeDocument } export { KnowledgeAi_GetOrgDocument } // @public -function KnowledgeAi_ListDocuments(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiListDocumentsRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_ListDocuments(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiListDocumentsRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_ListDocuments as GenAiApi_ListKnowledgeDocuments } export { KnowledgeAi_ListDocuments } // @public -function KnowledgeAi_ListOrgDocuments(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiListOrgDocumentsRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_ListOrgDocuments(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiListOrgDocumentsRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_ListOrgDocuments as GenAiApi_ListOrgKnowledgeDocuments } export { KnowledgeAi_ListOrgDocuments } // @public -function KnowledgeAi_PatchDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_PatchDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_PatchDocument as GenAiApi_PatchKnowledgeDocument } export { KnowledgeAi_PatchDocument } // @public -function KnowledgeAi_PatchOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiPatchOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_PatchOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiPatchOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_PatchOrgDocument as GenAiApi_PatchOrgKnowledgeDocument } export { KnowledgeAi_PatchOrgDocument } // @public -function KnowledgeAi_SearchKnowledge(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiSearchKnowledgeRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_SearchKnowledge(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiSearchKnowledgeRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_SearchKnowledge as GenAiApi_SearchKnowledge } export { KnowledgeAi_SearchKnowledge } // @public -function KnowledgeAi_SearchOrgKnowledge(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiSearchOrgKnowledgeRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_SearchOrgKnowledge(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiSearchOrgKnowledgeRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_SearchOrgKnowledge as GenAiApi_SearchOrgKnowledge } export { KnowledgeAi_SearchOrgKnowledge } // @public -function KnowledgeAi_UpsertDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiUpsertDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_UpsertDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiUpsertDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_UpsertDocument as GenAiApi_UpsertKnowledgeDocument } export { KnowledgeAi_UpsertDocument } // @public -function KnowledgeAi_UpsertOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiUpsertOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_UpsertOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiUpsertOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_UpsertOrgDocument as GenAiApi_UpsertOrgKnowledgeDocument } export { KnowledgeAi_UpsertOrgDocument } // @public -export function KnowledgeAiAxiosParamCreator_CreateDocument(workspaceId: string, file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_CreateDocument(workspaceId: string, file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_CreateOrgDocument(file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_CreateOrgDocument(file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_DeleteDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_DeleteDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_DeleteOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_DeleteOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_DownloadDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_DownloadDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_DownloadOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_DownloadOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_GetDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_GetDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_GetOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_GetOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_ListDocuments(workspaceId: string, scopes?: Array, size?: number, pageToken?: string, metaInclude?: string, state?: 'enabled' | 'disabled', query?: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_ListDocuments(workspaceId: string, scopes?: Array, size?: number, pageToken?: string, metaInclude?: string, state?: 'enabled' | 'disabled', query?: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_ListOrgDocuments(scopes?: Array, size?: number, pageToken?: string, metaInclude?: string, state?: 'enabled' | 'disabled', query?: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_ListOrgDocuments(scopes?: Array, size?: number, pageToken?: string, metaInclude?: string, state?: 'enabled' | 'disabled', query?: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_PatchDocument(workspaceId: string, documentId: string, aiPatchDocumentRequest: AiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_PatchDocument(workspaceId: string, documentId: string, aiPatchDocumentRequest: AiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_PatchOrgDocument(documentId: string, aiPatchDocumentRequest: AiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_PatchOrgDocument(documentId: string, aiPatchDocumentRequest: AiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_SearchKnowledge(workspaceId: string, query: string, limit?: number, minScore?: number, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_SearchKnowledge(workspaceId: string, query: string, limit?: number, minScore?: number, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_SearchOrgKnowledge(query: string, limit?: number, minScore?: number, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_SearchOrgKnowledge(query: string, limit?: number, minScore?: number, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_UpsertDocument(workspaceId: string, file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_UpsertDocument(workspaceId: string, file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_UpsertOrgDocument(file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_UpsertOrgDocument(file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public interface KnowledgeAiCreateDocumentRequest { @@ -27302,6 +28247,19 @@ export interface ListLinks { 'self': string; } +// @public (undocumented) +export interface ListLlmProviderModelsRequest { + // (undocumented) + 'providerConfig': TestLlmProviderByIdRequestProviderConfig; +} + +// @public (undocumented) +export interface ListLlmProviderModelsResponse { + 'message': string; + 'models': Array; + 'success': boolean; +} + // @public export class LlmEndpointControllerApi extends MetadataBaseApi implements LlmEndpointControllerApiInterface { // @deprecated @@ -27516,6 +28474,15 @@ export interface LLMEndpointsApiUpdateEntityLlmEndpointsRequest { readonly jsonApiLlmEndpointInDocument: JsonApiLlmEndpointInDocument; } +// @public +export interface LlmModel { + 'family': LlmModelFamilyEnum; + 'id': string; +} + +// @public (undocumented) +export type LlmModelFamilyEnum = 'OPENAI' | 'ANTHROPIC' | 'META' | 'MISTRAL' | 'AMAZON' | 'GOOGLE' | 'COHERE' | 'UNKNOWN'; + // @public (undocumented) export interface LlmProviderAuth { // (undocumented) @@ -27809,6 +28776,9 @@ export interface MatchAttributeFilterMatchAttributeFilter { // @public (undocumented) export type MatchAttributeFilterMatchAttributeFilterMatchTypeEnum = 'STARTS_WITH' | 'ENDS_WITH' | 'CONTAINS'; +// @public +export type MdAutomationAlertCondition = AnomalyDetectionWrapper | ComparisonWrapper | RangeWrapper | RelativeWrapper; + // @public export type MeasureDefinition = ArithmeticMeasureDefinition | InlineMeasureDefinition | PopMeasureDefinition | SimpleMeasureDefinition; @@ -27847,7 +28817,7 @@ export interface MeasureResultHeader { export type MeasureValueCondition = ComparisonCondition | RangeCondition; // @public -export type MeasureValueFilter = AfmComparisonMeasureValueFilter | CompoundMeasureValueFilter_2 | AfmRangeMeasureValueFilter; +export type MeasureValueFilter = AfmComparisonMeasureValueFilter | AfmCompoundMeasureValueFilter | AfmRangeMeasureValueFilter; // @public export class MemoryItemControllerApi extends MetadataBaseApi implements MemoryItemControllerApiInterface { @@ -27977,17 +28947,17 @@ export interface MemoryItemControllerApiUpdateEntityMemoryItemsRequest { } // @public -export class MessagesAi extends BaseAPI implements MessagesAiInterface { +export class MessagesAi extends AiBaseAPI implements MessagesAiInterface { postMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(requestParameters: MessagesAiPostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPostRequest, options?: AxiosRequestConfig): AxiosPromise; } // @public -function MessagesAi_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(axios: AxiosInstance, basePath: string, requestParameters: MessagesAiPostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPostRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function MessagesAi_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(axios: AxiosInstance, basePath: string, requestParameters: MessagesAiPostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPostRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { MessagesAi_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost as GenAiApi_PostMessages } export { MessagesAi_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost } // @public -export function MessagesAiAxiosParamCreator_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(workspaceId: string, conversationId: string, aiSendMessageRequest: AiSendMessageRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function MessagesAiAxiosParamCreator_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(workspaceId: string, conversationId: string, aiSendMessageRequest: AiSendMessageRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public export interface MessagesAiInterface { @@ -28056,6 +29026,9 @@ export type MetadataGetEntitiesColorPaletteParams = { // @internal export type MetadataGetEntitiesFn = (params: P, options: MetadataGetEntitiesOptions) => AxiosPromise; +// @internal (undocumented) +export type MetadataGetEntitiesFnNew = (axios: AxiosInstance, basePath: string, params: P, options: MetadataGetEntitiesOptions) => AxiosPromise; + // @internal export type MetadataGetEntitiesOptions = { headers?: object; @@ -28132,8 +29105,6 @@ export interface MetadataSyncApiMetadataSyncRequest { // @internal export class MetadataUtilities { static filterValidEntities(result: T): T; - // Warning: (ae-forgotten-export) The symbol "MetadataGetEntitiesFnNew" needs to be exported by the entry point index.d.ts - // // (undocumented) static getAllPagesOf: (client: ITigerClientBase, entitiesGet: MetadataGetEntitiesFnNew, params: P, options?: MetadataGetEntitiesOptions) => Promise; static getAllPagesOfParallel: (client: ITigerClientBase, entitiesGet: MetadataGetEntitiesFnNew, params: P, options?: MetadataGetEntitiesOptions) => Promise; @@ -28458,6 +29429,13 @@ export type ModelFileTranslateEnum = 'YES' | 'NO'; // @public (undocumented) export type ModelFileTrgDirEnum = 'LTR' | 'RTL' | 'AUTO'; +// @public +export interface ModelTestResult { + 'message': string; + 'modelId': string; + 'successful': boolean; +} + // @public export interface NegativeAttributeFilter { // (undocumented) @@ -28893,6 +29871,44 @@ export interface ObjectLinksContainer { 'links'?: ObjectLinks; } +// @public (undocumented) +export interface ObjectReference { + 'id': string; + 'type': ObjectReferenceTypeEnum; +} + +// @public (undocumented) +export interface ObjectReferenceGroup { + // (undocumented) + 'context'?: ObjectReference; + 'objects': Array; +} + +// @public (undocumented) +export type ObjectReferenceTypeEnum = 'WIDGET' | 'METRIC' | 'ATTRIBUTE' | 'DASHBOARD'; + +// @public +export interface OGCAPIFeaturesApiGetCollectionItemsRequest { + readonly bbox?: string; + readonly collectionId: string; + readonly limit?: number; + readonly values?: Array; +} + +// @public +export interface OGCAPIFeaturesApiGetCustomCollectionItemsRequest { + readonly bbox?: string; + readonly collectionId: string; + readonly limit?: number; + readonly values?: Array; +} + +// @public +export interface OGCAPIFeaturesApiInterface { + getCollectionItems(requestParameters: OGCAPIFeaturesApiGetCollectionItemsRequest, options?: AxiosRequestConfig): AxiosPromise; + getCustomCollectionItems(requestParameters: OGCAPIFeaturesApiGetCustomCollectionItemsRequest, options?: AxiosRequestConfig): AxiosPromise; +} + // @public (undocumented) export interface OpenAiApiKeyAuth { 'apiKey'?: string | null; @@ -29256,6 +30272,9 @@ export interface OrganizationEntityControllerApiUpdateEntityOrganizationsRequest // @internal export type OrganizationGetEntitiesFn = (params: P, options: AxiosRequestConfig) => AxiosPromise; +// @internal +export type OrganizationGetEntitiesFnNew = (axios: AxiosInstance, basePath: string, params: P, options: AxiosRequestConfig) => AxiosPromise; + // @internal export type OrganizationGetEntitiesParams = EntitiesApiGetAllEntitiesAttributesRequest | EntitiesApiGetAllEntitiesFactsRequest | EntitiesApiGetAllEntitiesAnalyticalDashboardsRequest | EntitiesApiGetAllEntitiesDashboardPluginsRequest | EntitiesApiGetAllEntitiesVisualizationObjectsRequest | EntitiesApiGetAllEntitiesMetricsRequest | EntitiesApiGetAllEntitiesWorkspacesRequest | EntitiesApiGetAllEntitiesExportDefinitionsRequest; @@ -29373,13 +30392,45 @@ export interface OrganizationSettingControllerApiUpdateEntityOrganizationSetting // @internal export class OrganizationUtilities { - // Warning: (ae-forgotten-export) The symbol "OrganizationGetEntitiesFnNew" needs to be exported by the entry point index.d.ts - // // (undocumented) static getAllPagesOf: (client: ITigerClientBase, entitiesGet: OrganizationGetEntitiesFnNew, params: P, options?: AxiosRequestConfig) => Promise; static mergeEntitiesResults(pages: T[]): T; } +// @public (undocumented) +export interface OutlierDetectionRequest { + 'attributes': Array; + 'auxMeasures'?: Array; + 'filters': Array; + 'granularity': OutlierDetectionRequestGranularityEnum; + // (undocumented) + 'measures': Array; + 'sensitivity': OutlierDetectionRequestSensitivityEnum; +} + +// @public +export type OutlierDetectionRequestFiltersInner = AbstractMeasureValueFilter | AfmFilterDefinitionForSimpleMeasure | AfmInlineFilterDefinition; + +// @public (undocumented) +export type OutlierDetectionRequestGranularityEnum = 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR'; + +// @public (undocumented) +export type OutlierDetectionRequestSensitivityEnum = 'LOW' | 'MEDIUM' | 'HIGH'; + +// @public (undocumented) +export interface OutlierDetectionResponse { + // (undocumented) + 'links': ExecutionLinks; +} + +// @public (undocumented) +export interface OutlierDetectionResult { + 'attribute': Array | null; + 'values': { + [key: string]: Array | null; + } | null; +} + // @public (undocumented) export interface Over { // (undocumented) @@ -29544,6 +30595,15 @@ export interface ParameterItem { 'value': string; } +// @public +interface ParameterItem_2 { + // (undocumented) + 'parameter': AfmAfmObjectIdentifierParameter; + 'value': string; +} +export { ParameterItem_2 as AfmParameterItem } +export { ParameterItem_2 as LabelElementsParameterItem } + // @public export class ParametersApi extends MetadataBaseApi implements ParametersApiInterface { createEntityParameters(requestParameters: ParametersApiCreateEntityParametersRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -30138,6 +31198,9 @@ export type ProfileApiInterface = { getCurrentWithDetails: () => Promise; }; +// @public (undocumented) +export type QualityIssueSeverityEnum = 'WARNING' | 'INFO'; + // @public (undocumented) interface Range_2 { // (undocumented) @@ -30319,6 +31382,18 @@ export interface ReadCsvFileManifestsResponse { 'version': number; } +// @public +export interface Reasoning { + 'answer'?: string; + 'steps': Array; +} + +// @public +export interface ReasoningStep { + 'thoughts': Array; + 'title': string; +} + // @public export interface ReferenceIdentifier { 'id': string; @@ -30451,6 +31526,23 @@ export interface ResolvedLlmEndpoints { 'data': Array; } +// @public (undocumented) +export interface ResolvedLlmProvider { + 'id': string; + // (undocumented) + 'models': Array; + 'title': string; +} + +// @public (undocumented) +export interface ResolvedLlms { + // (undocumented) + 'data'?: ResolvedLlmsData; +} + +// @public +export type ResolvedLlmsData = ResolvedLlmEndpoint | ResolvedLlmProvider; + // @public export interface ResolvedSetting { 'content'?: object | null; @@ -30468,26 +31560,26 @@ export interface ResolveSettingsRequest { } // @public -export class ResponsesAi extends BaseAPI implements ResponsesAiInterface { +export class ResponsesAi extends AiBaseAPI implements ResponsesAiInterface { getConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(requestParameters: ResponsesAiGetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGetRequest, options?: AxiosRequestConfig): AxiosPromise; patchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(requestParameters: ResponsesAiPatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatchRequest, options?: AxiosRequestConfig): AxiosPromise; } // @public -function ResponsesAi_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(axios: AxiosInstance, basePath: string, requestParameters: ResponsesAiGetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGetRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ResponsesAi_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(axios: AxiosInstance, basePath: string, requestParameters: ResponsesAiGetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGetRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ResponsesAi_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet as GenAiApi_GetConversationResponses } export { ResponsesAi_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet } // @public -function ResponsesAi_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(axios: AxiosInstance, basePath: string, requestParameters: ResponsesAiPatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatchRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ResponsesAi_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(axios: AxiosInstance, basePath: string, requestParameters: ResponsesAiPatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatchRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ResponsesAi_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch as GenAiApi_PatchConversationResponse } export { ResponsesAi_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch } // @public -export function ResponsesAiAxiosParamCreator_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ResponsesAiAxiosParamCreator_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ResponsesAiAxiosParamCreator_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(workspaceId: string, conversationId: string, responseId: string, aiResponseFeedbackRequest: AiResponseFeedbackRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ResponsesAiAxiosParamCreator_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(workspaceId: string, conversationId: string, responseId: string, aiResponseFeedbackRequest: AiResponseFeedbackRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public interface ResponsesAiGetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGetRequest { @@ -30525,16 +31617,10 @@ export interface RestApiIdentifier { export interface ResultActionsApiInterface { analyzeCsv(requestParameters: ActionsApiAnalyzeCsvRequest, options?: AxiosRequestConfig): AxiosPromise>; collectCacheUsage(options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiConvertGeoFileRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ConvertGeoFileResponse" needs to be exported by the entry point index.d.ts convertGeoFile(requestParameters: ActionsApiConvertGeoFileRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiCustomGeoCollectionStagingUploadRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "UploadGeoCollectionFileResponse" needs to be exported by the entry point index.d.ts customGeoCollectionStagingUpload(requestParameters: ActionsApiCustomGeoCollectionStagingUploadRequest, options?: AxiosRequestConfig): AxiosPromise; deleteFiles(requestParameters: ActionsApiDeleteFilesRequest, options?: AxiosRequestConfig): AxiosPromise; importCsv(requestParameters: ActionsApiImportCsvRequest, options?: AxiosRequestConfig): AxiosPromise>; - // Warning: (ae-forgotten-export) The symbol "ActionsApiImportCustomGeoCollectionRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ImportGeoCollectionResponse" needs to be exported by the entry point index.d.ts importCustomGeoCollection(requestParameters: ActionsApiImportCustomGeoCollectionRequest, options?: AxiosRequestConfig): AxiosPromise; listFiles(requestParameters: ActionsApiListFilesRequest, options?: AxiosRequestConfig): AxiosPromise>; readCsvFileManifests(requestParameters: ActionsApiReadCsvFileManifestsRequest, options?: AxiosRequestConfig): AxiosPromise>; @@ -30643,8 +31729,6 @@ export interface ScanModelActionsApiInterface { getDataSourceSchemata(requestParameters: ActionsApiGetDataSourceSchemataRequest, options?: AxiosRequestConfig): AxiosPromise; scanDataSource(requestParameters: ActionsApiScanDataSourceRequest, options?: AxiosRequestConfig): AxiosPromise; scanSql(requestParameters: ActionsApiScanSqlRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiScanStatisticsRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "TableStatisticsResponse" needs to be exported by the entry point index.d.ts scanStatistics(requestParameters: ActionsApiScanStatisticsRequest, options?: AxiosRequestConfig): AxiosPromise; testDataSource(requestParameters: ActionsApiTestDataSourceRequest, options?: AxiosRequestConfig): AxiosPromise; testDataSourceDefinition(requestParameters: ActionsApiTestDataSourceDefinitionRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -30661,6 +31745,17 @@ export class ScanModelBaseApi { protected configuration: ScanModelConfiguration | undefined; } +// @public (undocumented) +export interface ScanModelColumnStatisticsEntry { + // (undocumented) + 'columnName': string; + 'dataSize'?: number; + 'max'?: string; + 'min'?: string; + 'ndv'?: number; + 'nullCount'?: number; +} + // @public (undocumented) export class ScanModelConfiguration { constructor(param?: ScanModelConfigurationParameters); @@ -30731,6 +31826,18 @@ export interface ScanModelRequestArgs { url: string; } +// @public (undocumented) +export interface ScanModelTableStatisticsEntry { + // (undocumented) + 'columns': Array; + 'dataSize'?: number; + 'rowCount'?: number; + // (undocumented) + 'schemaName': string; + // (undocumented) + 'tableName': string; +} + // @public export interface ScanRequest { 'scanTables': boolean; @@ -31109,6 +32216,30 @@ export interface TableStatisticsEntry { 'tableName': string; } +// @public (undocumented) +export interface TableStatisticsRequest { + // (undocumented) + 'schemata': Array; + // (undocumented) + 'tableNames'?: Array; +} + +// @public (undocumented) +export interface TableStatisticsResponse { + // (undocumented) + 'tables': Array; + // (undocumented) + 'warnings': Array; +} + +// @public (undocumented) +export interface TableStatisticsWarning { + // (undocumented) + 'message': string; + // (undocumented) + 'tableName'?: string; +} + // @public export interface TableWarning { // (undocumented) @@ -31205,6 +32336,30 @@ export interface TestDefinitionRequest { // @public (undocumented) export type TestDefinitionRequestTypeEnum = 'POSTGRESQL' | 'REDSHIFT' | 'VERTICA' | 'SNOWFLAKE' | 'ADS' | 'BIGQUERY' | 'MSSQL' | 'PRESTO' | 'DREMIO' | 'DRILL' | 'GREENPLUM' | 'AZURESQL' | 'SYNAPSESQL' | 'DATABRICKS' | 'GDSTORAGE' | 'CLICKHOUSE' | 'MYSQL' | 'MARIADB' | 'ORACLE' | 'PINOT' | 'SINGLESTORE' | 'MOTHERDUCK' | 'FLEXCONNECT' | 'STARROCKS' | 'ATHENA' | 'MONGODB' | 'CRATEDB' | 'AILAKEHOUSE'; +// @public (undocumented) +export interface TestLlmProviderByIdRequest { + 'models'?: Array; + // (undocumented) + 'providerConfig'?: TestLlmProviderByIdRequestProviderConfig; +} + +// @public +export type TestLlmProviderByIdRequestProviderConfig = AfmAwsBedrockProviderConfig | AfmAzureFoundryProviderConfig | AfmOpenAIProviderConfig; + +// @public (undocumented) +export interface TestLlmProviderDefinitionRequest { + 'models'?: Array; + // (undocumented) + 'providerConfig': TestLlmProviderByIdRequestProviderConfig; +} + +// @public (undocumented) +export interface TestLlmProviderResponse { + 'modelResults': Array; + 'providerMessage': string; + 'providerReachable': boolean; +} + // @public export interface TestQueryDuration { 'createCacheTable'?: number; @@ -31329,6 +32484,11 @@ export interface ThemeControllerApiUpdateEntityThemesRequest { readonly jsonApiThemeInDocument: JsonApiThemeInDocument; } +// @public +export interface Thought { + 'text': string; +} + // @public (undocumented) export const tigerActionsClientFactory: (axios: AxiosInstance) => ActionsApiInterface; @@ -31347,6 +32507,9 @@ export const tigerClientBaseFactory: (axios: AxiosInstance, basePath?: string) = // @public @deprecated export const tigerClientFactory: (axios: AxiosInstance) => ITigerClient; +// @public (undocumented) +export const tigerEntitiesObjectsClientFactory: (axios: AxiosInstance) => EntitiesApiInterface; + // @public export const tigerExecutionClientFactory: (axios: AxiosInstance) => Pick; @@ -31359,6 +32522,9 @@ export const tigerExportClientFactory: (axios: AxiosInstance) => ActionsExportIn // @public export const tigerGenAIClientFactory: (axios: AxiosInstance) => Pick; +// @public (undocumented) +export const tigerGeoCollectionsClientFactory: (axios: AxiosInstance) => OGCAPIFeaturesApiInterface; + // @public (undocumented) export const tigerLabelElementsClientFactory: (axios: AxiosInstance) => Pick; @@ -31389,6 +32555,13 @@ export const tigerValidDescendantsClientFactory: (axios: AxiosInstance) => Pick< // @public (undocumented) export const tigerValidObjectsClientFactory: (axios: AxiosInstance) => Pick; +// @public +export interface ToolCallEventResult { + 'functionArguments': string; + 'functionName': string; + 'result': string; +} + // @public export interface Total { 'function': TotalFunctionEnum; @@ -31485,11 +32658,54 @@ export interface TranslationsApiSetTranslationsRequest { readonly xliff: Xliff; } +// @public +export interface TrendingObjectItem { + 'createdAt'?: string; + 'createdBy'?: string; + 'datasetId'?: string; + 'datasetTitle'?: string; + 'datasetType'?: string; + 'description'?: string; + 'id': string; + 'isHidden'?: boolean; + 'isHiddenFromKda'?: boolean; + 'metricType'?: string; + 'modifiedAt'?: string; + 'modifiedBy'?: string; + // (undocumented) + 'tags': Array; + 'title': string; + 'type': string; + 'usageCount': number; + 'visualizationUrl'?: string; + 'workspaceId': string; +} + +// @public (undocumented) +export interface TrendingObjectsResult { + // (undocumented) + 'objects': Array; +} + +// @public (undocumented) +export type TriggerQualityIssuesCalculationResponseStatusEnum = 'RUNNING' | 'COMPLETED' | 'FAILED' | 'CANCELLED' | 'DISABLED'; + +// @public +export interface UIContext { + // (undocumented) + 'dashboard'?: DashboardContext; +} + // @public export interface UploadFileResponse { 'location': string; } +// @public +export interface UploadGeoCollectionFileResponse { + 'location': string; +} + // @public export class UsageApi extends MetadataBaseApi implements UsageApiInterface { allPlatformUsage(options?: AxiosRequestConfig): AxiosPromise; @@ -31531,10 +32747,7 @@ export interface UserAssignee { export interface UserContext { // (undocumented) 'activeObject'?: ActiveObjectIdentification; - // Warning: (ae-forgotten-export) The symbol "ObjectReferenceGroup" needs to be exported by the entry point index.d.ts 'referencedObjects'?: Array; - // Warning: (ae-forgotten-export) The symbol "UIContext" needs to be exported by the entry point index.d.ts - // // (undocumented) 'view'?: UIContext; } @@ -33163,6 +34376,13 @@ export interface VisualizationObjectControllerApiUpdateEntityVisualizationObject readonly workspaceId: string; } +// @public (undocumented) +export interface VisualizationObjectExecution { + 'filters'?: Array; + // (undocumented) + 'settings'?: AfmExecutionSettings; +} + declare namespace VisualizationObjectModelV1 { export { isVisualizationObject, @@ -33187,17 +34407,17 @@ declare namespace VisualizationObjectModelV2 { export { VisualizationObjectModelV2 } // @public -export class VisualizationsAi extends BaseAPI implements VisualizationsAiInterface { +export class VisualizationsAi extends AiBaseAPI implements VisualizationsAiInterface { patchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(requestParameters: VisualizationsAiPatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatchRequest, options?: AxiosRequestConfig): AxiosPromise; } // @public -function VisualizationsAi_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(axios: AxiosInstance, basePath: string, requestParameters: VisualizationsAiPatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatchRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function VisualizationsAi_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(axios: AxiosInstance, basePath: string, requestParameters: VisualizationsAiPatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatchRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { VisualizationsAi_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch as GenAiApi_PatchVisualization } export { VisualizationsAi_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch } // @public -export function VisualizationsAiAxiosParamCreator_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(workspaceId: string, conversationId: string, visualizationId: string, aiVisualizationIdUpdateRequest: AiVisualizationIdUpdateRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function VisualizationsAiAxiosParamCreator_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(workspaceId: string, conversationId: string, visualizationId: string, aiVisualizationIdUpdateRequest: AiVisualizationIdUpdateRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public export interface VisualizationsAiInterface { @@ -33246,6 +34466,18 @@ export interface WhatIfScenarioItem { 'label': string; } +// @public +export interface WidgetDescriptor { + // (undocumented) + 'filters'?: Array; + // (undocumented) + 'title': string; + // (undocumented) + 'widgetId': string; + // (undocumented) + 'widgetType': string; +} + // @public export interface WidgetSlidesTemplate { 'appliedOn': Array; @@ -33256,6 +34488,46 @@ export interface WidgetSlidesTemplate { // @public (undocumented) export type WidgetSlidesTemplateAppliedOnEnum = 'PDF' | 'PPTX'; +// @public (undocumented) +export interface WorkflowDashboardSummaryRequestDto { + // (undocumented) + 'customUserPrompt'?: string; + // (undocumented) + 'dashboardId': string; + // (undocumented) + 'keyMetricIds'?: Array; + // (undocumented) + 'referenceQuarter'?: string; +} + +// @public (undocumented) +export interface WorkflowDashboardSummaryResponseDto { + // (undocumented) + 'message': string; + // (undocumented) + 'runId': string; + // (undocumented) + 'status': string; +} + +// @public (undocumented) +export interface WorkflowStatusResponseDto { + // (undocumented) + 'currentPhase'?: string; + // (undocumented) + 'error'?: string; + // (undocumented) + 'message': string; + // (undocumented) + 'result'?: { + [key: string]: object; + }; + // (undocumented) + 'runId': string; + // (undocumented) + 'status': string; +} + // @public (undocumented) export interface WorkspaceAutomationIdentifier { // (undocumented) @@ -34290,10 +35562,4 @@ export interface Xliff { 'version'?: string; } -// Warnings were encountered during analysis: -// -// esm/gd-tiger-model/TigerTypes.d.ts:681:9 - (ae-forgotten-export) The symbol "ITigerDashboardAttributeFilterParent" needs to be exported by the entry point index.d.ts -// esm/gd-tiger-model/TigerTypes.d.ts:682:9 - (ae-forgotten-export) The symbol "ITigerDashboardAttributeFilterByDate" needs to be exported by the entry point index.d.ts -// esm/locationStyle.d.ts:44:5 - (ae-forgotten-export) The symbol "ILocationStyleListItem" needs to be exported by the entry point index.d.ts - ``` diff --git a/libs/api-client-tiger/package.json b/libs/api-client-tiger/package.json index a7bbd0e76d0..217afa149a2 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "API Client for GoodData Cloud and GoodData.CN", "license": "MIT", "author": "GoodData", @@ -50,7 +50,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/api-client-tiger/src/endpoints/entitiesObjects/index.ts b/libs/api-client-tiger/src/endpoints/entitiesObjects/index.ts index ba257158142..ebcecf7c829 100644 --- a/libs/api-client-tiger/src/endpoints/entitiesObjects/index.ts +++ b/libs/api-client-tiger/src/endpoints/entitiesObjects/index.ts @@ -51,6 +51,7 @@ export { FilterContextApi_CreateEntityFilterContexts, FilterContextApi_GetEntityFilterContexts, FilterContextApi_UpdateEntityFilterContexts, + FilterContextApi_DeleteEntityFilterContexts, type FilterContextApiCreateEntityFilterContextsRequest, type FilterContextApiGetEntityFilterContextsRequest, type FilterContextApiUpdateEntityFilterContextsRequest, diff --git a/libs/api-client-tiger/src/gd-tiger-model/TigerTypes.ts b/libs/api-client-tiger/src/gd-tiger-model/TigerTypes.ts index 0808841a1e6..adcfb0db396 100644 --- a/libs/api-client-tiger/src/gd-tiger-model/TigerTypes.ts +++ b/libs/api-client-tiger/src/gd-tiger-model/TigerTypes.ts @@ -891,4 +891,9 @@ export interface ITigerDashboardTab { attributeFilterConfigs?: ITigerDashboardAttributeFilterConfig[]; measureValueFilterConfigs?: ITigerDashboardMeasureValueFilterConfig[]; filterGroupsConfig?: ITigerDashboardFilterGroupsConfig; + /** + * Tab-scoped parameter overrides. + * @alpha + */ + parameters?: ITigerDashboardParameter[]; } diff --git a/libs/api-client-tiger/src/generated/ai-json-api/api.ts b/libs/api-client-tiger/src/generated/ai-json-api/api.ts index a4c88966c05..9ee5af69efe 100644 --- a/libs/api-client-tiger/src/generated/ai-json-api/api.ts +++ b/libs/api-client-tiger/src/generated/ai-json-api/api.ts @@ -160,6 +160,10 @@ export interface AiConversationResponse { * Whether this is a preview conversation. */ 'isPreview'?: boolean; + /** + * Whether this conversation is pinned by the user. + */ + 'pinned'?: boolean; /** * Conversation creation timestamp (ISO-8601 UTC). */ @@ -199,6 +203,7 @@ export interface AiConversationTurnResponse { */ export interface AiConversationUpdateRequest { 'title'?: string | null; + 'pinned'?: boolean | null; } export interface AiDateFilterAbsolute { diff --git a/libs/api-client-tiger/src/generated/ai-json-api/openapi-spec.json b/libs/api-client-tiger/src/generated/ai-json-api/openapi-spec.json index 6e8da6bf6c9..28be123a7e4 100644 --- a/libs/api-client-tiger/src/generated/ai-json-api/openapi-spec.json +++ b/libs/api-client-tiger/src/generated/ai-json-api/openapi-spec.json @@ -2219,6 +2219,12 @@ "description": "Whether this is a preview conversation.", "default": false }, + "pinned": { + "type": "boolean", + "title": "Pinned", + "description": "Whether this conversation is pinned by the user.", + "default": false + }, "createdAt": { "type": "string", "title": "Createdat", @@ -2324,6 +2330,17 @@ } ], "title": "Title" + }, + "pinned": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Pinned" } }, "type": "object", diff --git a/libs/api-client-tiger/src/index.ts b/libs/api-client-tiger/src/index.ts index 746f09bc158..0a6085afc4c 100644 --- a/libs/api-client-tiger/src/index.ts +++ b/libs/api-client-tiger/src/index.ts @@ -54,9 +54,13 @@ export { export { Configuration as LabelElementsConfiguration, type ConfigurationParameters as LabelElementsConfigurationParameters, + type ParameterItem as LabelElementsParameterItem, } from "./generated/afm-rest-api/index.js"; -export type { ActionsApiInterface as ResultActionsApiInterface } from "./generated/result-json-api/index.js"; +export type { + ActionsApiInterface as ResultActionsApiInterface, + OGCAPIFeaturesApiInterface, +} from "./generated/result-json-api/index.js"; // ----------------------------------------------------------------------------- // Specific API Interfaces @@ -66,6 +70,7 @@ export { type LocationStyleApiInterface, type LocationStyleDocument, type ILocationStyleParams, + type ILocationStyleListItem, tigerLocationStyleClientFactory, } from "./locationStyle.js"; @@ -84,7 +89,7 @@ export { // Client Factories // ----------------------------------------------------------------------------- -// export { tigerEntitiesObjectsClientFactory } from "./entitiesObjects.js"; +export { tigerEntitiesObjectsClientFactory } from "./entitiesObjects.js"; export { tigerClientBaseFactory, type ITigerClient, type ITigerClientBase, tigerClientFactory }; export { tigerActionsClientFactory } from "./actions.js"; @@ -96,7 +101,7 @@ export { tigerExecutionResultClientFactory } from "./executionResult.js"; export { tigerExportClientFactory } from "./export.js"; export { tigerLabelElementsClientFactory } from "./labelElements.js"; export { tigerLayoutClientFactory } from "./layout.js"; -export { tigerResultClientFactory } from "./result.js"; +export { tigerResultClientFactory, tigerGeoCollectionsClientFactory } from "./result.js"; export { tigerScanModelClientFactory } from "./scanModel.js"; export { tigerSmartFunctionsClientFactory } from "./smartFunctions.js"; export { tigerUserManagementClientFactory } from "./userManagement.js"; @@ -108,9 +113,14 @@ export { tigerValidObjectsClientFactory } from "./validObjects.js"; // ----------------------------------------------------------------------------- export * from "./generated/ai-json-api/api.js"; + +export { BaseAPI as AiBaseAPI, type RequestArgs as AiRequestArgs } from "./generated/ai-json-api/base.js"; export { tigerGenAIClientFactory } from "./genAI.js"; export * from "./endpoints/genAI/index.js"; - +export type { + Configuration as AiConfiguration, + ConfigurationParameters as AiConfigurationParameters, +} from "./generated/ai-json-api/configuration.js"; // ----------------------------------------------------------------------------- // GD Tiger Model // ----------------------------------------------------------------------------- @@ -148,6 +158,41 @@ export type { ITigerInsightLayerDefinition, ITigerInsightParameterValue, ITigerMeasure, + ITigerSimpleMeasure, + ITigerSimpleMeasureDefinition, + ITigerArithmeticMeasure, + ITigerArithmeticMeasureDefinition, + ITigerPopMeasure, + ITigerPopMeasureDefinition, + ITigerPreviousPeriodMeasure, + ITigerPreviousPeriodMeasureDefinition, + ITigerTotal, + ITigerAbsoluteDateFilter, + ITigerRelativeDateFilter, + ITigerPositiveAttributeFilter, + ITigerNegativeAttributeFilter, + ITigerRankingFilter, + ITigerMeasureSortItem, + ITigerWidget, + ITigerDashboardLayoutSection, + ITigerDashboardFilterGroup, + ITigerDashboardAttributeFilterParent, + ITigerDashboardAttributeFilterByDate, + ITigerAttributeElements, + ITigerLocatorItem, + ITigerInsightWidget, + ITigerKpiWidget, + ITigerRichTextWidget, + ITigerDashboardLayoutSectionHeader, + ITigerDashboardLayoutColumn, + ITigerAttributeElementsByRef, + ITigerAttributeElementsByValue, + ITigerMeasureLocatorItem, + ITigerTotalLocatorItem, + ITigerBaseWidget, + ITigerDashboardLayoutSize, + ITigerDashboardLayoutSizeByScreenSize, + ITigerDashboardLayoutItem, ITigerMeasureValueFilter, ITigerMeasureValueFilterCondition, ITigerRangeCondition, @@ -184,6 +229,18 @@ export { export { newAxios, setAxiosAuthorizationToken, setGlobalAuthorizationToken }; export type { + GeoAreaConfig as AfmGeoAreaConfig, + MatchAttributeFilter as AfmMatchAttributeFilter, + CompoundMeasureValueFilter as AfmCompoundMeasureValueFilter, + AbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum as AfmAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum, + ParameterItem as AfmParameterItem, + AllTimeDateFilter as AfmAllTimeDateFilter, + GeoCollectionIdentifier as AfmGeoCollectionIdentifier, + AfmObjectIdentifierParameter as AfmAfmObjectIdentifierParameter, + MatchAttributeFilterMatchAttributeFilter as AfmMatchAttributeFilterMatchAttributeFilter, + GeoCollectionIdentifierKindEnum as AfmGeoCollectionIdentifierKindEnum, + AllTimeDateFilterAllTimeDateFilter as AfmAllTimeDateFilterAllTimeDateFilter, + AfmObjectIdentifierParameterIdentifier as AfmAfmObjectIdentifierParameterIdentifier, AFM as AfmModel, AfmIdentifier as AfmModelIdentifier, AfmLocalIdentifier as AfmModelLocalIdentifier, @@ -425,13 +482,98 @@ export type { SearchRequestObjectTypesEnum, CreatedVisualizationVisualizationTypeEnum, MetricAggFunctionEnum, + AfmObjectIdentifierParameterIdentifierTypeEnum as AfmAfmObjectIdentifierParameterIdentifierTypeEnum, + AllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum as AfmAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum, + AllTimeDateFilterAllTimeDateFilterGranularityEnum as AfmAllTimeDateFilterAllTimeDateFilterGranularityEnum, + CompoundMeasureValueFilterCompoundMeasureValueFilter as AfmCompoundMeasureValueFilterCompoundMeasureValueFilter, + MatchAttributeFilterMatchAttributeFilterMatchTypeEnum as AfmMatchAttributeFilterMatchAttributeFilterMatchTypeEnum, + RelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum as AfmRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum, + OutlierDetectionRequestFiltersInner, + ChangeAnalysisParams, + Reasoning, + ChatRequestObjectTypesEnum, + ToolCallEventResult, + AiUsageMetadataItem, + GetQualityIssuesResponseStatusEnum, + QualityIssueSeverityEnum, + TriggerQualityIssuesCalculationResponseStatusEnum, + UIContext, + ObjectReferenceGroup, + ListLlmProviderModelsResponse, + ListLlmProviderModelsRequest, + TestLlmProviderDefinitionRequest, + TestLlmProviderByIdRequest, + ActionsApiCancelWorkflowRequest, + ActionsApiChangeAnalysisRequest, + ChangeAnalysisResponse, + ActionsApiChangeAnalysisResultRequest, + ChangeAnalysisResult, + ActionsApiComputeReportForVisualizationObjectRequest, + ActionsApiGenerateDashboardSummaryRequest, + WorkflowDashboardSummaryResponseDto, + ActionsApiGenerateDescriptionRequest, + GenerateDescriptionResponse, + ActionsApiGenerateTitleRequest, + GenerateTitleResponse, + ActionsApiGetWorkflowStatusRequest, + WorkflowStatusResponseDto, + ActionsApiOutlierDetectionRequest, + OutlierDetectionResponse, + ActionsApiOutlierDetectionResultRequest, + OutlierDetectionResult, + ActionsApiResolveLlmProvidersRequest, + ResolvedLlms, + ActionsApiRetrieveResultBinaryRequest, + TestLlmProviderResponse, + ActionsApiTrendingObjectsRequest, + TrendingObjectsResult, + MeasureValueCondition as AfmMeasureValueCondition, + TestLlmProviderByIdRequestProviderConfig, + LlmModel, + ObjectReference, + ReasoningStep, + ResolvedLlmsData, + ModelTestResult, + TrendingObjectItem, + DashboardContext, + VisualizationObjectExecution, + WorkflowDashboardSummaryRequestDto, + GenerateDescriptionRequest, + GenerateTitleRequest, + OutlierDetectionRequest, + WidgetDescriptor, + GenerateDescriptionRequestObjectTypeEnum, + GenerateTitleRequestObjectTypeEnum, + LlmModelFamilyEnum, + ComparisonCondition as AfmComparisonCondition, + RangeCondition as AfmRangeCondition, + ObjectReferenceTypeEnum, + OutlierDetectionRequestSensitivityEnum, + OutlierDetectionRequestGranularityEnum, + Thought, + ResolvedLlmProvider, + AwsBedrockProviderConfig as AfmAwsBedrockProviderConfig, + AzureFoundryProviderConfig as AfmAzureFoundryProviderConfig, + OpenAIProviderConfig as AfmOpenAIProviderConfig, + AwsBedrockAccessKeyAuth as AfmAwsBedrockAccessKeyAuth, + AwsBedrockProviderConfigTypeEnum as AfmAwsBedrockProviderConfigTypeEnum, + AzureFoundryApiKeyAuth as AfmAzureFoundryApiKeyAuth, + AzureFoundryProviderConfigTypeEnum as AfmAzureFoundryProviderConfigTypeEnum, + ComparisonConditionComparison as AfmComparisonConditionComparison, + OpenAiApiKeyAuth as AfmOpenAiApiKeyAuth, + OpenAIProviderConfigTypeEnum as AfmOpenAIProviderConfigTypeEnum, + RangeConditionRange as AfmRangeConditionRange, + AwsBedrockAccessKeyAuthTypeEnum as AfmAwsBedrockAccessKeyAuthTypeEnum, + AzureFoundryApiKeyAuthTypeEnum as AfmAzureFoundryApiKeyAuthTypeEnum, + ComparisonConditionComparisonOperatorEnum as AfmComparisonConditionComparisonOperatorEnum, + OpenAiApiKeyAuthTypeEnum as AfmOpenAiApiKeyAuthTypeEnum, + RangeConditionRangeOperatorEnum as AfmRangeConditionRangeOperatorEnum, } from "./generated/afm-rest-api/api.js"; export type { ActionsApiInterface as AuthActionsApiInterface, ActionsApiProcessInvitationRequest, Invitation, } from "./generated/auth-json-api/api.js"; -// export { ActionsApiFactory as AuthActionsApiFactory } from "./generated/auth-json-api/api.js"; export { type ConfigurationParameters, Configuration } from "./generated/auth-json-api/configuration.js"; export type { AutomationNotificationFilter, @@ -631,21 +773,49 @@ export type { AutomationRelativeBoundedDateFilterGranularityEnum, AutomationRelativeDateFilterRelativeDateFilterGranularityEnum, AutomationsAutomation, - //AutomationsAutomationFactory, - // AutomationsAutomationAxiosParamCreator, - // AutomationsAutomationFp, AutomationSlidesExportRequestFormatEnum, AutomationSmtpPortEnum, AutomationSmtpTypeEnum, AutomationTabularExportRequestFormatEnum, AutomationWebhookTypeEnum, AutomationSimpleMeasureDefinitionMeasureAggregationEnum, - //NotificationChannelsAutomationAxiosParamCreator, - // NotificationChannelsAutomationFactory, NotificationChannelsAutomation, - //NotificationChannelsAutomationFp, Configuration as AutomationConfiguration, ConfigurationParameters as AutomationConfigurationParameters, + AutomationParameterItem, + AutomationMetricDefinitionOverride, + AutomationAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum, + AutomationCompoundMeasureValueFilter, + AutomationAnomalyDetectionWrapper, + AutomationMatchAttributeFilter, + AutomationAutomationAlertIntervalEnum, + AutomationDashboardDateFilterDateFilterEmptyValueHandlingEnum, + AutomationDashboardExportSettingsPageSizeEnum, + AutomationDashboardExportSettingsPageOrientationEnum, + AutomationAllTimeDateFilter, + AutomationRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum, + AutomationSettingsPageSizeEnum, + AutomationSettingsPageOrientationEnum, + AutomationSettingsGrandTotalsPositionEnum, + AutomationAllTimeDateFilterAllTimeDateFilter, + AutomationAnomalyDetection, + AutomationCompoundMeasureValueFilterCompoundMeasureValueFilter, + AutomationMatchAttributeFilterMatchAttributeFilter, + AutomationAfmObjectIdentifierParameter, + AutomationAfmObjectIdentifierParameterIdentifier, + AutomationAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum, + AutomationAllTimeDateFilterAllTimeDateFilterGranularityEnum, + AutomationAnomalyDetectionSensitivityEnum, + AutomationAnomalyDetectionGranularityEnum, + AutomationMeasureValueCondition, + AutomationMatchAttributeFilterMatchAttributeFilterMatchTypeEnum, + AutomationAfmObjectIdentifierParameterIdentifierTypeEnum, + AutomationComparisonCondition, + AutomationRangeCondition, + AutomationComparisonConditionComparison, + AutomationRangeConditionRange, + AutomationComparisonConditionComparisonOperatorEnum, + AutomationRangeConditionRangeOperatorEnum, } from "./generated/automation-json-api/index.js"; export type { BaseAPI as AutomationBaseAPI, @@ -653,6 +823,7 @@ export type { } from "./generated/automation-json-api/base.js"; export * from "./generated/metadata-json-api/api.js"; +export type { AutomationAlertCondition as MdAutomationAlertCondition } from "./generated/metadata-json-api/api.js"; export type { ActionsApiGetDataSourceSchemataRequest, @@ -695,6 +866,12 @@ export type { SqlColumnDataTypeEnum as ScanApiSqlColumnDataTypeEnum, ColumnStatisticTypeEnum, ColumnStatisticsRequestStatisticsEnum, + ActionsApiScanStatisticsRequest, + TableStatisticsResponse, + TableStatisticsEntry as ScanModelTableStatisticsEntry, + TableStatisticsWarning, + TableStatisticsRequest, + ColumnStatisticsEntry as ScanModelColumnStatisticsEntry, } from "./generated/scan-json-api/api.js"; export type { @@ -735,6 +912,19 @@ export type { WorkspaceCacheUsage, WorkspaceCurrentCacheUsage, GdStorageFileTypeEnum, + ActionsApiConvertGeoFileRequest, + ConvertGeoFileResponse, + ActionsApiCustomGeoCollectionStagingUploadRequest, + UploadGeoCollectionFileResponse, + ActionsApiImportCustomGeoCollectionRequest, + ImportGeoCollectionResponse, + ConvertGeoFileRequest, + ImportGeoCollectionRequest, + OGCAPIFeaturesApiGetCollectionItemsRequest, + GeoJsonFeatureCollection, + OGCAPIFeaturesApiGetCustomCollectionItemsRequest, + GeoJsonFeature, + GeoJsonGeometry, } from "./generated/result-json-api/api.js"; export type * from "./generated/export-json-api/index.js"; @@ -752,6 +942,7 @@ export { jsonApiHeaders, JSON_API_HEADER_VALUE, ValidateRelationsHeader } from " export { type MetadataGetEntitiesResult, type MetadataGetEntitiesFn, + type MetadataGetEntitiesFnNew, type MetadataGetEntitiesOptions, type MetadataGetEntitiesParams, type MetadataGetEntitiesThemeParams, @@ -765,6 +956,7 @@ export { type OrganizationGetEntitiesResult, type OrganizationGetEntitiesSupportingIncludedResult, type OrganizationGetEntitiesFn, + type OrganizationGetEntitiesFnNew, type OrganizationGetEntitiesParams, OrganizationUtilities, } from "./organizationUtilities.js"; diff --git a/libs/api-client-tiger/src/metadataUtilities.ts b/libs/api-client-tiger/src/metadataUtilities.ts index 0a3b2abe1f7..20765de87f4 100644 --- a/libs/api-client-tiger/src/metadataUtilities.ts +++ b/libs/api-client-tiger/src/metadataUtilities.ts @@ -138,6 +138,9 @@ export type MetadataGetEntitiesFn< P extends MetadataGetEntitiesParams, > = (params: P, options: MetadataGetEntitiesOptions) => AxiosPromise; +/** + * @internal + */ export type MetadataGetEntitiesFnNew< T extends MetadataGetEntitiesResult, P extends MetadataGetEntitiesParams, diff --git a/libs/sdk-backend-base/package.json b/libs/sdk-backend-base/package.json index 2b693ede9da..6efdc98f8af 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Base for backend implementations", "license": "MIT", "author": "GoodData", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-backend-mockingbird/package.json b/libs/sdk-backend-mockingbird/package.json index 4aa6963e01a..7bd6fe13ac7 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "Mock GoodData Backend SPI implementation", "license": "MIT", "author": "GoodData", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-backend-spi/api/sdk-backend-spi.api.md b/libs/sdk-backend-spi/api/sdk-backend-spi.api.md index 797a3b8c2b4..941e43e8c62 100644 --- a/libs/sdk-backend-spi/api/sdk-backend-spi.api.md +++ b/libs/sdk-backend-spi/api/sdk-backend-spi.api.md @@ -141,6 +141,8 @@ import { IThemeDefinition } from '@gooddata/sdk-model'; import { IThemeMetadataObject } from '@gooddata/sdk-model'; import { IUser } from '@gooddata/sdk-model'; import { IUserGroup } from '@gooddata/sdk-model'; +import { IUserSettings } from '@gooddata/sdk-model'; +import { IUserWorkspaceSettings } from '@gooddata/sdk-model'; import type { IVisualizationClass } from '@gooddata/sdk-model'; import { IWhiteLabeling } from '@gooddata/sdk-model'; import { IWidget } from '@gooddata/sdk-model'; @@ -151,6 +153,7 @@ import { IWorkspaceDataFilter } from '@gooddata/sdk-model'; import { IWorkspaceDataFilterDefinition } from '@gooddata/sdk-model'; import { IWorkspacePermissionAssignment } from '@gooddata/sdk-model'; import { IWorkspacePermissions } from '@gooddata/sdk-model'; +import { IWorkspaceSettings } from '@gooddata/sdk-model'; import { IWorkspaceUser } from '@gooddata/sdk-model'; import { IWorkspaceUserGroup } from '@gooddata/sdk-model'; import { LlmEndpointOpenAIPatch } from '@gooddata/sdk-model'; @@ -654,6 +657,7 @@ export type IChatConversation = { createdAt: string; updatedAt: string; title?: string; + pinned?: boolean; }; // @internal @@ -729,7 +733,7 @@ export interface IChatConversations { getConversation(conversationId: string): Promise; getConversationItemsQuery(): IChatConversationItemsQuery; getConversationThread(conversationId: string): IChatConversationThread; - update(conversationId: string, update: Partial>): Promise; + update(conversationId: string, update: Partial>): Promise; } // @internal @@ -2439,12 +2443,7 @@ export interface IUserService { settings(): IUserSettingsService; } -// @public -export interface IUserSettings extends ISettings { - locale: string; - separators: ISeparators; - userId: string; -} +export { IUserSettings } // @public export interface IUserSettingsService { @@ -2455,9 +2454,7 @@ export interface IUserSettingsService { setSeparators(separators: ISeparators): Promise; } -// @public -export interface IUserWorkspaceSettings extends IUserSettings, IWorkspaceSettings { -} +export { IUserWorkspaceSettings } // @alpha export interface IWidgetAlertCount { @@ -2779,12 +2776,7 @@ export interface IWorkspacePermissionsService { getPermissionsForCurrentUser(): Promise; } -// @public -export interface IWorkspaceSettings extends ISettings { - agGridToken?: string; - mapboxToken?: string; - workspace: string; -} +export { IWorkspaceSettings } // @public export interface IWorkspaceSettingsService { diff --git a/libs/sdk-backend-spi/package.json b/libs/sdk-backend-spi/package.json index 056441c68a9..7179ea77c3d 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Backend SPI abstraction interfaces", "license": "MIT", "author": "GoodData", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-backend-spi/src/common/settings.ts b/libs/sdk-backend-spi/src/common/settings.ts index 680b333f518..8e1c3df3a44 100644 --- a/libs/sdk-backend-spi/src/common/settings.ts +++ b/libs/sdk-backend-spi/src/common/settings.ts @@ -1,53 +1,5 @@ -// (C) 2020-2025 GoodData Corporation -import { type ISeparators, type ISettings } from "@gooddata/sdk-model"; +// (C) 2020-2026 GoodData Corporation -/** - * Settings for particular user. - * - * @public - */ -export interface IUserSettings extends ISettings { - /** - * User to which the settings belong. - */ - userId: string; +/* oxlint-disable no-barrel-files/no-barrel-files */ - /** - * User locale - */ - locale: string; - - /** - * Regional number formatting - */ - separators: ISeparators; -} - -/** - * Settings for particular workspace. - * - * @public - */ -export interface IWorkspaceSettings extends ISettings { - /** - * Workspace to which the settings belong. - */ - workspace: string; - - /** - * Stores Mapbox token used for WS - */ - mapboxToken?: string; - - /** - * Stores AgGrid token used for WS - */ - agGridToken?: string; -} - -/** - * Settings for particular combination of user and workspace. - * - * @public - */ -export interface IUserWorkspaceSettings extends IUserSettings, IWorkspaceSettings {} +export type { IUserSettings, IWorkspaceSettings, IUserWorkspaceSettings } from "@gooddata/sdk-model"; diff --git a/libs/sdk-backend-spi/src/workspace/genAI/index.ts b/libs/sdk-backend-spi/src/workspace/genAI/index.ts index 94ad364c471..a817fdabbc5 100644 --- a/libs/sdk-backend-spi/src/workspace/genAI/index.ts +++ b/libs/sdk-backend-spi/src/workspace/genAI/index.ts @@ -732,7 +732,7 @@ export interface IChatConversations { */ update( conversationId: string, - update: Partial>, + update: Partial>, ): Promise; /** @@ -816,6 +816,10 @@ export type IChatConversation = { * Conversation title */ title?: string; + /** + * Conversation pinned status + */ + pinned?: boolean; }; /** diff --git a/libs/sdk-backend-tiger/package.json b/libs/sdk-backend-tiger/package.json index b2a447e0aa2..08b671b3f6e 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Backend SPI implementation for GoodData Cloud and GoodData.CN", "license": "MIT", "author": "GoodData", @@ -29,7 +29,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "clear-recordings": "./scripts/clear-recordings.sh", "create-ref-workspaces": "node ./tests/reference_workspace/create_test_workspaces.mjs", "delete-ref-workspaces": "node ./tests/reference_workspace/delete_test_workspaces.mjs", 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 4076fa9bacd..8b463c0a2c1 100644 --- a/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts +++ b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts @@ -1,6 +1,6 @@ // (C) 2020-2026 GoodData Corporation -import { isEmpty, isEqual } from "lodash-es"; +import { differenceBy, isEmpty, isEqual } from "lodash-es"; import { invariant } from "ts-invariant"; import { v4 as uuid } from "uuid"; @@ -37,6 +37,7 @@ import { EntitiesApi_GetEntityDashboardPlugins, EntitiesApi_GetEntityWorkspaces, FilterContextApi_CreateEntityFilterContexts, + FilterContextApi_DeleteEntityFilterContexts, FilterContextApi_GetEntityFilterContexts, FilterContextApi_UpdateEntityFilterContexts, FilterViewsApi_CreateEntityFilterViews, @@ -88,6 +89,7 @@ import { type IDashboardPermissions, type IDashboardPlugin, type IDashboardPluginDefinition, + type IDashboardTab, type IDashboardWidget, type IDateFilter, type IExecutionDefinition, @@ -141,6 +143,10 @@ import { type TigerDashboardPermissionType, buildDashboardPermissions } from "./ import { DashboardsQuery } from "./dashboardsQuery.js"; import { resolveWidgetFilters, resolveWidgetFiltersWithMultipleDateFilters } from "./widgetFilters.js"; +export function getDeletedDashboardTabs(originalTabs: IDashboardTab[], updatedTabs: IDashboardTab[]) { + return differenceBy(originalTabs, updatedTabs, "localIdentifier"); +} + export class TigerWorkspaceDashboards implements IWorkspaceDashboardsService { constructor( private readonly authCall: TigerAuthenticatedCallGuard, @@ -508,7 +514,31 @@ export class TigerWorkspaceDashboards implements IWorkspaceDashboardsService { * and return just `convertDashboard(result.data, filterContext);` below */ const { id, type } = result.data.data; - return this.getDashboard(idRef(id, type)); + + // This should ideally be named `updatedDashboard`, but this name is already taken above. + const dashboard = await this.getDashboard(idRef(id, type)); + + /** + * Perform a side-effect cleanup that deletes filter contexts of the deleted dashboard tabs. This should ideally be done + * on the backend, but due to complicated implementation it has been agreed per LX-2173 to be done on the frontend for now. + * Remove this if the backend handles this cleanup properly in the future. + * + * Currently the backend only cleans up filter contexts of tabs when the dashboard is deleted, but not when individual + * dashboard tabs are deleted, leaving orphaned filter contexts in the DB. Note that such orphans persist even when + * the whole dashboard is deleted, because on dashboard deletion, the backend cleans only filter contexts of _current_ tabs. + * + * The following code prevents the creation of new filter-context orphans. + */ + getDeletedDashboardTabs(originalDashboard.tabs ?? [], dashboard.tabs ?? []) + .map(({ filterContext }) => filterContext) + .filter(isFilterContext) + .forEach((filterContext) => { + this.deleteFilterContext(filterContext).catch((error) => { + console.warn(`Failed to cleanup orphaned filter context`, filterContext.ref, error); + }); + }); + + return dashboard; }; /** @@ -1525,6 +1555,16 @@ export class TigerWorkspaceDashboards implements IWorkspaceDashboardsService { return convertFilterContextFromBackend(result.data); }; + private deleteFilterContext = async (filterContext: IFilterContext): Promise => { + await this.authCall((client) => + FilterContextApi_DeleteEntityFilterContexts(client.axios, client.basePath, { + workspaceId: this.workspace, + // Note that `this.authCall` is not actually used. See `objRefToIdentifier()` implementation for details. + objectId: objRefToIdentifier(filterContext.ref, this.authCall), + }), + ); + }; + private getFilterContext = async (filterContextRef: ObjRef) => { const filterContextId = objRefToIdentifier(filterContextRef, this.authCall); const result = await this.authCall((client) => { 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 new file mode 100644 index 00000000000..9ba525f44e8 --- /dev/null +++ b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/tests/index.test.ts @@ -0,0 +1,38 @@ +// (C) 2026 GoodData Corporation + +import { describe, expect, it } from "vitest"; + +import { type IDashboardTab } from "@gooddata/sdk-model"; + +import { getDeletedDashboardTabs } from "../index.js"; + +function makeDashboardTab(overrides: Partial): IDashboardTab { + return { + localIdentifier: "some-id", + title: "Example tab", + ...overrides, + }; +} + +describe("getDeletedDashboardTabs", () => { + it("correctly identifies deleted dashboard tabs", () => { + const originalTabs = [ + makeDashboardTab({ localIdentifier: "kept" }), + makeDashboardTab({ localIdentifier: "removed-1" }), + makeDashboardTab({ localIdentifier: "removed-2" }), + ]; + const updatedTabs = [ + makeDashboardTab({ localIdentifier: "added-1" }), + makeDashboardTab({ localIdentifier: "added-2" }), + makeDashboardTab({ localIdentifier: "kept" }), + ]; + const expected = [ + makeDashboardTab({ localIdentifier: "removed-1" }), + makeDashboardTab({ localIdentifier: "removed-2" }), + ]; + + const actual = getDeletedDashboardTabs(originalTabs, updatedTabs); + + expect(actual).toEqual(expected); + }); +}); diff --git a/libs/sdk-backend-tiger/src/backend/workspace/genAI/ChatConversations.ts b/libs/sdk-backend-tiger/src/backend/workspace/genAI/ChatConversations.ts index bbf936f11ca..69eca7efc2e 100644 --- a/libs/sdk-backend-tiger/src/backend/workspace/genAI/ChatConversations.ts +++ b/libs/sdk-backend-tiger/src/backend/workspace/genAI/ChatConversations.ts @@ -75,7 +75,7 @@ export class ChatConversationsService implements IChatConversations { async update( conversationId: string, - update: Partial>, + update: Partial>, ): Promise { return await this.authCall(async (client) => { const response = await GenAiApi_PatchConversation(client.axios, client.basePath, { diff --git a/libs/sdk-backend-tiger/src/convertors/fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.ts b/libs/sdk-backend-tiger/src/convertors/fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.ts index 19f2e21ae3d..613ae8dccd2 100644 --- a/libs/sdk-backend-tiger/src/convertors/fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.ts +++ b/libs/sdk-backend-tiger/src/convertors/fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.ts @@ -201,6 +201,7 @@ function convertDashboardTabContent( IDashboardMeasureValueFilterConfig[] | undefined >(tab.measureValueFilterConfigs), filterGroupsConfig: cloneWithSanitizedIds(tab.filterGroupsConfig), + parameters: tab.parameters?.map(convertDashboardParameter), }; } diff --git a/libs/sdk-backend-tiger/src/convertors/fromBackend/genAIConvertor.ts b/libs/sdk-backend-tiger/src/convertors/fromBackend/genAIConvertor.ts index e40c592d8fc..f7f366d7050 100644 --- a/libs/sdk-backend-tiger/src/convertors/fromBackend/genAIConvertor.ts +++ b/libs/sdk-backend-tiger/src/convertors/fromBackend/genAIConvertor.ts @@ -52,6 +52,7 @@ export function convertChatConversationFromBackend(conversation: AiConversationR createdAt: conversation.createdAt, updatedAt: conversation.lastActivityAt, title: conversation.title ?? undefined, + pinned: conversation.pinned, }; } diff --git a/libs/sdk-backend-tiger/src/convertors/fromBackend/tests/genAIConvertor.test.ts b/libs/sdk-backend-tiger/src/convertors/fromBackend/tests/genAIConvertor.test.ts index d7df5b85bfa..0d10d02b3d7 100644 --- a/libs/sdk-backend-tiger/src/convertors/fromBackend/tests/genAIConvertor.test.ts +++ b/libs/sdk-backend-tiger/src/convertors/fromBackend/tests/genAIConvertor.test.ts @@ -10,6 +10,7 @@ import { import { convertChatConversationErrorFromBackend, + convertChatConversationFromBackend, convertChatConversationItemFromBackend, convertChatSuggestionItemFromBackend, } from "../genAIConvertor.js"; @@ -17,6 +18,30 @@ import { describe("genAIConvertor", () => { const dateNormalizer = vi.fn((val) => val); + describe("convertChatConversationFromBackend", () => { + it("should propagate pinned status", () => { + const converted = convertChatConversationFromBackend({ + conversationId: "conv-1", + workspaceId: "ws-1", + organizationId: "org-1", + userId: "user-1", + createdAt: "2024-01-01T00:00:00Z", + lastActivityAt: "2024-01-02T00:00:00Z", + title: "My conversation", + pinned: true, + isPreview: false, + }); + + expect(converted).toEqual({ + id: "conv-1", + createdAt: "2024-01-01T00:00:00Z", + updatedAt: "2024-01-02T00:00:00Z", + title: "My conversation", + pinned: true, + }); + }); + }); + describe("convertWhatIf", () => { it("should correctly convert AiWhatIfScenario to IChatWhatIfDefinition", () => { const item: AiConversationItemResponse = { diff --git a/libs/sdk-backend-tiger/src/convertors/tests/DashboardParameterConverter.test.ts b/libs/sdk-backend-tiger/src/convertors/tests/DashboardParameterConverter.test.ts index e5e6c926bab..7183e312d68 100644 --- a/libs/sdk-backend-tiger/src/convertors/tests/DashboardParameterConverter.test.ts +++ b/libs/sdk-backend-tiger/src/convertors/tests/DashboardParameterConverter.test.ts @@ -6,7 +6,12 @@ import { type AnalyticalDashboardModelV2, type JsonApiAnalyticalDashboardOutDocument, } from "@gooddata/api-client-tiger"; -import { type IDashboardDefinition, type IDashboardParameter, idRef } from "@gooddata/sdk-model"; +import { + type IDashboardDefinition, + type IDashboardParameter, + type IDashboardTab, + idRef, +} from "@gooddata/sdk-model"; import { convertDashboard } from "../fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.js"; import { convertAnalyticalDashboard } from "../toBackend/AnalyticalDashboardConverter.js"; @@ -28,27 +33,54 @@ function makeDashboardDocument( }; } -function makeTigerContent( +function makeTigerContentRootOnly( parameters: AnalyticalDashboardModelV2.IAnalyticalDashboard["parameters"], ): AnalyticalDashboardModelV2.IAnalyticalDashboard { return { version: "2", parameters }; } -function makeDashboardDefinition(parameters: IDashboardParameter[]): IDashboardDefinition { +function makeTigerContentWithTabs( + tabs: AnalyticalDashboardModelV2.IDashboardTab[], +): AnalyticalDashboardModelV2.IAnalyticalDashboard { + return { version: "2", tabs }; +} + +function makeTigerTab( + localIdentifier: string, + parameters?: AnalyticalDashboardModelV2.IDashboardTab["parameters"], +): AnalyticalDashboardModelV2.IDashboardTab { + return { + localIdentifier, + title: "", + layout: { type: "IDashboardLayout", sections: [] } as never, + filterContextRef: {} as never, + ...(parameters ? { parameters } : {}), + }; +} + +function makeDashboardDefinitionWithTabs(tabs: IDashboardTab[]): IDashboardDefinition { return { type: "IDashboard", title: "", description: "", shareStatus: "private", - parameters, + tabs, } as IDashboardDefinition; } +function makeTab(localIdentifier: string, parameters?: IDashboardParameter[]): IDashboardTab { + return { + localIdentifier, + title: "", + ...(parameters ? { parameters } : {}), + } as IDashboardTab; +} + describe("dashboard parameter converters", () => { describe("from backend", () => { - it("converts a fully-specified parameter entry", () => { + it("V1: reads root parameters when no tabs[]", () => { const doc = makeDashboardDocument( - makeTigerContent([ + makeTigerContentRootOnly([ { ref: tigerRef as never, parameterType: "NUMBER", @@ -72,48 +104,95 @@ describe("dashboard parameter converters", () => { ]); }); - it("defaults mode to active when omitted", () => { + it("V2: reads each tab's parameters per tab", () => { const doc = makeDashboardDocument( - makeTigerContent([ - { - ref: tigerRef as never, - parameterType: "NUMBER", - }, + makeTigerContentWithTabs([ + makeTigerTab("tab-A", [{ ref: tigerRef as never, parameterType: "NUMBER", value: 25 }]), + makeTigerTab("tab-B"), ]), ); const dashboard = convertDashboard(doc); - expect(dashboard.parameters).toEqual([ + expect(dashboard.tabs?.[0]?.parameters).toEqual([ { ref: idRef("topN", "parameter"), parameterType: "NUMBER", + value: 25, mode: "active", }, ]); + expect(dashboard.tabs?.[1]?.parameters).toBeUndefined(); + }); + + it("defaults mode to active when omitted on a tab parameter", () => { + const doc = makeDashboardDocument( + makeTigerContentWithTabs([ + makeTigerTab("tab-A", [{ ref: tigerRef as never, parameterType: "NUMBER" }]), + ]), + ); + + const dashboard = convertDashboard(doc); + + expect(dashboard.tabs?.[0]?.parameters?.[0]?.mode).toBe("active"); }); - it("returns undefined parameters when content has none", () => { + it("returns undefined parameters when neither root nor any tab has them", () => { const doc = makeDashboardDocument({ version: "2" }); const dashboard = convertDashboard(doc); expect(dashboard.parameters).toBeUndefined(); + expect(dashboard.tabs).toBeUndefined(); }); }); describe("to backend", () => { - it("preserves a fully-specified parameter entry", () => { - const definition = makeDashboardDefinition([ - { - ref: idRef("topN", "parameter"), - parameterType: "NUMBER", - value: 25, - label: "Top N", - mode: "readonly", - }, + it("V2: writes parameters per tab and mirrors tabs[0] to root for V1 readers", () => { + const definition = makeDashboardDefinitionWithTabs([ + makeTab("tab-A", [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + value: 25, + label: "Top N", + mode: "readonly", + }, + ]), + makeTab("tab-B"), ]); const result = convertAnalyticalDashboard(definition); + const tigerTopN = { + ref: tigerRef, + parameterType: "NUMBER", + value: 25, + label: "Top N", + mode: "readonly", + }; + expect(result.parameters).toEqual([tigerTopN]); + expect(result.tabs?.[0]?.parameters).toEqual([tigerTopN]); + expect(result.tabs?.[1]?.parameters).toBeUndefined(); + }); + + it("V2: writes root parameters when definition has no tabs (legacy root-only)", () => { + const definition = { + type: "IDashboard", + title: "", + description: "", + shareStatus: "private", + parameters: [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + value: 25, + label: "Top N", + mode: "readonly", + }, + ], + } as IDashboardDefinition; + + const result = convertAnalyticalDashboard(definition); + expect(result.parameters).toEqual([ { ref: tigerRef, @@ -123,20 +202,23 @@ describe("dashboard parameter converters", () => { mode: "readonly", }, ]); + expect(result.tabs).toBeUndefined(); }); - it("omits mode field when set to active", () => { - const definition = makeDashboardDefinition([ - { - ref: idRef("topN", "parameter"), - parameterType: "NUMBER", - mode: "active", - }, + it("omits mode field when set to active on a tab parameter", () => { + const definition = makeDashboardDefinitionWithTabs([ + makeTab("tab-A", [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + mode: "active", + }, + ]), ]); const result = convertAnalyticalDashboard(definition); - expect(result.parameters).toEqual([ + expect(result.tabs?.[0]?.parameters).toEqual([ { ref: tigerRef, parameterType: "NUMBER", @@ -144,44 +226,42 @@ describe("dashboard parameter converters", () => { ]); }); - it("emits no parameters field when none defined", () => { - const definition = makeDashboardDefinition([]); - const result = convertAnalyticalDashboard({ ...definition, parameters: undefined }); + it("emits no parameters field when no tab declares any", () => { + const definition = makeDashboardDefinitionWithTabs([makeTab("tab-A")]); + const result = convertAnalyticalDashboard(definition); expect(result.parameters).toBeUndefined(); + expect(result.tabs?.[0]?.parameters).toBeUndefined(); }); }); describe("round-trip", () => { - it("preserves explicit value and label across to->from converters", () => { - const definition = makeDashboardDefinition([ - { - ref: idRef("topN", "parameter"), - parameterType: "NUMBER", - value: 25, - label: "Top N", - mode: "active", - }, - ]); - - const tigerContent = convertAnalyticalDashboard(definition); - const dashboard = convertDashboard(makeDashboardDocument(tigerContent)); - - expect(dashboard.parameters).toEqual(definition.parameters); - }); - - it("preserves a minimal entry (only ref+parameterType+active mode)", () => { - const definition = makeDashboardDefinition([ - { - ref: idRef("topN", "parameter"), - parameterType: "NUMBER", - mode: "active", - }, + it("preserves per-tab parameters across to->from converters", () => { + const definition = makeDashboardDefinitionWithTabs([ + makeTab("tab-A", [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + value: 25, + label: "Top N", + mode: "active", + }, + ]), + makeTab("tab-B", [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + mode: "active", + }, + ]), ]); const tigerContent = convertAnalyticalDashboard(definition); const dashboard = convertDashboard(makeDashboardDocument(tigerContent)); - expect(dashboard.parameters).toEqual(definition.parameters); + expect(dashboard.tabs?.[0]?.parameters).toEqual(definition.tabs?.[0]?.parameters); + expect(dashboard.tabs?.[1]?.parameters).toEqual(definition.tabs?.[1]?.parameters); + // Root mirrors tabs[0] for V1 readers; on read-back, both root and tabs[0] are populated. + expect(dashboard.parameters).toEqual(definition.tabs?.[0]?.parameters); }); }); }); diff --git a/libs/sdk-backend-tiger/src/convertors/toBackend/AnalyticalDashboardConverter.ts b/libs/sdk-backend-tiger/src/convertors/toBackend/AnalyticalDashboardConverter.ts index d5054f82451..36d51926ea4 100644 --- a/libs/sdk-backend-tiger/src/convertors/toBackend/AnalyticalDashboardConverter.ts +++ b/libs/sdk-backend-tiger/src/convertors/toBackend/AnalyticalDashboardConverter.ts @@ -136,6 +136,7 @@ function convertDashboardTabToBackend( ITigerDashboardMeasureValueFilterConfig[] | undefined >(tab.measureValueFilterConfigs), filterGroupsConfig: cloneWithSanitizedIds(tab.filterGroupsConfig), + parameters: tab.parameters?.map(convertDashboardParameterToBackend), }; } @@ -161,6 +162,7 @@ export function convertAnalyticalDashboard( let effectiveDateFilterConfigs = dashboard.dateFilterConfigs; let effectiveAttributeFilterConfigs = dashboard.attributeFilterConfigs; let effectiveMeasureValueFilterConfigs = dashboard.measureValueFilterConfigs; + let effectiveParameters = dashboard.parameters; if (dashboard.tabs && dashboard.tabs.length > 0) { const effectiveTab = dashboard.tabs[0]; @@ -171,6 +173,7 @@ export function convertAnalyticalDashboard( effectiveDateFilterConfigs = effectiveTab.dateFilterConfigs; effectiveAttributeFilterConfigs = effectiveTab.attributeFilterConfigs; effectiveMeasureValueFilterConfigs = effectiveTab.measureValueFilterConfigs; + effectiveParameters = effectiveTab.parameters; } const layout = convertLayout( @@ -197,7 +200,7 @@ export function convertAnalyticalDashboard( layout, ), plugins: dashboard.plugins?.map(convertDashboardPluginLinkToBackend), - parameters: dashboard.parameters?.map(convertDashboardParameterToBackend), + parameters: effectiveParameters?.map(convertDashboardParameterToBackend), disableCrossFiltering: dashboard.disableCrossFiltering, disableUserFilterReset: dashboard.disableUserFilterReset, disableUserFilterSave: dashboard.disableUserFilterSave, diff --git a/libs/sdk-code-convertors/api-extractor.json b/libs/sdk-code-convertors/api-extractor.json index 0ec228476fa..7835123bd5e 100644 --- a/libs/sdk-code-convertors/api-extractor.json +++ b/libs/sdk-code-convertors/api-extractor.json @@ -1,17 +1,5 @@ { "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", "extends": "../../common/config/api-extractor/api-extractor.json", - "mainEntryPointFilePath": "/esm/index.d.ts", - "messages": { - "extractorMessageReporting": { - "ae-missing-release-tag": { - "logLevel": "warning", - "addToApiReportFile": true - }, - "ae-forgotten-export": { - "logLevel": "warning", - "addToApiReportFile": true - } - } - } + "mainEntryPointFilePath": "/esm/index.d.ts" } diff --git a/libs/sdk-code-convertors/api/sdk-code-convertors.api.md b/libs/sdk-code-convertors/api/sdk-code-convertors.api.md index ff86d40cd13..f13791ba927 100644 --- a/libs/sdk-code-convertors/api/sdk-code-convertors.api.md +++ b/libs/sdk-code-convertors/api/sdk-code-convertors.api.md @@ -40,6 +40,7 @@ import { IAttributeFilterConfigs } from '@gooddata/sdk-model'; import { IAttributeSortItem } from '@gooddata/sdk-model'; import { IBucket } from '@gooddata/sdk-model'; import { IDashboardAttributeFilterConfig } from '@gooddata/sdk-model'; +import { IDashboardDateFilter } from '@gooddata/sdk-model'; import { IDashboardDateFilterConfig } from '@gooddata/sdk-model'; import { IDashboardDateFilterConfigItem } from '@gooddata/sdk-model'; import { IDashboardDefinition } from '@gooddata/sdk-model'; @@ -136,46 +137,328 @@ export type AacSection = Section; // @public (undocumented) export type AacVisualisation = Visualisation; -// Warning: (ae-missing-release-tag) "AllTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const AllTypes: string[]; -// Warning: (ae-missing-release-tag) "areaChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const areaChart: { - load: typeof load_5; - save: typeof save_5; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const AREA_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const areaChart: IAreaChartConfig; + +// @internal (undocumented) +export type AreaChartConfigProperties = { + colorMapping: Array; + distinctPointShapes: { + enabled: boolean; + pointShapeMapping?: Record; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + dataPoints: { + visible: boolean | "auto"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + stackMeasures: boolean; + stackMeasuresToPercent: boolean; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function areaChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function areaChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + distinctPointShapes: { + enabled: boolean | undefined; + pointShapeMapping: Record | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + dataPoints: { + visible: "auto" | boolean | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + stackMeasuresToPercent: boolean | undefined; + stackMeasures: boolean | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function assertUnreachable(x: never): never; -// Warning: (ae-missing-release-tag) "AttributeHierarchyTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const AttributeHierarchyTypes: string[]; -// Warning: (ae-missing-release-tag) "barChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const barChart: { - load: typeof load_2; - save: typeof save_2; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const BAR_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const barChart: IBarChartConfig; + +// @internal (undocumented) +export type BarChartConfigProperties = { + colorMapping: Array; + dataLabels: { + totalsVisible: boolean | "auto"; + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + stackMeasures: boolean; + stackMeasuresToPercent: boolean; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "bubbleChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const bubbleChart: { - load: typeof load_7; - save: typeof save_7; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function barChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function barChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + totalsVisible: "auto" | boolean | undefined; + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + stackMeasuresToPercent: boolean | undefined; + stackMeasures: boolean | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export const BUBBLE_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const bubbleChart: IBubbleChartConfig; + +// @internal (undocumented) +export type BubbleChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function bubbleChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function bubbleChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export enum BucketsType { // (undocumented) @@ -213,38 +496,108 @@ export enum BucketsType { // @public (undocumented) export function buildAfmExecution(entities: ExportEntities, query: Query): ToExecutionResults; -// Warning: (ae-missing-release-tag) "buildAttributeLabels" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public +// @internal (undocumented) export function buildAttributeLabels(labels?: Attribute["labels"], isAuxiliaryDataset?: boolean): DeclarativeLabel[]; -// Warning: (ae-missing-release-tag) "buildAttributes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public +// @internal (undocumented) export function buildAttributes(fields?: Fields, isAuxiliaryDataset?: boolean): DeclarativeAttribute[]; -// Warning: (ae-missing-release-tag) "buildFacts" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public +// @internal (undocumented) export function buildFacts(fields?: Fields): DeclarativeFact[]; -// Warning: (ae-missing-release-tag) "buildReferences" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public +// @internal (undocumented) export function buildReferences(entities: ExportEntities, refs?: Dataset["references"]): DeclarativeReference[]; -// Warning: (ae-missing-release-tag) "bulletChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const bulletChart: { - load: typeof load_14; - save: typeof save_14; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const BULLET_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const bulletChart: IBulletChartConfig; + +// @internal (undocumented) +export type BulletChartConfigProperties = { + colorMapping: Array; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "IChartFill" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export function bulletChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function bulletChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) export interface ChartFill { // (undocumented) measureToPatternName?: Record; @@ -252,13 +605,9 @@ export interface ChartFill { type: ChartFillType; } -// Warning: (ae-missing-release-tag) "ChartFillType" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type ChartFillType = "solid" | "pattern" | "outline"; -// Warning: (ae-missing-release-tag) "ColorMapping" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export type ColorMapping = { id: string; @@ -275,41 +624,280 @@ export type ColorMapping = { }; }; -// Warning: (ae-missing-release-tag) "columnChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const columnChart: { - load: typeof load_3; - save: typeof save_3; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const COLUMN_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const columnChart: IColumnChartConfig; + +// @internal (undocumented) +export type ColumnChartConfigProperties = { + colorMapping: Array; + dataLabels: { + totalsVisible: boolean | "auto"; + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + stackMeasures: boolean; + stackMeasuresToPercent: boolean; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "ColumnLocator" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal (undocumented) +export function columnChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function columnChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + totalsVisible: "auto" | boolean | undefined; + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + stackMeasuresToPercent: boolean | undefined; + stackMeasures: boolean | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export type ColumnLocator = IAttributeColumnLocator | IMeasureColumnLocator | ITotalColumnLocator; -// Warning: (ae-missing-release-tag) "ColumnWidth" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export type ColumnWidth = IAbsoluteColumnWidth | IAutoColumnWidth; -// Warning: (ae-missing-release-tag) "ColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export type ColumnWidthItem = IAttributeColumnWidthItem | IMeasureColumnWidthItem | ISliceMeasureColumnWidthItem | IMixedValuesColumnWidthItem | IAllMeasureColumnWidthItem | IWeakMeasureColumnWidthItem; -// Warning: (ae-missing-release-tag) "comboChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const comboChart: { - load: typeof load_19; - save: typeof save_19; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const COMBO_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const comboChart: IComboChartConfig; + +// @internal (undocumented) +export type ComboChartConfigProperties = { + colorMapping: Array; + continuousLine: { + enabled: boolean; + }; + distinctPointShapes: { + enabled: boolean; + pointShapeMapping?: Record; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + dataPoints: { + visible: boolean | "auto"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + dualAxis: boolean; + primaryChartType: "column" | "area" | "line"; + secondaryChartType: "column" | "area" | "line"; + stackMeasures: boolean; + stackMeasuresToPercent: boolean; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + secondary_yaxis: { + measures: string[]; + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; + thresholdMeasures: string[]; + thresholdExcludedMeasures: string[]; +}; + +// @internal (undocumented) +export function comboChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function comboChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, buckets?: Bucket[]): { + colorMapping: ColorMapping[] | undefined; + continuousLine: { + enabled: boolean | undefined; + } | undefined; + distinctPointShapes: { + enabled: boolean | undefined; + pointShapeMapping: Record | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + dataPoints: { + visible: "auto" | boolean | undefined; + } | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + stackMeasuresToPercent: boolean | undefined; + stackMeasures: boolean | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + primaryChartType: "area" | "column" | "line" | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + secondaryChartType: "area" | "column" | "line" | undefined; + secondary_yaxis: { + measures: string[] | undefined; + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + dualAxis: boolean | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; + thresholdMeasures: string[] | undefined; + thresholdExcludedMeasures: string[] | undefined; +} | undefined; + +// @internal (undocumented) +export type ConfigDefaults = { + [key in keyof T]: T[key]; }; -// Warning: (ae-forgotten-export) The symbol "FullFields" needs to be exported by the entry point index.d.ts -// // @public (undocumented) export function convertBucketToTitle(entities: ExportEntities, query: Query, field: FullFields, location?: boolean): string | null; @@ -353,6 +941,14 @@ export function createIdentifier(data: string, { forceM forceType?: "user" | "userGroup" | "dataset" | "date" | "attribute" | "label" | "measure" | "workspaceDataFilter" | "visualizationObject" | "analyticalDashboard" | "dashboardPlugin" | "filterContext"; }): T | null; +// @internal (undocumented) +export type DashboardDefinition = Pick & { + version: string; +}; + +// @internal (undocumented) +export type DashboardSection = Required["layout"]["sections"][number]; + // @public (undocumented) export type DashboardTab = { localIdentifier: string; @@ -366,29 +962,22 @@ export type DashboardTab = { filterGroupsConfig?: IDashboardFilterGroupsConfig; }; -// Warning: (ae-missing-release-tag) "DashboardTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const DashboardTypes: string[]; -// Warning: (ae-missing-release-tag) "DatasetTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type DashboardWidget = DashboardSection["items"][number]; + +// @internal (undocumented) export const DatasetTypes: string[]; -// Warning: (ae-missing-release-tag) "DateDatasetTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const DateDatasetTypes: string[]; -// Warning: (ae-missing-release-tag) "declarativeAbsoluteDateFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeAbsoluteDateFilterToYaml(absoluteDateFilter: IAbsoluteDateFilter["absoluteDateFilter"], connectedAttributeFilters: IFilter[] | undefined, entities: FromEntities, getUniqueKey: (baseKey: string) => string, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeArithmeticMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeArithmeticMetricToYaml(def: IMeasureBody, arithmeticDefinition: IArithmeticMeasureDefinition): YAMLMap; // @public (undocumented) @@ -397,21 +986,14 @@ export function declarativeAttributeHierarchyToYaml(hierarchy: DeclarativeAttrib json: AttributeHierarchy; }; -// Warning: (ae-missing-release-tag) "declarativeAttributeSortToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeAttributeSortToYaml(sort: IAttributeSortItem): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeAttributeToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeAttributeToYaml(def: IAttributeBody, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-forgotten-export) The symbol "Buckets" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "declarativeBucketsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function declarativeBucketsToYaml(entities: FromEntities, buckets: IBucket[], errorContext?: IErrorContext): Buckets; +// @internal (undocumented) +export function declarativeBucketsToYaml(entities: FromEntities, buckets: IBucket[], errorContext?: IErrorContext): YamlBuckets; // @public (undocumented) export function declarativeDashboardToYaml(entities: FromEntities, dashboard: DeclarativeAnalyticalDashboard, filterContexts?: DeclarativeFilterContext[], context?: IErrorContext): { @@ -431,14 +1013,10 @@ export function declarativeDateInstanceToYaml(dataset: DeclarativeDateDataset): json: DateDataset; }; -// Warning: (ae-missing-release-tag) "declarativeDrillToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeDrillToYaml(drill: InsightDrillDefinition, entities?: FromEntities, sourceVisualizationId?: string, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeFilterContextToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeFilterContextToYaml(dateFilterConfig?: IDashboardDateFilterConfig, filterContext?: DeclarativeFilterContext, errorContext?: IErrorContext): { filters: YAMLMap; filtersMap: { @@ -446,30 +1024,19 @@ export function declarativeFilterContextToYaml(dateFilterConfig?: IDashboardDate }; }; -// Warning: (ae-missing-release-tag) "declarativeFiltersConfigToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeFiltersConfigToYaml(filtersMap: Record, dateFilterConfig?: IDashboardDateFilterConfig, dateFilterConfigs?: IDashboardDateFilterConfigItem[], attributeFilterConfigs?: IDashboardAttributeFilterConfig[], measureValueFilterConfigs?: IDashboardMeasureValueFilterConfig[], errorContext?: IErrorContext): void; -// Warning: (ae-forgotten-export) The symbol "Filters" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "declarativeFiltersToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function declarativeFiltersToYaml(entities: FromEntities, filters: IFilter[], errorContext?: IErrorContext): Filters; +// @internal (undocumented) +export function declarativeFiltersToYaml(entities: FromEntities, filters: IFilter[], errorContext?: IErrorContext): YamlFilters; -// Warning: (ae-missing-release-tag) "declarativeInlineMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeInlineMetricToYaml(def: IMeasureBody, inlineDef: IInlineMeasureDefinition): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeMeasureSortToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeMeasureSortToYaml(sort: IMeasureSortItem): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeMeasureValueFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeMeasureValueFilterToYaml(measureValueFilter: IMeasureValueFilterBody, errorContext?: IErrorContext): YAMLMap; // @public (undocumented) @@ -478,20 +1045,13 @@ export function declarativeMetricToYaml(metric: DeclarativeMetric): { json: Metric; }; -// Warning: (ae-missing-release-tag) "declarativeNegativeAttributeFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeNegativeAttributeFilterToYaml(entities: FromEntities, attributeFilter: INegativeAttributeFilterBody, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-forgotten-export) The symbol "PostProcessors" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "declarativeNormalMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function declarativeNormalMetricToYaml(def: IMeasureBody, metricDefinition: IMeasureDefinition, postProcessors: PostProcessors, errorContext?: IErrorContext): YAMLMap; +// @internal (undocumented) +export function declarativeNormalMetricToYaml(def: IMeasureBody, metricDefinition: IMeasureDefinition, postProcessors: YamlPostProcessors, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativePluginsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativePluginsToYaml(dashboard: IDashboardDefinition, errorContext?: IErrorContext): YAMLSeq | undefined; // @public (undocumented) @@ -500,58 +1060,37 @@ export function declarativePluginToYaml(plugin: DeclarativeDashboardPlugin): { json: Plugin_2; }; -// Warning: (ae-missing-release-tag) "declarativePoPMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativePoPMetricToYaml(def: IMeasureBody, popDefinition: IPoPMeasureDefinition, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativePositiveAttributeFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativePositiveAttributeFilterToYaml(entities: FromEntities, attributeFilter: IPositiveAttributeFilterBody, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativePreviousPeriodMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativePreviousPeriodMetricToYaml(def: IMeasureBody, previousDefinition: IPreviousPeriodMeasureDefinition, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeRankingFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeRankingFilterToYaml(rankingFilter: IRankingFilterBody, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeRelativeDateFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeRelativeDateFilterToYaml(relativeDateFilter: IRelativeDateFilter["relativeDateFilter"], connectedAttributeFilters: IFilter[] | undefined, entities: FromEntities, getUniqueKey: (baseKey: string) => string, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeSectionsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeSectionsToYaml(layout?: IDashboardLayout, entities?: FromEntities, errorContext?: IErrorContext): YAMLSeq | undefined; -// Warning: (ae-forgotten-export) The symbol "Sorts_2" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "declarativeSortsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErrorContext): Sorts_2; +// @internal (undocumented) +export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErrorContext): YamlSorts; -// Warning: (ae-missing-release-tag) "declarativeTabsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeTabsToYaml(tabs: DashboardTab[], filterContexts?: DeclarativeFilterContext[], entities?: FromEntities, errorContext?: IErrorContext): YAMLSeq | undefined; -// Warning: (ae-missing-release-tag) "declarativeTotalToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeTotalToYaml(total: ITotal, _errorContext?: IErrorContext): { totalMap: YAMLMap; attribute: string; }; -// Warning: (ae-missing-release-tag) "declarativeVisTypeToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeVisTypeToYaml(def: IInsightDefinition["insight"]): string | null; // @public (undocumented) @@ -560,29 +1099,100 @@ export function declarativeVisualisationToYaml(entities: FromEntities, visualisa json?: Visualisation; }; -// Warning: (ae-missing-release-tag) "declarativeWidgetToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeWidgetToYaml(widget?: IDashboardWidget | null, size?: IDashboardLayoutItem["size"], entities?: FromEntities, errorContext?: IErrorContext): YAMLMap | undefined; -// Warning: (ae-missing-release-tag) "dependencyWheelChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const dependencyWheelChart: { - load: typeof load_16; - save: typeof save_16; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const DEPENDENCY_WHEEL_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const dependencyWheelChart: IDependencyWheelChartConfig; + +// @internal (undocumented) +export type DependencyWheelChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "donutChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const donutChart: { - load: typeof load_9; - save: typeof save_9; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function dependencyWheelChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function dependencyWheelChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export const DONUT_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const donutChart: IDonutChartConfig; + +// @internal (undocumented) +export type DonutChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function donutChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function donutChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export type EmptyValueHandling = NonNullable; + // @public (undocumented) export type ExportEntities = Array<{ id: string; @@ -603,9 +1213,12 @@ export type FileNamesUsed = { // @public (undocumented) export type FilePath = string[] | string; -// Warning: (ae-missing-release-tag) "FilterContextItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type FilterContextDefinition = Pick & { + version: string; +}; + +// @internal (undocumented) export type FilterContextItem = { yaml: YAMLMap; filter: IFilterContextDefinition["filters"][number]; @@ -622,15 +1235,58 @@ export type FromEntities = Array<{ data?: Dataset | DateDataset | Metric | Visualisation | Dashboard | Plugin_2 | AttributeHierarchy; }>; -// Warning: (ae-missing-release-tag) "funnelChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) -export const funnelChart: { - load: typeof load_12; - save: typeof save_12; - DEFAULTS: ConfigDefaults; +export type FullFields = AttributeField | MetricField | CalculatedMetricField | InlineMetricField | ArithmeticMetricField | PoPMetricField | PreviousPeriodMetricField; + +// @internal (undocumented) +export const FUNNEL_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const funnelChart: IFunnelChartConfig; + +// @internal (undocumented) +export type FunnelChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function funnelChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function funnelChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function generateFileName(used: FileNamesUsed, base: string[], id: string, title?: string | null): string; @@ -654,50 +1310,324 @@ export type GenericAssigneeRulePermission = { // @public (undocumented) export type GenericPermission = GenericAssigneePermission | GenericAssigneeRulePermission; -// Warning: (ae-missing-release-tag) "geoAreaChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const geoAreaChart: { - load: typeof load_21; - save: typeof save_21; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const GEO_AREA_CHART_DEFAULTS: ConfigDefaults; + +// @internal (undocumented) +export const GEO_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const geoAreaChart: IGeoAreaChartConfig; + +// @internal (undocumented) +export type GeoAreaChartConfigProperties = { + colorMapping: Array; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto" | "top-left" | "top-right" | "bottom-left" | "bottom-right"; + }; + tooltipText: string; + basemap: string; + viewport: { + area: "auto" | "continent_af" | "continent_as" | "continent_au" | "continent_eu" | "continent_na" | "continent_sa" | "world" | "custom"; + navigation: { + pan: boolean; + zoom: boolean; + }; + }; + center: { + lat: number; + lng: number; + }; + zoom: number; + bounds: { + northEast: { + lat: number; + lng: number; + }; + southWest: { + lat: number; + lng: number; + }; + }; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "geoChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const geoChart: { - load: typeof load_20; - save: typeof save_20; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function geoAreaChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function geoAreaChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, _positions: Array<{ + longitude: string; + latitude: string; +}>): { + colorMapping: ColorMapping[] | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + tooltipText: string | undefined; + basemap: string | undefined; + viewport: { + area: "auto" | "continent_af" | "continent_as" | "continent_au" | "continent_eu" | "continent_na" | "continent_sa" | "custom" | "world" | undefined; + navigation: { + pan: boolean | undefined; + zoom: boolean | undefined; + } | undefined; + } | undefined; + center: { + lat: number | undefined; + lng: number | undefined; + } | undefined; + zoom: number | undefined; + bounds: { + northEast: { + lat: number | undefined; + lng: number | undefined; + } | undefined; + southWest: { + lat: number | undefined; + lng: number | undefined; + } | undefined; + } | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal @deprecated (undocumented) +export const geoChart: IGeoChartConfig; + +// @internal (undocumented) +export type GeoChartConfigProperties = { + colorMapping: Array; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto" | "top-left" | "top-right" | "bottom-left" | "bottom-right"; + }; + longitude: string; + latitude: string; + tooltipText: string; + basemap: string; + viewport: { + area: "auto" | "continent_af" | "continent_as" | "continent_au" | "continent_eu" | "continent_na" | "continent_sa" | "world" | "custom"; + navigation: { + pan: boolean; + zoom: boolean; + }; + }; + center: { + lat: number; + lng: number; + }; + zoom: number; + bounds: { + northEast: { + lat: number; + lng: number; + }; + southWest: { + lat: number; + lng: number; + }; + }; + points: { + groupNearbyPoints: boolean; + maxSize: "0.5x" | "0.75x" | "normal" | "1.25x" | "1.5x" | "default"; + minSize: "0.5x" | "0.75x" | "normal" | "1.25x" | "1.5x" | "default"; + shapeType: "circle" | "iconByValue" | "oneIcon"; + icon: string; + }; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function geoChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function geoChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, positions: Array<{ + longitude: string; + latitude: string; +}>): { + longitude: string; + latitude: string; +} | undefined; + // @public (undocumented) export function getIdentifier(obj: ObjRef | ObjRefInScope | AfmObjectIdentifier, untype?: boolean, errorContext?: IErrorContext): string; // @public (undocumented) export function getValueOrDefault(value: T, defaultValue: T, type?: ValueType, undefinedAsDefault?: boolean): T | undefined; -// Warning: (ae-missing-release-tag) "headlineChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const headlineChart: { - load: typeof load_18; - save: typeof save_18; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const HEADLINE_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const headlineChart: IHeadlineChartConfig; + +// @internal (undocumented) +export type HeadlineChartConfigProperties = { + comparison: { + enabled: boolean; + calculationType: "change" | "change_difference" | "ratio" | "difference"; + format: "inherit" | string; + position: "right" | "left" | "top" | "auto"; + isArrowEnabled: boolean; + colorConfig?: { + disabled: boolean; + equals: ColorMapping["color"] | undefined; + negative: ColorMapping["color"] | undefined; + positive: ColorMapping["color"] | undefined; + }; + labelConfig?: { + isConditional: boolean; + unconditionalValue: string; + equals: string; + negative: string; + positive: string; + }; + }; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "heatmapChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const heatmapChart: { - load: typeof load_13; - save: typeof save_13; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function headlineChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function headlineChartSave(_fields: Visualisation["query"]["fields"] | undefined, config?: Visualisation["config"] | undefined): { + comparison: { + calculationType: string | undefined; + format: string | undefined; + enabled: boolean | undefined; + position: string | undefined; + isArrowEnabled: boolean | undefined; + labelConfig: { + isConditional: boolean | undefined; + unconditionalValue: string | undefined; + equals: string | undefined; + negative: string | undefined; + positive: string | undefined; + } | undefined; + colorConfig: { + disabled: boolean | undefined; + equals: { + type: "guid"; + value: string; + } | { + type: "rgb"; + value: { + r: number; + g: number; + b: number; + }; + } | undefined; + negative: { + type: "guid"; + value: string; + } | { + type: "rgb"; + value: { + r: number; + g: number; + b: number; + }; + } | undefined; + positive: { + type: "guid"; + value: string; + } | { + type: "rgb"; + value: { + r: number; + g: number; + b: number; + }; + } | undefined; + } | undefined; + } | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export const HEATMAP_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const heatmapChart: IHeatmapChartConfig; + +// @internal (undocumented) +export type HeatmapChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "IAbsoluteColumnWidth" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal (undocumented) +export function heatmapChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function heatmapChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export interface IAbsoluteColumnWidth { // (undocumented) @@ -706,32 +1636,34 @@ export interface IAbsoluteColumnWidth { value: number; } -// Warning: (ae-missing-release-tag) "IAllMeasureColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAllMeasureColumnWidthItem { // (undocumented) measureColumnWidthItem: IAllMeasureColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IAllMeasureColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAllMeasureColumnWidthItemBody { // (undocumented) width: IAbsoluteColumnWidth; } -// Warning: (ae-missing-release-tag) "IAttributeColumnLocator" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface IAreaChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof areaChartLoad; + // (undocumented) + save: typeof areaChartSave; +} + // @public (undocumented) export interface IAttributeColumnLocator { // (undocumented) attributeLocatorItem: IAttributeColumnLocatorBody; } -// Warning: (ae-missing-release-tag) "IAttributeColumnLocatorBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAttributeColumnLocatorBody { // (undocumented) @@ -740,16 +1672,12 @@ export interface IAttributeColumnLocatorBody { element?: string | null; } -// Warning: (ae-missing-release-tag) "IAttributeColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAttributeColumnWidthItem { // (undocumented) attributeColumnWidthItem: IAttributeColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IAttributeColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAttributeColumnWidthItemBody { // (undocumented) @@ -758,14 +1686,62 @@ export interface IAttributeColumnWidthItemBody { width: IAbsoluteColumnWidth; } -// Warning: (ae-missing-release-tag) "IAutoColumnWidth" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAutoColumnWidth { // (undocumented) value: "auto"; } +// @internal @deprecated (undocumented) +export interface IBarChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof barChartLoad; + // (undocumented) + save: typeof barChartSave; +} + +// @internal @deprecated (undocumented) +export interface IBubbleChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof bubbleChartLoad; + // (undocumented) + save: typeof bubbleChartSave; +} + +// @internal @deprecated (undocumented) +export interface IBulletChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof bulletChartLoad; + // (undocumented) + save: typeof bulletChartSave; +} + +// @internal @deprecated (undocumented) +export interface IColumnChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof columnChartLoad; + // (undocumented) + save: typeof columnChartSave; +} + +// @internal @deprecated (undocumented) +export interface IComboChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof comboChartLoad; + // (undocumented) + save: typeof comboChartSave; +} + // @public (undocumented) export interface ICoreError extends Error { // (undocumented) @@ -776,6 +1752,26 @@ export interface ICoreError extends Error { type: (typeof CoreErrorTypes)[keyof typeof CoreErrorTypes]; } +// @internal @deprecated (undocumented) +export interface IDependencyWheelChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof dependencyWheelChartLoad; + // (undocumented) + save: typeof dependencyWheelChartSave; +} + +// @internal @deprecated (undocumented) +export interface IDonutChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof donutChartLoad; + // (undocumented) + save: typeof donutChartSave; +} + // @public (undocumented) export interface IErrorContext { // (undocumented) @@ -786,32 +1782,84 @@ export interface IErrorContext { type?: string; } -// Warning: (ae-missing-release-tag) "IMeasureColumnLocator" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface IFunnelChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof funnelChartLoad; + // (undocumented) + save: typeof funnelChartSave; +} + +// @internal @deprecated (undocumented) +export interface IGeoAreaChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof geoAreaChartLoad; + // (undocumented) + save: typeof geoAreaChartSave; +} + +// @internal @deprecated (undocumented) +export interface IGeoChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof geoChartLoad; + // (undocumented) + save: typeof geoChartSave; +} + +// @internal @deprecated (undocumented) +export interface IHeadlineChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof headlineChartLoad; + // (undocumented) + save: typeof headlineChartSave; +} + +// @internal @deprecated (undocumented) +export interface IHeatmapChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof heatmapChartLoad; + // (undocumented) + save: typeof heatmapChartSave; +} + +// @internal @deprecated (undocumented) +export interface ILineChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof lineChartLoad; + // (undocumented) + save: typeof lineChartSave; +} + // @public (undocumented) export interface IMeasureColumnLocator { // (undocumented) measureLocatorItem: IMeasureColumnLocatorBody; } -// Warning: (ae-missing-release-tag) "IMeasureColumnLocatorBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMeasureColumnLocatorBody { // (undocumented) measureIdentifier: string; } -// Warning: (ae-missing-release-tag) "IMeasureColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMeasureColumnWidthItem { // (undocumented) measureColumnWidthItem: IMeasureColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IMeasureColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMeasureColumnWidthItemBody { // (undocumented) @@ -820,16 +1868,12 @@ export interface IMeasureColumnWidthItemBody { width: ColumnWidth; } -// Warning: (ae-missing-release-tag) "IMixedValuesColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMixedValuesColumnWidthItem { // (undocumented) mixedValuesColumnWidthItem: IMixedValuesColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IMixedValuesColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMixedValuesColumnWidthItemBody { // (undocumented) @@ -838,23 +1882,69 @@ export interface IMixedValuesColumnWidthItemBody { width: ColumnWidth; } -// Warning: (ae-missing-release-tag) "InlineVisualizations" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type InlineVisualizations = Record; -// Warning: (ae-missing-release-tag) "ISliceMeasureColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface IPieChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof pieChartLoad; + // (undocumented) + save: typeof pieChartSave; +} + +// @internal @deprecated (undocumented) +export interface IPyramidChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof pyramidChartLoad; + // (undocumented) + save: typeof pyramidChartSave; +} + +// @internal @deprecated (undocumented) +export interface IRepeaterChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof repeaterChartLoad; + // (undocumented) + save: typeof repeaterChartSave; + // (undocumented) + saveInlineVisualizations: typeof saveInlineVisualizations; +} + +// @internal @deprecated (undocumented) +export interface ISankeyChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof sankeyChartLoad; + // (undocumented) + save: typeof sankeyChartSave; +} + +// @internal @deprecated (undocumented) +export interface IScatterChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof scatterChartLoad; + // (undocumented) + save: typeof scatterChartSave; +} + // @public (undocumented) export interface ISliceMeasureColumnWidthItem { // (undocumented) sliceMeasureColumnWidthItem: ISliceMeasureColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "ISliceMeasureColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface ISliceMeasureColumnWidthItemBody { // (undocumented) @@ -863,16 +1953,22 @@ export interface ISliceMeasureColumnWidthItemBody { width: ColumnWidth; } -// Warning: (ae-missing-release-tag) "ITotalColumnLocator" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface ITableConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof tableLoad; + // (undocumented) + save: typeof tableSave; +} + // @public (undocumented) export interface ITotalColumnLocator { // (undocumented) totalLocatorItem: ITotalColumnLocatorBody; } -// Warning: (ae-missing-release-tag) "ITotalColumnLocatorBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface ITotalColumnLocatorBody { // (undocumented) @@ -881,16 +1977,32 @@ export interface ITotalColumnLocatorBody { totalFunction: string; } -// Warning: (ae-missing-release-tag) "IWeakMeasureColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface ITreemapChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof treemapChartLoad; + // (undocumented) + save: typeof treemapChartSave; +} + +// @internal @deprecated (undocumented) +export interface IWaterfallChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof waterfallChartLoad; + // (undocumented) + save: typeof waterfallChartSave; +} + // @public (undocumented) export interface IWeakMeasureColumnWidthItem { // (undocumented) measureColumnWidthItem: IWeakMeasureColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IWeakMeasureColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IWeakMeasureColumnWidthItemBody { // (undocumented) @@ -899,38 +2011,160 @@ export interface IWeakMeasureColumnWidthItemBody { width: IAbsoluteColumnWidth; } -// Warning: (ae-missing-release-tag) "lineChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const lineChart: { - load: typeof load_4; - save: typeof save_4; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const LINE_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const lineChart: ILineChartConfig; + +// @internal (undocumented) +export type LineChartConfigProperties = { + colorMapping: Array; + continuousLine: { + enabled: boolean; + }; + distinctPointShapes: { + enabled: boolean; + pointShapeMapping?: Record; + }; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + dataPoints: { + visible: boolean | "auto"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + forecast: { + enabled: boolean; + confidence: number; + period: number; + seasonal: boolean; + }; + anomalies: { + enabled: boolean; + sensitivity: "low" | "medium" | "high"; + size: "small" | "medium" | "big"; + color: string | number; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; + thresholdMeasures: string[]; + thresholdExcludedMeasures: string[]; }; +// @internal (undocumented) +export function lineChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function lineChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + continuousLine: { + enabled: boolean | undefined; + } | undefined; + distinctPointShapes: { + enabled: boolean | undefined; + pointShapeMapping: Record | undefined; + } | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + dataPoints: { + visible: "auto" | boolean | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + forecast: { + enabled: boolean | undefined; + confidence: number | undefined; + period: number | undefined; + seasonal: boolean | undefined; + } | undefined; + anomalies: { + enabled: boolean | undefined; + sensitivity: "high" | "low" | "medium" | undefined; + size: "big" | "medium" | "small" | undefined; + color: string | number | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; + thresholdMeasures: string[] | undefined; + thresholdExcludedMeasures: string[] | undefined; +} | undefined; + // @public (undocumented) export function loadColorMapping(mappings: Array): YAMLMap; // @public (undocumented) export function loadColumnsWidth(widths: Array): YAMLMap[] | undefined; -// Warning: (ae-missing-release-tag) "MetricTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const MetricTypes: string[]; -// Warning: (ae-missing-release-tag) "OverrideDashboardDefinition" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type OverrideDashboardDefinition = Omit & { filterContextRef?: AfmObjectIdentifier; tabs?: DashboardTab[]; activeTabLocalIdentifier?: string; }; -// Warning: (ae-missing-release-tag) "PatternFillName" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type PatternFillName = "diagonal_grid_small" | "vertical_lines_small" | "grid_small" | "horizontal_lines_small" | "circle_small" | "flag_small" | "waffle_small" | "dot_small" | "pyramid_small" | "needle_small" | "diamond_small" | "pizza_small" | "diagonal_grid_medium" | "vertical_lines_medium" | "grid_large" | "horizontal_lines_medium" | "circle_medium" | "flag_medium" | "waffle_medium" | "dot_medium" | "pyramid_medium" | "needle_medium" | "diamond_medium" | "pizza_medium"; // @public (undocumented) @@ -943,23 +2177,59 @@ type Permissions_2 = { }; export { Permissions_2 as Permissions } -// Warning: (ae-missing-release-tag) "pieChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const pieChart: { - load: typeof load_8; - save: typeof save_8; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const PIE_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const pieChart: IPieChartConfig; + +// @internal (undocumented) +export type PieChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "PluginTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export function pieChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function pieChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) export const PluginTypes: string[]; -// Warning: (ae-missing-release-tag) "PointShapeSymbol" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type PointShapeSymbol = "circle" | "square" | "diamond" | "triangle" | "triangle-down"; // @public (undocumented) @@ -970,61 +2240,301 @@ export type Profile = { data_source?: string; }; -// Warning: (ae-missing-release-tag) "pyramidChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const pyramidChart: { - load: typeof load_11; - save: typeof save_11; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const PYRAMID_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const pyramidChart: IPyramidChartConfig; + +// @internal (undocumented) +export type PyramidChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "repeaterChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const repeaterChart: { - load: typeof load_22; - save: typeof save_22; - saveInlineVisualizations: typeof saveInlineVisualizations; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function pyramidChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function pyramidChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export const REPEATER_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const repeaterChart: IRepeaterChartConfig; + +// @internal (undocumented) +export type RepeaterChartConfigProperties = { + colorMapping: Array; + columnWidths: Array; + cellImageSizing: "fit" | "fill"; + cellTextWrapping: "clip" | "wrap"; + cellVerticalAlign: "top" | "middle" | "bottom"; + rowHeight: "small" | "medium" | "large"; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function repeaterChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function repeaterChartSave(fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + columnWidths: ColumnWidthItem[] | undefined; + colorMapping: ColorMapping[] | undefined; + rowHeight: "large" | "medium" | "small" | undefined; + cellVerticalAlign: "bottom" | "middle" | "top" | undefined; + cellTextWrapping: "clip" | "wrap" | undefined; + cellImageSizing: "fill" | "fit" | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function resolveIdFromFileName(fileName: FilePath): string; -// Warning: (ae-missing-release-tag) "sankeyChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const sankeyChart: { - load: typeof load_17; - save: typeof save_17; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const SANKEY_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const sankeyChart: ISankeyChartConfig; + +// @internal (undocumented) +export type SankeyChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function sankeyChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function sankeyChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function saveColorMapping(mapping: ListOfColors): Array | undefined; // @public (undocumented) export function saveColumnWidths(fields: Visualisation["query"]["fields"], widths: Width[] | undefined): ColumnWidthItem[] | undefined; -// Warning: (ae-missing-release-tag) "scatterChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const scatterChart: { - load: typeof load_6; - save: typeof save_6; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function saveInlineVisualizations(metrics?: Bucket[]): InlineVisualizations; + +// @internal (undocumented) +export const SCATTER_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const scatterChart: IScatterChartConfig; + +// @internal (undocumented) +export type ScatterChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + clustering: { + enabled: boolean; + numberOfClusters: number; + threshold: number; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "table" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const table: { - load: typeof load; - save: typeof save; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function scatterChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function scatterChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + clustering: { + enabled: boolean | undefined; + numberOfClusters: number | undefined; + threshold: number | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal @deprecated (undocumented) +export const table: ITableConfig; + +// @internal (undocumented) +export const TABLE_DEFAULTS: ConfigDefaults; + +// @internal (undocumented) +export type TableConfigProperties = { + columnWidths: Array; + measureGroupDimension: "columns" | "rows"; + columnHeadersPosition: "top" | "left"; + disableDrillDown: boolean; + disableDrillIntoURL: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; + textWrapping: { + wrapText: boolean; + wrapHeaderText: boolean; + columnOverrides: Array<{ + locators: ColumnLocator[]; + wrapText: boolean; + wrapHeaderText: boolean; + matchType: "column" | "pivotGroup"; + }>; + }; + enableAccessibility: boolean; + pagination: { + enabled: boolean; + }; + pageSize: number; + grandTotalsPosition: "pinnedBottom" | "pinnedTop" | "bottom" | "top"; }; +// @internal (undocumented) +export function tableLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function tableSave(fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + columnWidths: ColumnWidthItem[] | undefined; + columnHeadersPosition: string | undefined; + measureGroupDimension: string | undefined; + disableDrillDown: boolean | undefined; + disableDrillIntoURL: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; + textWrapping: { + wrapText: boolean; + wrapHeaderText: boolean; + columnOverrides: { + locators: ColumnLocator[]; + wrapText: boolean; + wrapHeaderText: boolean; + matchType: "column" | "pivotGroup"; + }[]; + } | undefined; + enableAccessibility: boolean | undefined; + pagination: { + enabled: boolean; + } | undefined; + pageSize: number | undefined; + grandTotalsPosition: "bottom" | "pinnedBottom" | "pinnedTop" | "top" | undefined; +} | undefined; + // @public (undocumented) export const toDeclarativePermissions: (permissions?: { VIEW?: Permission | undefined; @@ -1041,15 +2551,55 @@ export type ToExecutionResults = { sorting: Record; }; -// Warning: (ae-missing-release-tag) "treemapChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const treemapChart: { - load: typeof load_10; - save: typeof save_10; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const TREEMAP_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const treemapChart: ITreemapChartConfig; + +// @internal (undocumented) +export type TreemapChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function treemapChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function treemapChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export type ValueType = "string" | "bool" | "number" | "bool_auto" | "array"; @@ -1058,26 +2608,151 @@ export type VisualisationConfig = { controls?: T; }; -// Warning: (ae-missing-release-tag) "VisualisationsTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type VisualisationDefinition = Pick & { + version: string; +}; + +// @internal (undocumented) export const VisualisationsTypes: string[]; -// Warning: (ae-missing-release-tag) "waterfallChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const waterfallChart: { - load: typeof load_15; - save: typeof save_15; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const WATERFALL_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const waterfallChart: IWaterfallChartConfig; + +// @internal (undocumented) +export type WaterfallChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + orientation: { + position: "horizontal" | "vertical"; + }; + total: { + enabled: boolean; + name: string; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function waterfallChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function waterfallChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + orientation: { + position: string | undefined; + } | undefined; + total: { + enabled: boolean | undefined; + name: string | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function yamlAttributeHierarchyToDeclarative(input: AttributeHierarchy): DeclarativeAttributeHierarchy; -// Warning: (ae-missing-release-tag) "yamlBucketsToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlBucketGroup = { + type: BucketsType; + items: YamlBucketGroupItems; +}; + +// @internal (undocumented) +export type YamlBucketGroupItems = Array<{ + field: string; + format?: string; + totals?: YAMLMap[]; + axis?: "primary" | "secondary"; + display_as?: "metric" | "line" | "column"; +} | null>; + +// @internal (undocumented) +export type YamlBuckets = { + fieldsMap: YAMLMap; + groups: YamlBucketGroup[]; + postProcessors: YamlPostProcessors; +}; + +// @internal (undocumented) export function yamlBucketsToDeclarative(entities: ExportEntities, input: Visualisation): { buckets: VisualisationDefinition["buckets"]; positions: Array<{ @@ -1100,9 +2775,13 @@ export function yamlDatasetToDeclarative(entities: ExportEntities, input: Datase // @public (undocumented) export function yamlDateDatesetToDeclarative(input: DateDataset): DeclarativeDateDataset; -// Warning: (ae-missing-release-tag) "yamlFilterContextToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlFieldData = { + format?: string; + axis?: "primary" | "secondary"; +}; + +// @internal (undocumented) export function yamlFilterContextToDeclarative(baseId: string, yamlFilters: DashboardFilters | undefined): { filterContext: DeclarativeFilterContext; dateFilterConfig: IDashboardDateFilterConfig | undefined; @@ -1112,33 +2791,45 @@ export function yamlFilterContextToDeclarative(baseId: string, yamlFilters: Dash filterGroupsConfig: IDashboardFilterGroupsConfig | undefined; }; -// Warning: (ae-missing-release-tag) "yamlFiltersToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlFilterMapEntry = { + yaml: YAMLMap; + filter: IFilter; +}; + +// @internal (undocumented) +export type YamlFilters = { + filtersMap: Record; + filtersArray: YAMLMap; +}; + +// @internal (undocumented) export function yamlFiltersToDeclarative(entities: ExportEntities, filters_by: QueryFilters | Filter[] | undefined, attributeFilterConfigs?: IAttributeFilterConfigs): { filters: IFilter[]; attributeFilterConfigs: IAttributeFilterConfigs | undefined; }; -// Warning: (ae-missing-release-tag) "yamlInteractionToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlInteractionToDeclarative(entities: ExportEntities, visualisation: string, input: Interaction): IDrillToInsight | IDrillToDashboard | IDrillToCustomUrl | IDrillToAttributeUrl | null; // @public (undocumented) export function yamlMetricToDeclarative(input: Metric): DeclarativeMetric; -// Warning: (ae-missing-release-tag) "yamlPluginsToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlPluginsToDeclarative(plugins: Dashboard["plugins"]): IDashboardPluginLink[] | undefined; // @public (undocumented) export function yamlPluginToDeclarative(input: Plugin_2): DeclarativeDashboardPlugin; -// Warning: (ae-missing-release-tag) "yamlReportToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlPostProcessors = { + filters: Array<{ + item: YAMLMap; + filters: IFilter[]; + }>; +}; + +// @internal (undocumented) export function yamlReportToDeclarative(entities: ExportEntities, input: Visualisation): { buckets: VisualisationDefinition["buckets"]; sorts: VisualisationDefinition["sorts"]; @@ -1150,14 +2841,15 @@ export function yamlReportToDeclarative(entities: ExportEntities, input: Visuali attributeFilterConfigs?: IAttributeFilterConfigs; }; -// Warning: (ae-missing-release-tag) "yamlReportTotalToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlReportTotalToDeclarative(totals: Total[] | undefined, attributeIdentifier: string): ITotal[]; -// Warning: (ae-missing-release-tag) "yamlSortsToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlSorts = { + sortsArray: YAMLMap[]; +}; + +// @internal (undocumented) export function yamlSortsToDeclarative(sort_by: Sorts | undefined, fields: Visualisation["query"]["fields"]): ISortItem[]; // @public (undocumented) @@ -1166,89 +2858,12 @@ export function yamlVisualisationToDeclarative(entities: ExportEntities, input: // @public (undocumented) export function yamlVisualisationToMetadataObject(entities: ExportEntities, input: Visualisation): JsonApiVisualizationObjectOut; -// Warning: (ae-forgotten-export) The symbol "DashboardWidget" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "yamlWidgetItemToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlWidgetItemToDeclarative(entities: ExportEntities, input: Widget, enableSectionHeaders?: boolean): DashboardWidget | null; -// Warning: (ae-missing-release-tag) "yamlWidgetToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlWidgetToDeclarative(entities: ExportEntities, input: VisualisationWidget | RichTextWidget | VisualizationSwitcherWidget | ContainerWidget, enableSectionHeaders?: boolean): DashboardWidget["widget"]; -// Warnings were encountered during analysis: -// -// esm/configs/areaChart.d.ts:108:5 - (ae-forgotten-export) The symbol "load_5" needs to be exported by the entry point index.d.ts -// esm/configs/areaChart.d.ts:109:5 - (ae-forgotten-export) The symbol "save_5" needs to be exported by the entry point index.d.ts -// esm/configs/areaChart.d.ts:110:5 - (ae-forgotten-export) The symbol "ConfigDefaults" needs to be exported by the entry point index.d.ts -// esm/configs/areaChart.d.ts:110:5 - (ae-forgotten-export) The symbol "DefaultProperties_5" needs to be exported by the entry point index.d.ts -// esm/configs/barChart.d.ts:96:5 - (ae-forgotten-export) The symbol "load_2" needs to be exported by the entry point index.d.ts -// esm/configs/barChart.d.ts:97:5 - (ae-forgotten-export) The symbol "save_2" needs to be exported by the entry point index.d.ts -// esm/configs/barChart.d.ts:98:5 - (ae-forgotten-export) The symbol "DefaultProperties_2" needs to be exported by the entry point index.d.ts -// esm/configs/bubbleChart.d.ts:88:5 - (ae-forgotten-export) The symbol "load_7" needs to be exported by the entry point index.d.ts -// esm/configs/bubbleChart.d.ts:89:5 - (ae-forgotten-export) The symbol "save_7" needs to be exported by the entry point index.d.ts -// esm/configs/bubbleChart.d.ts:90:5 - (ae-forgotten-export) The symbol "DefaultProperties_7" needs to be exported by the entry point index.d.ts -// esm/configs/bulletChart.d.ts:82:5 - (ae-forgotten-export) The symbol "load_14" needs to be exported by the entry point index.d.ts -// esm/configs/bulletChart.d.ts:83:5 - (ae-forgotten-export) The symbol "save_14" needs to be exported by the entry point index.d.ts -// esm/configs/bulletChart.d.ts:84:5 - (ae-forgotten-export) The symbol "DefaultProperties_14" needs to be exported by the entry point index.d.ts -// esm/configs/columnChart.d.ts:96:5 - (ae-forgotten-export) The symbol "load_3" needs to be exported by the entry point index.d.ts -// esm/configs/columnChart.d.ts:97:5 - (ae-forgotten-export) The symbol "save_3" needs to be exported by the entry point index.d.ts -// esm/configs/columnChart.d.ts:98:5 - (ae-forgotten-export) The symbol "DefaultProperties_3" needs to be exported by the entry point index.d.ts -// esm/configs/comboChart.d.ts:150:5 - (ae-forgotten-export) The symbol "load_19" needs to be exported by the entry point index.d.ts -// esm/configs/comboChart.d.ts:151:5 - (ae-forgotten-export) The symbol "save_19" needs to be exported by the entry point index.d.ts -// esm/configs/comboChart.d.ts:152:5 - (ae-forgotten-export) The symbol "DefaultProperties_19" needs to be exported by the entry point index.d.ts -// esm/configs/dependencyWheelChart.d.ts:32:5 - (ae-forgotten-export) The symbol "load_16" needs to be exported by the entry point index.d.ts -// esm/configs/dependencyWheelChart.d.ts:33:5 - (ae-forgotten-export) The symbol "save_16" needs to be exported by the entry point index.d.ts -// esm/configs/dependencyWheelChart.d.ts:34:5 - (ae-forgotten-export) The symbol "DefaultProperties_16" needs to be exported by the entry point index.d.ts -// esm/configs/donutChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_9" needs to be exported by the entry point index.d.ts -// esm/configs/donutChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_9" needs to be exported by the entry point index.d.ts -// esm/configs/donutChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_9" needs to be exported by the entry point index.d.ts -// esm/configs/funnelChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_12" needs to be exported by the entry point index.d.ts -// esm/configs/funnelChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_12" needs to be exported by the entry point index.d.ts -// esm/configs/funnelChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_12" needs to be exported by the entry point index.d.ts -// esm/configs/geoAreaChart.d.ts:75:5 - (ae-forgotten-export) The symbol "load_21" needs to be exported by the entry point index.d.ts -// esm/configs/geoAreaChart.d.ts:76:5 - (ae-forgotten-export) The symbol "save_21" needs to be exported by the entry point index.d.ts -// esm/configs/geoAreaChart.d.ts:77:5 - (ae-forgotten-export) The symbol "DefaultProperties_21" needs to be exported by the entry point index.d.ts -// esm/configs/geoChart.d.ts:55:5 - (ae-forgotten-export) The symbol "load_20" needs to be exported by the entry point index.d.ts -// esm/configs/geoChart.d.ts:56:5 - (ae-forgotten-export) The symbol "save_20" needs to be exported by the entry point index.d.ts -// esm/configs/geoChart.d.ts:57:5 - (ae-forgotten-export) The symbol "DefaultProperties_20" needs to be exported by the entry point index.d.ts -// esm/configs/headlineChart.d.ts:84:5 - (ae-forgotten-export) The symbol "load_18" needs to be exported by the entry point index.d.ts -// esm/configs/headlineChart.d.ts:85:5 - (ae-forgotten-export) The symbol "save_18" needs to be exported by the entry point index.d.ts -// esm/configs/headlineChart.d.ts:86:5 - (ae-forgotten-export) The symbol "DefaultProperties_18" needs to be exported by the entry point index.d.ts -// esm/configs/heatmapChart.d.ts:70:5 - (ae-forgotten-export) The symbol "load_13" needs to be exported by the entry point index.d.ts -// esm/configs/heatmapChart.d.ts:71:5 - (ae-forgotten-export) The symbol "save_13" needs to be exported by the entry point index.d.ts -// esm/configs/heatmapChart.d.ts:72:5 - (ae-forgotten-export) The symbol "DefaultProperties_13" needs to be exported by the entry point index.d.ts -// esm/configs/lineChart.d.ts:130:5 - (ae-forgotten-export) The symbol "load_4" needs to be exported by the entry point index.d.ts -// esm/configs/lineChart.d.ts:131:5 - (ae-forgotten-export) The symbol "save_4" needs to be exported by the entry point index.d.ts -// esm/configs/lineChart.d.ts:132:5 - (ae-forgotten-export) The symbol "DefaultProperties_4" needs to be exported by the entry point index.d.ts -// esm/configs/pieChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_8" needs to be exported by the entry point index.d.ts -// esm/configs/pieChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_8" needs to be exported by the entry point index.d.ts -// esm/configs/pieChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_8" needs to be exported by the entry point index.d.ts -// esm/configs/pyramidChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_11" needs to be exported by the entry point index.d.ts -// esm/configs/pyramidChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_11" needs to be exported by the entry point index.d.ts -// esm/configs/pyramidChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_11" needs to be exported by the entry point index.d.ts -// esm/configs/repeaterChart.d.ts:30:5 - (ae-forgotten-export) The symbol "load_22" needs to be exported by the entry point index.d.ts -// esm/configs/repeaterChart.d.ts:31:5 - (ae-forgotten-export) The symbol "save_22" needs to be exported by the entry point index.d.ts -// esm/configs/repeaterChart.d.ts:32:5 - (ae-forgotten-export) The symbol "saveInlineVisualizations" needs to be exported by the entry point index.d.ts -// esm/configs/repeaterChart.d.ts:33:5 - (ae-forgotten-export) The symbol "DefaultProperties_22" needs to be exported by the entry point index.d.ts -// esm/configs/sankeyChart.d.ts:34:5 - (ae-forgotten-export) The symbol "load_17" needs to be exported by the entry point index.d.ts -// esm/configs/sankeyChart.d.ts:35:5 - (ae-forgotten-export) The symbol "save_17" needs to be exported by the entry point index.d.ts -// esm/configs/sankeyChart.d.ts:36:5 - (ae-forgotten-export) The symbol "DefaultProperties_17" needs to be exported by the entry point index.d.ts -// esm/configs/scatterChart.d.ts:90:5 - (ae-forgotten-export) The symbol "load_6" needs to be exported by the entry point index.d.ts -// esm/configs/scatterChart.d.ts:91:5 - (ae-forgotten-export) The symbol "save_6" needs to be exported by the entry point index.d.ts -// esm/configs/scatterChart.d.ts:92:5 - (ae-forgotten-export) The symbol "DefaultProperties_6" needs to be exported by the entry point index.d.ts -// esm/configs/table.d.ts:56:5 - (ae-forgotten-export) The symbol "load" needs to be exported by the entry point index.d.ts -// esm/configs/table.d.ts:57:5 - (ae-forgotten-export) The symbol "save" needs to be exported by the entry point index.d.ts -// esm/configs/table.d.ts:58:5 - (ae-forgotten-export) The symbol "DefaultProperties" needs to be exported by the entry point index.d.ts -// esm/configs/treemapChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_10" needs to be exported by the entry point index.d.ts -// esm/configs/treemapChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_10" needs to be exported by the entry point index.d.ts -// esm/configs/treemapChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_10" needs to be exported by the entry point index.d.ts -// esm/configs/waterfallChart.d.ts:104:5 - (ae-forgotten-export) The symbol "load_15" needs to be exported by the entry point index.d.ts -// esm/configs/waterfallChart.d.ts:105:5 - (ae-forgotten-export) The symbol "save_15" needs to be exported by the entry point index.d.ts -// esm/configs/waterfallChart.d.ts:106:5 - (ae-forgotten-export) The symbol "DefaultProperties_15" needs to be exported by the entry point index.d.ts -// esm/to/yamlVisualisationToDeclarative.d.ts:29:5 - (ae-forgotten-export) The symbol "VisualisationDefinition" needs to be exported by the entry point index.d.ts - // (No @packageDocumentation comment for this package) ``` diff --git a/libs/sdk-code-convertors/package.json b/libs/sdk-code-convertors/package.json index 18650cc2108..cd1a1277a38 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData AAC declarative converters", "license": "MIT", "author": "GoodData", @@ -33,7 +33,7 @@ "build-ts": "tsgo -p tsconfig.build.json", "build-wasm": "bash wasm/build.sh", "check-python-types": "node scripts/check-python-types.mjs", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-code-convertors/python/pyproject.toml b/libs/sdk-code-convertors/python/pyproject.toml index c5cfd6abce8..340b1c3988f 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.35.0a5" +version = "11.35.0a6" description = "GoodData AAC YAML / Declarative API code converters (WASM-powered)" readme = "README.md" license = { file = "LICENSE" } diff --git a/libs/sdk-code-convertors/src/configs/areaChart.ts b/libs/sdk-code-convertors/src/configs/areaChart.ts index 3c99888932b..02dc1ad2cea 100644 --- a/libs/sdk-code-convertors/src/configs/areaChart.ts +++ b/libs/sdk-code-convertors/src/configs/areaChart.ts @@ -18,7 +18,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type AreaChartConfigProperties = { colorMapping: Array; distinctPointShapes: { enabled: boolean; @@ -70,7 +71,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], distinctPointShapes: { enabled: false, @@ -120,7 +122,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const AREA_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function areaChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -242,7 +248,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function areaChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -314,8 +321,22 @@ function save( }); } -export const areaChart = { - load, - save, +/** + * @internal + * @deprecated Use areaChartLoad and areaChartSave instead. + */ +export interface IAreaChartConfig { + load: typeof areaChartLoad; + save: typeof areaChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use areaChartLoad and areaChartSave instead. + */ +export const areaChart: IAreaChartConfig = { + load: areaChartLoad, + save: areaChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/barChart.ts b/libs/sdk-code-convertors/src/configs/barChart.ts index c19f8d80f07..229d4674d8d 100644 --- a/libs/sdk-code-convertors/src/configs/barChart.ts +++ b/libs/sdk-code-convertors/src/configs/barChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type BarChartConfigProperties = { colorMapping: Array; dataLabels: { totalsVisible: boolean | "auto"; @@ -59,7 +60,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { totalsVisible: "auto", @@ -104,7 +106,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const BAR_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function barChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -215,7 +221,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function barChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -279,8 +286,22 @@ function save( }); } -export const barChart = { - load, - save, +/** + * @internal + * @deprecated Use barChartLoad and barChartSave instead. + */ +export interface IBarChartConfig { + load: typeof barChartLoad; + save: typeof barChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use barChartLoad and barChartSave instead. + */ +export const barChart: IBarChartConfig = { + load: barChartLoad, + save: barChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/bubbleChart.ts b/libs/sdk-code-convertors/src/configs/bubbleChart.ts index 0bfd123a060..96e131daf28 100644 --- a/libs/sdk-code-convertors/src/configs/bubbleChart.ts +++ b/libs/sdk-code-convertors/src/configs/bubbleChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type BubbleChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -55,7 +56,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: false, @@ -97,7 +99,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const BUBBLE_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function bubbleChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -188,7 +194,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function bubbleChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -243,8 +250,22 @@ function save( }); } -export const bubbleChart = { - load, - save, +/** + * @internal + * @deprecated Use bubbleChartLoad and bubbleChartSave instead. + */ +export interface IBubbleChartConfig { + load: typeof bubbleChartLoad; + save: typeof bubbleChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use bubbleChartLoad and bubbleChartSave instead. + */ +export const bubbleChart: IBubbleChartConfig = { + load: bubbleChartLoad, + save: bubbleChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/bulletChart.ts b/libs/sdk-code-convertors/src/configs/bulletChart.ts index 58b9d3b8623..ac7a83df7a7 100644 --- a/libs/sdk-code-convertors/src/configs/bulletChart.ts +++ b/libs/sdk-code-convertors/src/configs/bulletChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type BulletChartConfigProperties = { colorMapping: Array; legend: { enabled: boolean; @@ -52,7 +53,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], legend: { enabled: true, @@ -90,7 +92,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const BULLET_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function bulletChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -179,7 +185,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function bulletChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -228,8 +235,22 @@ function save( }); } -export const bulletChart = { - load, - save, +/** + * @internal + * @deprecated Use bulletChartLoad and bulletChartSave instead. + */ +export interface IBulletChartConfig { + load: typeof bulletChartLoad; + save: typeof bulletChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use bulletChartLoad and bulletChartSave instead. + */ +export const bulletChart: IBulletChartConfig = { + load: bulletChartLoad, + save: bulletChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/columnChart.ts b/libs/sdk-code-convertors/src/configs/columnChart.ts index 9c457f360d7..74a9363bb09 100644 --- a/libs/sdk-code-convertors/src/configs/columnChart.ts +++ b/libs/sdk-code-convertors/src/configs/columnChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type ColumnChartConfigProperties = { colorMapping: Array; dataLabels: { totalsVisible: boolean | "auto"; @@ -59,7 +60,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { totalsVisible: "auto", @@ -104,7 +106,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const COLUMN_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function columnChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -215,7 +221,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function columnChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -279,8 +286,22 @@ function save( }); } -export const columnChart = { - load, - save, +/** + * @internal + * @deprecated Use columnChartLoad and columnChartSave instead. + */ +export interface IColumnChartConfig { + load: typeof columnChartLoad; + save: typeof columnChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use columnChartLoad and columnChartSave instead. + */ +export const columnChart: IColumnChartConfig = { + load: columnChartLoad, + save: columnChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/comboChart.ts b/libs/sdk-code-convertors/src/configs/comboChart.ts index be98f0819ab..3bfb2914fed 100644 --- a/libs/sdk-code-convertors/src/configs/comboChart.ts +++ b/libs/sdk-code-convertors/src/configs/comboChart.ts @@ -19,7 +19,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type ComboChartConfigProperties = { colorMapping: Array; continuousLine: { enabled: boolean; @@ -92,7 +93,8 @@ type DefaultProperties = { thresholdExcludedMeasures: string[]; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], continuousLine: { enabled: false, @@ -163,7 +165,11 @@ const DEFAULTS: ConfigDefaults = { thresholdExcludedMeasures: [], }; -function load(props: VisualisationConfig) { +/** @internal */ +export const COMBO_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function comboChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -359,7 +365,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function comboChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, buckets: Bucket[] = [], @@ -504,8 +511,22 @@ function save( }); } -export const comboChart = { - load, - save, +/** + * @internal + * @deprecated Use comboChartLoad and comboChartSave instead. + */ +export interface IComboChartConfig { + load: typeof comboChartLoad; + save: typeof comboChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use comboChartLoad and comboChartSave instead. + */ +export const comboChart: IComboChartConfig = { + load: comboChartLoad, + save: comboChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/dependencyWheelChart.ts b/libs/sdk-code-convertors/src/configs/dependencyWheelChart.ts index 570c5fd142b..87eedd56df4 100644 --- a/libs/sdk-code-convertors/src/configs/dependencyWheelChart.ts +++ b/libs/sdk-code-convertors/src/configs/dependencyWheelChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type DependencyWheelChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -27,7 +28,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -41,7 +43,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const DEPENDENCY_WHEEL_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function dependencyWheelChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -83,7 +89,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function dependencyWheelChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -110,8 +117,22 @@ function save( }); } -export const dependencyWheelChart = { - load, - save, +/** + * @internal + * @deprecated Use dependencyWheelChartLoad and dependencyWheelChartSave instead. + */ +export interface IDependencyWheelChartConfig { + load: typeof dependencyWheelChartLoad; + save: typeof dependencyWheelChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use dependencyWheelChartLoad and dependencyWheelChartSave instead. + */ +export const dependencyWheelChart: IDependencyWheelChartConfig = { + load: dependencyWheelChartLoad, + save: dependencyWheelChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/donutChart.ts b/libs/sdk-code-convertors/src/configs/donutChart.ts index 50414601ea9..be281078b21 100644 --- a/libs/sdk-code-convertors/src/configs/donutChart.ts +++ b/libs/sdk-code-convertors/src/configs/donutChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type DonutChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: false, @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const DONUT_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function donutChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function donutChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const donutChart = { - load, - save, +/** + * @internal + * @deprecated Use donutChartLoad and donutChartSave instead. + */ +export interface IDonutChartConfig { + load: typeof donutChartLoad; + save: typeof donutChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use donutChartLoad and donutChartSave instead. + */ +export const donutChart: IDonutChartConfig = { + load: donutChartLoad, + save: donutChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/funnelChart.ts b/libs/sdk-code-convertors/src/configs/funnelChart.ts index b7aa44f4a5d..c08c0b57997 100644 --- a/libs/sdk-code-convertors/src/configs/funnelChart.ts +++ b/libs/sdk-code-convertors/src/configs/funnelChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type FunnelChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const FUNNEL_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function funnelChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function funnelChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const funnelChart = { - load, - save, +/** + * @internal + * @deprecated Use funnelChartLoad and funnelChartSave instead. + */ +export interface IFunnelChartConfig { + load: typeof funnelChartLoad; + save: typeof funnelChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use funnelChartLoad and funnelChartSave instead. + */ +export const funnelChart: IFunnelChartConfig = { + load: funnelChartLoad, + save: funnelChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/geoAreaChart.ts b/libs/sdk-code-convertors/src/configs/geoAreaChart.ts index 416e66b5d77..cbd6051d1c4 100644 --- a/libs/sdk-code-convertors/src/configs/geoAreaChart.ts +++ b/libs/sdk-code-convertors/src/configs/geoAreaChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type GeoAreaChartConfigProperties = { colorMapping: Array; legend: { enabled: boolean; @@ -59,7 +60,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], legend: { enabled: true, @@ -87,7 +89,7 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function sanitizeControls(controls: DefaultProperties): DefaultProperties { +function sanitizeControls(controls: GeoAreaChartConfigProperties): GeoAreaChartConfigProperties { const sanitized = { ...controls }; // Strip center/zoom when bounds are present (bounds is canonical for custom viewport) @@ -114,7 +116,11 @@ function sanitizeControls(controls: DefaultProperties): DefaultProperties { return sanitized; } -function load(props: VisualisationConfig) { +/** @internal */ +export const GEO_AREA_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function geoAreaChartLoad(props: VisualisationConfig) { const sanitizedProps = props.controls ? { controls: sanitizeControls(props.controls) } : props; return loadConfig(sanitizedProps, (key, value) => { switch (key) { @@ -195,7 +201,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function geoAreaChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, _positions: Array<{ longitude: string; latitude: string }>, @@ -284,8 +291,22 @@ function save( }); } -export const geoAreaChart = { - load, - save, +/** + * @internal + * @deprecated Use geoAreaChartLoad and geoAreaChartSave instead. + */ +export interface IGeoAreaChartConfig { + load: typeof geoAreaChartLoad; + save: typeof geoAreaChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use geoAreaChartLoad and geoAreaChartSave instead. + */ +export const geoAreaChart: IGeoAreaChartConfig = { + load: geoAreaChartLoad, + save: geoAreaChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/geoChart.ts b/libs/sdk-code-convertors/src/configs/geoChart.ts index f4541bd70e1..be5f8a92b7f 100644 --- a/libs/sdk-code-convertors/src/configs/geoChart.ts +++ b/libs/sdk-code-convertors/src/configs/geoChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type GeoChartConfigProperties = { colorMapping: Array; legend: { enabled: boolean; @@ -68,7 +69,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], legend: { enabled: true, @@ -105,7 +107,7 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function sanitizeControls(controls: DefaultProperties): DefaultProperties { +function sanitizeControls(controls: GeoChartConfigProperties): GeoChartConfigProperties { const sanitized = { ...controls }; // Strip icon when shapeType is not "oneIcon" @@ -138,7 +140,11 @@ function sanitizeControls(controls: DefaultProperties): DefaultProperties { return sanitized; } -function load(props: VisualisationConfig) { +/** @internal */ +export const GEO_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function geoChartLoad(props: VisualisationConfig) { const sanitizedProps = props.controls ? { controls: sanitizeControls(props.controls) } : props; return loadConfig(sanitizedProps, (key, value) => { switch (key) { @@ -234,7 +240,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function geoChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, positions: Array<{ longitude: string; latitude: string }>, @@ -349,8 +356,22 @@ function save( }); } -export const geoChart = { - load, - save, +/** + * @internal + * @deprecated Use geoChartLoad and geoChartSave instead. + */ +export interface IGeoChartConfig { + load: typeof geoChartLoad; + save: typeof geoChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use geoChartLoad and geoChartSave instead. + */ +export const geoChart: IGeoChartConfig = { + load: geoChartLoad, + save: geoChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/headlineChart.ts b/libs/sdk-code-convertors/src/configs/headlineChart.ts index 829f05e41d3..2386377d3f2 100644 --- a/libs/sdk-code-convertors/src/configs/headlineChart.ts +++ b/libs/sdk-code-convertors/src/configs/headlineChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type HeadlineChartConfigProperties = { comparison: { enabled: boolean; calculationType: "change" | "change_difference" | "ratio" | "difference"; @@ -38,7 +39,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { comparison: { calculationType: "ratio", format: "#,##0%", @@ -63,7 +65,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const HEADLINE_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function headlineChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "comparison": { @@ -142,7 +148,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function headlineChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined = {}, ) { @@ -187,8 +194,22 @@ function save( }); } -export const headlineChart = { - load, - save, +/** + * @internal + * @deprecated Use headlineChartLoad and headlineChartSave instead. + */ +export interface IHeadlineChartConfig { + load: typeof headlineChartLoad; + save: typeof headlineChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use headlineChartLoad and headlineChartSave instead. + */ +export const headlineChart: IHeadlineChartConfig = { + load: headlineChartLoad, + save: headlineChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/heatmapChart.ts b/libs/sdk-code-convertors/src/configs/heatmapChart.ts index ae0bb86cc9b..abc574c90c2 100644 --- a/libs/sdk-code-convertors/src/configs/heatmapChart.ts +++ b/libs/sdk-code-convertors/src/configs/heatmapChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type HeatmapChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -46,7 +47,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -79,7 +81,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const HEATMAP_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function heatmapChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -160,7 +166,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function heatmapChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -206,8 +213,22 @@ function save( }); } -export const heatmapChart = { - load, - save, +/** + * @internal + * @deprecated Use heatmapChartLoad and heatmapChartSave instead. + */ +export interface IHeatmapChartConfig { + load: typeof heatmapChartLoad; + save: typeof heatmapChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use heatmapChartLoad and heatmapChartSave instead. + */ +export const heatmapChart: IHeatmapChartConfig = { + load: heatmapChartLoad, + save: heatmapChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/lineChart.ts b/libs/sdk-code-convertors/src/configs/lineChart.ts index 9b7864579b0..4749b505798 100644 --- a/libs/sdk-code-convertors/src/configs/lineChart.ts +++ b/libs/sdk-code-convertors/src/configs/lineChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type LineChartConfigProperties = { colorMapping: Array; continuousLine: { enabled: boolean; @@ -76,7 +77,8 @@ type DefaultProperties = { thresholdExcludedMeasures: string[]; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], continuousLine: { enabled: false, @@ -138,7 +140,11 @@ const DEFAULTS: ConfigDefaults = { thresholdExcludedMeasures: [], }; -function load(props: VisualisationConfig) { +/** @internal */ +export const LINE_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function lineChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -296,7 +302,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function lineChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -389,8 +396,22 @@ function save( }); } -export const lineChart = { - load, - save, +/** + * @internal + * @deprecated Use lineChartLoad and lineChartSave instead. + */ +export interface ILineChartConfig { + load: typeof lineChartLoad; + save: typeof lineChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use lineChartLoad and lineChartSave instead. + */ +export const lineChart: ILineChartConfig = { + load: lineChartLoad, + save: lineChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/pieChart.ts b/libs/sdk-code-convertors/src/configs/pieChart.ts index aab9c143e19..2bc2309f945 100644 --- a/libs/sdk-code-convertors/src/configs/pieChart.ts +++ b/libs/sdk-code-convertors/src/configs/pieChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type PieChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: false, @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const PIE_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function pieChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function pieChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const pieChart = { - load, - save, +/** + * @internal + * @deprecated Use pieChartLoad and pieChartSave instead. + */ +export interface IPieChartConfig { + load: typeof pieChartLoad; + save: typeof pieChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use pieChartLoad and pieChartSave instead. + */ +export const pieChart: IPieChartConfig = { + load: pieChartLoad, + save: pieChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/pyramidChart.ts b/libs/sdk-code-convertors/src/configs/pyramidChart.ts index 3ced301ced1..5be2bc62131 100644 --- a/libs/sdk-code-convertors/src/configs/pyramidChart.ts +++ b/libs/sdk-code-convertors/src/configs/pyramidChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type PyramidChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const PYRAMID_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function pyramidChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function pyramidChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const pyramidChart = { - load, - save, +/** + * @internal + * @deprecated Use pyramidChartLoad and pyramidChartSave instead. + */ +export interface IPyramidChartConfig { + load: typeof pyramidChartLoad; + save: typeof pyramidChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use pyramidChartLoad and pyramidChartSave instead. + */ +export const pyramidChart: IPyramidChartConfig = { + load: pyramidChartLoad, + save: pyramidChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/repeaterChart.ts b/libs/sdk-code-convertors/src/configs/repeaterChart.ts index 0a77802eeb1..5dfb9039718 100644 --- a/libs/sdk-code-convertors/src/configs/repeaterChart.ts +++ b/libs/sdk-code-convertors/src/configs/repeaterChart.ts @@ -19,7 +19,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type RepeaterChartConfigProperties = { colorMapping: Array; columnWidths: Array; cellImageSizing: "fit" | "fill"; @@ -30,6 +31,7 @@ type DefaultProperties = { disableScheduledExports: boolean; }; +/** @internal */ export type InlineVisualizations = Record< string, { @@ -37,7 +39,8 @@ export type InlineVisualizations = Record< } >; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], columnWidths: [], rowHeight: "small", @@ -48,7 +51,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const REPEATER_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function repeaterChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "columnWidths": { @@ -115,7 +122,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function repeaterChartSave( fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -139,7 +147,8 @@ function save( }); } -function saveInlineVisualizations(metrics: Bucket[] = []) { +/** @internal */ +export function saveInlineVisualizations(metrics: Bucket[] = []) { return metrics?.reduce((map, b) => { const bucket = getFullBucket(b); if (bucket.display_as && bucket.field) { @@ -151,9 +160,24 @@ function saveInlineVisualizations(metrics: Bucket[] = []) { }, {}); } -export const repeaterChart = { - load, - save, +/** + * @internal + * @deprecated Use repeaterChartLoad and repeaterChartSave instead. + */ +export interface IRepeaterChartConfig { + load: typeof repeaterChartLoad; + save: typeof repeaterChartSave; + saveInlineVisualizations: typeof saveInlineVisualizations; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use repeaterChartLoad and repeaterChartSave instead. + */ +export const repeaterChart: IRepeaterChartConfig = { + load: repeaterChartLoad, + save: repeaterChartSave, saveInlineVisualizations, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/sankeyChart.ts b/libs/sdk-code-convertors/src/configs/sankeyChart.ts index db190729270..0938c052ee9 100644 --- a/libs/sdk-code-convertors/src/configs/sankeyChart.ts +++ b/libs/sdk-code-convertors/src/configs/sankeyChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type SankeyChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -28,7 +29,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -43,7 +45,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const SANKEY_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function sankeyChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -86,7 +92,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function sankeyChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -114,8 +121,22 @@ function save( }); } -export const sankeyChart = { - load, - save, +/** + * @internal + * @deprecated Use sankeyChartLoad and sankeyChartSave instead. + */ +export interface ISankeyChartConfig { + load: typeof sankeyChartLoad; + save: typeof sankeyChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use sankeyChartLoad and sankeyChartSave instead. + */ +export const sankeyChart: ISankeyChartConfig = { + load: sankeyChartLoad, + save: sankeyChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/scatterChart.ts b/libs/sdk-code-convertors/src/configs/scatterChart.ts index f4d741311cb..f370561f07f 100644 --- a/libs/sdk-code-convertors/src/configs/scatterChart.ts +++ b/libs/sdk-code-convertors/src/configs/scatterChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type ScatterChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -56,7 +57,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: false, @@ -99,7 +101,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const SCATTER_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function scatterChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -204,7 +210,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function scatterChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -268,8 +275,22 @@ function save( }); } -export const scatterChart = { - load, - save, +/** + * @internal + * @deprecated Use scatterChartLoad and scatterChartSave instead. + */ +export interface IScatterChartConfig { + load: typeof scatterChartLoad; + save: typeof scatterChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use scatterChartLoad and scatterChartSave instead. + */ +export const scatterChart: IScatterChartConfig = { + load: scatterChartLoad, + save: scatterChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/table.ts b/libs/sdk-code-convertors/src/configs/table.ts index c139cd8efa1..cf371df2821 100644 --- a/libs/sdk-code-convertors/src/configs/table.ts +++ b/libs/sdk-code-convertors/src/configs/table.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type TableConfigProperties = { columnWidths: Array; measureGroupDimension: "columns" | "rows"; columnHeadersPosition: "top" | "left"; @@ -39,7 +40,8 @@ type DefaultProperties = { grandTotalsPosition: "pinnedBottom" | "pinnedTop" | "bottom" | "top"; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { columnWidths: [], measureGroupDimension: "columns", columnHeadersPosition: "top", @@ -60,7 +62,7 @@ const DEFAULTS: ConfigDefaults = { grandTotalsPosition: "pinnedBottom", }; -type TextWrapping = DefaultProperties["textWrapping"]; +type TextWrapping = TableConfigProperties["textWrapping"]; type TextWrappingOverride = TextWrapping["columnOverrides"][number]; function loadTextWrapping(value: TextWrapping | undefined): object | undefined { @@ -142,7 +144,11 @@ function saveTextWrapping(value: YamlTextWrapping | undefined): TextWrapping | u }; } -function load(props: VisualisationConfig) { +/** @internal */ +export const TABLE_DEFAULTS = DEFAULTS; + +/** @internal */ +export function tableLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "columnWidths": { @@ -208,7 +214,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function tableSave( fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -244,8 +251,22 @@ function save( }); } -export const table = { - load, - save, +/** + * @internal + * @deprecated Use tableLoad and tableSave instead. + */ +export interface ITableConfig { + load: typeof tableLoad; + save: typeof tableSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use tableLoad and tableSave instead. + */ +export const table: ITableConfig = { + load: tableLoad, + save: tableSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/treemapChart.ts b/libs/sdk-code-convertors/src/configs/treemapChart.ts index de5055892cc..216ae222566 100644 --- a/libs/sdk-code-convertors/src/configs/treemapChart.ts +++ b/libs/sdk-code-convertors/src/configs/treemapChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type TreemapChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const TREEMAP_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function treemapChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function treemapChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const treemapChart = { - load, - save, +/** + * @internal + * @deprecated Use treemapChartLoad and treemapChartSave instead. + */ +export interface ITreemapChartConfig { + load: typeof treemapChartLoad; + save: typeof treemapChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use treemapChartLoad and treemapChartSave instead. + */ +export const treemapChart: ITreemapChartConfig = { + load: treemapChartLoad, + save: treemapChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/types.ts b/libs/sdk-code-convertors/src/configs/types.ts index 506bb3d5c08..00f42694bc7 100644 --- a/libs/sdk-code-convertors/src/configs/types.ts +++ b/libs/sdk-code-convertors/src/configs/types.ts @@ -1,5 +1,6 @@ // (C) 2023-2026 GoodData Corporation +/** @public */ export type ColorMapping = { id: string; color: @@ -17,15 +18,19 @@ export type ColorMapping = { }; }; +/** @internal */ export type PointShapeSymbol = "circle" | "square" | "diamond" | "triangle" | "triangle-down"; +/** @internal */ export interface IChartFill { type: ChartFillType; measureToPatternName?: Record; } +/** @internal */ export type ChartFillType = "solid" | "pattern" | "outline"; +/** @internal */ export type PatternFillName = | "diagonal_grid_small" | "vertical_lines_small" @@ -52,98 +57,121 @@ export type PatternFillName = | "diamond_medium" | "pizza_medium"; +/** @public */ export type ColumnLocator = IAttributeColumnLocator | IMeasureColumnLocator | ITotalColumnLocator; +/** @public */ export interface IAttributeColumnLocatorBody { attributeIdentifier: string; element?: string | null; } +/** @public */ export interface ITotalColumnLocatorBody { attributeIdentifier: string; totalFunction: string; } +/** @public */ export interface IAttributeColumnLocator { attributeLocatorItem: IAttributeColumnLocatorBody; } +/** @public */ export interface ITotalColumnLocator { totalLocatorItem: ITotalColumnLocatorBody; } +/** @public */ export interface IAttributeColumnWidthItem { attributeColumnWidthItem: IAttributeColumnWidthItemBody; } +/** @public */ export interface IAttributeColumnWidthItemBody { width: IAbsoluteColumnWidth; attributeIdentifier: string; } +/** @public */ export interface IMeasureColumnWidthItemBody { width: ColumnWidth; locators: ColumnLocator[]; } +/** @public */ export interface IMeasureColumnWidthItem { measureColumnWidthItem: IMeasureColumnWidthItemBody; } +/** @public */ export interface ISliceMeasureColumnWidthItemBody { width: ColumnWidth; locators: IMeasureColumnLocator[]; } +/** @public */ export interface ISliceMeasureColumnWidthItem { sliceMeasureColumnWidthItem: ISliceMeasureColumnWidthItemBody; } +/** @public */ export interface IMixedValuesColumnWidthItemBody { width: ColumnWidth; locators: IMeasureColumnLocator[]; } +/** @public */ export interface IAbsoluteColumnWidth { value: number; allowGrowToFit?: boolean; } +/** @public */ export type ColumnWidth = IAbsoluteColumnWidth | IAutoColumnWidth; +/** @public */ export interface IAutoColumnWidth { value: "auto"; } +/** @public */ export interface IMixedValuesColumnWidthItem { mixedValuesColumnWidthItem: IMixedValuesColumnWidthItemBody; } +/** @public */ export interface IAllMeasureColumnWidthItemBody { width: IAbsoluteColumnWidth; } +/** @public */ export interface IAllMeasureColumnWidthItem { measureColumnWidthItem: IAllMeasureColumnWidthItemBody; } +/** @public */ export interface IWeakMeasureColumnWidthItemBody { width: IAbsoluteColumnWidth; locator: IMeasureColumnLocator; } +/** @public */ export interface IWeakMeasureColumnWidthItem { measureColumnWidthItem: IWeakMeasureColumnWidthItemBody; } +/** @public */ export interface IMeasureColumnLocatorBody { measureIdentifier: string; } +/** @public */ export interface IMeasureColumnLocator { measureLocatorItem: IMeasureColumnLocatorBody; } +/** @public */ export type ColumnWidthItem = | IAttributeColumnWidthItem | IMeasureColumnWidthItem diff --git a/libs/sdk-code-convertors/src/configs/utils.ts b/libs/sdk-code-convertors/src/configs/utils.ts index 2856884cdf0..c12cea197fa 100644 --- a/libs/sdk-code-convertors/src/configs/utils.ts +++ b/libs/sdk-code-convertors/src/configs/utils.ts @@ -9,6 +9,7 @@ export type VisualisationConfig = { controls?: T; }; +/** @internal */ export type ConfigDefaults = { [key in keyof T]: T[key]; }; diff --git a/libs/sdk-code-convertors/src/configs/waterfallChart.ts b/libs/sdk-code-convertors/src/configs/waterfallChart.ts index ad7fc58b97e..5f86d2eee3c 100644 --- a/libs/sdk-code-convertors/src/configs/waterfallChart.ts +++ b/libs/sdk-code-convertors/src/configs/waterfallChart.ts @@ -18,7 +18,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type WaterfallChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -68,7 +69,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -117,7 +119,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const WATERFALL_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function waterfallChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -224,7 +230,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function waterfallChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -284,8 +291,22 @@ function save( }); } -export const waterfallChart = { - load, - save, +/** + * @internal + * @deprecated Use waterfallChartLoad and waterfallChartSave instead. + */ +export interface IWaterfallChartConfig { + load: typeof waterfallChartLoad; + save: typeof waterfallChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use waterfallChartLoad and waterfallChartSave instead. + */ +export const waterfallChart: IWaterfallChartConfig = { + load: waterfallChartLoad, + save: waterfallChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/conts.ts b/libs/sdk-code-convertors/src/conts.ts index 751ecb24443..d1e6513fcc2 100644 --- a/libs/sdk-code-convertors/src/conts.ts +++ b/libs/sdk-code-convertors/src/conts.ts @@ -1,17 +1,24 @@ // (C) 2024-2026 GoodData Corporation +/** @internal */ export const DatasetTypes = ["dataset"]; +/** @internal */ export const DateDatasetTypes = ["date"]; +/** @internal */ export const MetricTypes = ["metric"]; +/** @internal */ export const DashboardTypes = ["dashboard"]; +/** @internal */ export const PluginTypes = ["plugin"]; +/** @internal */ export const AttributeHierarchyTypes = ["attribute_hierarchy"]; +/** @internal */ export const VisualisationsTypes = [ "table", "bar_chart", @@ -37,6 +44,7 @@ export const VisualisationsTypes = [ "repeater_chart", ]; +/** @internal */ export const AllTypes = [ ...DatasetTypes, ...DateDatasetTypes, diff --git a/libs/sdk-code-convertors/src/from/declarativeDashboardToYaml.ts b/libs/sdk-code-convertors/src/from/declarativeDashboardToYaml.ts index cfa451279ab..f291ac5aba1 100644 --- a/libs/sdk-code-convertors/src/from/declarativeDashboardToYaml.ts +++ b/libs/sdk-code-convertors/src/from/declarativeDashboardToYaml.ts @@ -68,6 +68,7 @@ import { getIdentifier, } from "../utils/yamlUtils.js"; +/** @internal */ export type OverrideDashboardDefinition = Omit & { filterContextRef?: AfmObjectIdentifier; tabs?: DashboardTab[]; @@ -237,6 +238,7 @@ export function declarativeDashboardToYaml( }; } +/** @internal */ export function declarativeTabsToYaml( tabs: DashboardTab[], filterContexts?: DeclarativeFilterContext[], @@ -308,6 +310,7 @@ export function declarativeTabsToYaml( return yamlTabs; } +/** @internal */ export function declarativeSectionsToYaml( layout?: IDashboardLayout, entities?: FromEntities, @@ -355,6 +358,7 @@ export function declarativeSectionsToYaml( return sections; } +/** @internal */ export function declarativeWidgetToYaml( widget?: IDashboardWidget | null, size?: IDashboardLayoutItem["size"], @@ -696,6 +700,7 @@ export function declarativeContainerWidgetToYaml( return yamlWidget; } +/** @internal */ export function declarativeDrillToYaml( drill: InsightDrillDefinition, entities?: FromEntities, @@ -994,6 +999,7 @@ function sourceMeasureFilterRefsToYaml( .filter(Boolean) as string[]; } +/** @internal */ export type FilterContextItem = { yaml: YAMLMap; filter: IFilterContextDefinition["filters"][number] }; type EmptyValueHandling = NonNullable; @@ -1005,6 +1011,7 @@ function getDateFilterEmptyValueHandling(filter: IDashboardDateFilter): EmptyVal return undefined; } +/** @internal */ export function declarativeFilterContextToYaml( dateFilterConfig?: IDashboardDateFilterConfig, filterContext?: DeclarativeFilterContext, @@ -1367,6 +1374,7 @@ function declarativeMeasureValueFilterToYaml( return measureValueFilter; } +/** @internal */ export function declarativeFiltersConfigToYaml( filtersMap: Record, dateFilterConfig?: IDashboardDateFilterConfig, @@ -1531,6 +1539,7 @@ function getFilterGroupIdBase({ title, localIdentifier }: IDashboardFilterGroup) .toLowerCase(); } +/** @internal */ export function declarativePluginsToYaml(dashboard: IDashboardDefinition, errorContext?: IErrorContext) { if (!dashboard.plugins?.length) { return; diff --git a/libs/sdk-code-convertors/src/from/declarativeVisualisationToYaml.ts b/libs/sdk-code-convertors/src/from/declarativeVisualisationToYaml.ts index d5d971afdbe..ef5fd5e5324 100644 --- a/libs/sdk-code-convertors/src/from/declarativeVisualisationToYaml.ts +++ b/libs/sdk-code-convertors/src/from/declarativeVisualisationToYaml.ts @@ -177,7 +177,7 @@ export function declarativeVisualisationToYaml( type Report = { report: YAMLMap; - derivedBuckets: BucketGroup[]; + derivedBuckets: YamlBucketGroup[]; }; function declarativeReportToYaml( @@ -266,7 +266,7 @@ function declarativeReportToYaml( function appendLayerFieldsToReport( fieldsMap: YAMLMap, - postProcessors: PostProcessors, + postProcessors: YamlPostProcessors, entities: FromEntities, layers?: IInsightLayerDefinition[], errorContext?: IErrorContext, @@ -340,7 +340,7 @@ function getPairKeyValue(pair: Pair): string | undefined { export function declarativeFiltersConfigToYaml( insight: IInsightDefinition["insight"], - filtersMap: Record, + filtersMap: Record, errorContext?: IErrorContext, ) { Object.keys(insight.attributeFilterConfigs ?? {}).forEach((key) => { @@ -367,6 +367,7 @@ export function declarativeFiltersConfigToYaml( }); } +/** @internal */ export function declarativeVisTypeToYaml(def: IInsightDefinition["insight"]): string | null { switch (def.visualizationUrl) { case "local:table": @@ -506,17 +507,20 @@ function declarativeVisToYaml( //buckets -type PostProcessors = { +/** @internal */ +export type YamlPostProcessors = { filters: Array<{ item: YAMLMap; filters: IFilter[] }>; }; -type Buckets = { +/** @internal */ +export type YamlBuckets = { fieldsMap: YAMLMap; - groups: BucketGroup[]; - postProcessors: PostProcessors; + groups: YamlBucketGroup[]; + postProcessors: YamlPostProcessors; }; -type BucketGroupItems = Array<{ +/** @internal */ +export type YamlBucketGroupItems = Array<{ field: string; format?: string; totals?: YAMLMap[]; @@ -524,28 +528,36 @@ type BucketGroupItems = Array<{ display_as?: "metric" | "line" | "column"; } | null>; -type BucketGroup = { +/** @internal */ +export type YamlBucketGroup = { type: BucketsType; - items: BucketGroupItems; + items: YamlBucketGroupItems; }; -type FieldData = { +/** @internal */ +export type YamlFieldData = { format?: string; axis?: "primary" | "secondary"; }; +/** @internal */ export function declarativeBucketsToYaml( entities: FromEntities, buckets: IBucket[], errorContext?: IErrorContext, -): Buckets { +): YamlBuckets { const fullFieldsMap = new YAMLMap(); - const groups: BucketGroup[] = []; - const postProcessors: PostProcessors = { + const groups: YamlBucketGroup[] = []; + const postProcessors: YamlPostProcessors = { filters: [], }; - const addField = (local: string, def: YAMLMap, group: BucketGroup, { format, axis }: FieldData = {}) => { + const addField = ( + local: string, + def: YAMLMap, + group: YamlBucketGroup, + { format, axis }: YamlFieldData = {}, + ) => { fullFieldsMap.add(new Pair(local, def)); group.items.push(createBucketGroupItem(local, format, axis)); }; @@ -553,7 +565,7 @@ export function declarativeBucketsToYaml( //create buckets buckets.forEach((bucket, bi) => { if (isBucket(bucket)) { - const group: BucketGroup = { items: [], type: bucket.localIdentifier as BucketsType }; + const group: YamlBucketGroup = { items: [], type: bucket.localIdentifier as BucketsType }; const attributesMap: Record = {}; const isLocation = bucket.localIdentifier === BucketsType.Location; @@ -679,6 +691,7 @@ export function declarativeBucketsToYaml( }; } +/** @internal */ export function declarativeAttributeToYaml(def: IAttributeBody, errorContext?: IErrorContext): YAMLMap { const map = new YAMLMap(); @@ -701,6 +714,7 @@ export function declarativeAttributeToYaml(def: IAttributeBody, errorContext?: I return map; } +/** @internal */ export function declarativeInlineMetricToYaml( def: IMeasureBody, inlineDef: IInlineMeasureDefinition, @@ -715,10 +729,11 @@ export function declarativeInlineMetricToYaml( return map; } +/** @internal */ export function declarativeNormalMetricToYaml( def: IMeasureBody, metricDefinition: IMeasureDefinition, - postProcessors: PostProcessors, + postProcessors: YamlPostProcessors, errorContext?: IErrorContext, ): YAMLMap { const map = new YAMLMap(); @@ -748,6 +763,7 @@ export function declarativeNormalMetricToYaml( return map; } +/** @internal */ export function declarativeArithmeticMetricToYaml( def: IMeasureBody, arithmeticDefinition: IArithmeticMeasureDefinition, @@ -763,6 +779,7 @@ export function declarativeArithmeticMetricToYaml( return map; } +/** @internal */ export function declarativePoPMetricToYaml( def: IMeasureBody, popDefinition: IPoPMeasureDefinition, @@ -789,6 +806,7 @@ export function declarativePoPMetricToYaml( return map; } +/** @internal */ export function declarativePreviousPeriodMetricToYaml( def: IMeasureBody, previousDefinition: IPreviousPeriodMeasureDefinition, @@ -841,7 +859,7 @@ function createBucketGroupItem( field: string, format?: string, axis?: "primary" | "secondary", -): BucketGroupItems[number] { +): YamlBucketGroupItems[number] { return { field, ...(format ? { format } : {}), @@ -861,13 +879,15 @@ function getShortenedBucket(def: YAMLMap): string | false { //filters -type FilterMapEntry = { +/** @internal */ +export type YamlFilterMapEntry = { yaml: YAMLMap; filter: IFilter; }; -type Filters = { - filtersMap: Record; +/** @internal */ +export type YamlFilters = { + filtersMap: Record; filtersArray: YAMLMap; }; @@ -985,13 +1005,14 @@ function groupFiltersByDateFilter(filters: IFilter[]): { return result; } +/** @internal */ export function declarativeFiltersToYaml( entities: FromEntities, filters: IFilter[], errorContext?: IErrorContext, -): Filters { +): YamlFilters { const filtersArray: Array = []; - const filtersMap: Record = {}; + const filtersMap: Record = {}; const usedKeys = new Set(); const getUniqueKey = (baseKey: string) => { @@ -1233,6 +1254,7 @@ function processConnectedAttributeFilters( }); } +/** @internal */ export function declarativeAbsoluteDateFilterToYaml( absoluteDateFilter: IAbsoluteDateFilter["absoluteDateFilter"], connectedAttributeFilters: IFilter[] = [], @@ -1279,6 +1301,7 @@ function isRelativeDateFilterAllTime( return granularity === "GDC.time.year" && from === undefined && to === undefined; } +/** @internal */ export function declarativeRelativeDateFilterToYaml( relativeDateFilter: IRelativeDateFilter["relativeDateFilter"], connectedAttributeFilters: IFilter[] = [], @@ -1319,6 +1342,7 @@ export function declarativeRelativeDateFilterToYaml( return map; } +/** @internal */ export function declarativePositiveAttributeFilterToYaml( entities: FromEntities, attributeFilter: IPositiveAttributeFilterBody, @@ -1347,6 +1371,7 @@ export function declarativePositiveAttributeFilterToYaml( return map; } +/** @internal */ export function declarativeNegativeAttributeFilterToYaml( entities: FromEntities, attributeFilter: INegativeAttributeFilterBody, @@ -1473,6 +1498,7 @@ function addConditionToYamlMap(conditionMap: YAMLMap, condition: MeasureValueFil return hasTreatNullValues; } +/** @internal */ export function declarativeMeasureValueFilterToYaml( measureValueFilter: IMeasureValueFilterBody, errorContext?: IErrorContext, @@ -1541,6 +1567,7 @@ export function declarativeMeasureValueFilterToYaml( return map; } +/** @internal */ export function declarativeRankingFilterToYaml( rankingFilter: IRankingFilterBody, errorContext?: IErrorContext, @@ -1588,11 +1615,13 @@ export function declarativeRankingFilterToYaml( //sorts -type Sorts = { +/** @internal */ +export type YamlSorts = { sortsArray: YAMLMap[]; }; -export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErrorContext): Sorts { +/** @internal */ +export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErrorContext): YamlSorts { const sortsArray: YAMLMap[] = []; sorts.forEach((sort) => { @@ -1609,6 +1638,7 @@ export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErro }; } +/** @internal */ export function declarativeAttributeSortToYaml(sort: IAttributeSortItem): YAMLMap { const { attributeIdentifier, aggregation, direction } = sort.attributeSortItem; const map = new YAMLMap(); @@ -1623,6 +1653,7 @@ export function declarativeAttributeSortToYaml(sort: IAttributeSortItem): YAMLMa return map; } +/** @internal */ export function declarativeMeasureSortToYaml(sort: IMeasureSortItem): YAMLMap { const { locators, direction } = sort.measureSortItem; const map = new YAMLMap(); @@ -1810,7 +1841,7 @@ function declarativeVisScatterToYaml( //buckets const metrics1 = report.derivedBuckets.find((item) => item.type === BucketsType.Measures); const metrics2 = report.derivedBuckets.find((item) => item.type === BucketsType.SecondaryMeasures); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([ ...(metrics1?.items.length ? metrics1.items : [null]), ...(metrics2?.items.length ? metrics2.items : [null]), @@ -1846,7 +1877,7 @@ function declarativeVisBubbleToYaml( //buckets const metrics1 = report.derivedBuckets.find((item) => item.type === BucketsType.Measures); const metrics2 = report.derivedBuckets.find((item) => item.type === BucketsType.SecondaryMeasures); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([ ...(metrics1?.items.length ? metrics1.items : [null]), ...(metrics2?.items.length ? metrics2.items : [null]), @@ -2031,7 +2062,7 @@ function declarativeVisBulletToYaml( const metrics1 = report.derivedBuckets.find((item) => item.type === BucketsType.Measures); const metrics2 = report.derivedBuckets.find((item) => item.type === BucketsType.SecondaryMeasures); const metrics3 = report.derivedBuckets.find((item) => item.type === BucketsType.TertiaryMeasures); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([ ...(metrics1?.items.length ? metrics1.items : [null]), ...(metrics2?.items.length ? metrics2.items : [null]), @@ -2091,7 +2122,7 @@ function declarativeVisDependencyWheelToYaml( const from = report.derivedBuckets.find((item) => item.type === BucketsType.AttributeFrom); const to = report.derivedBuckets.find((item) => item.type === BucketsType.AttributeTo); - const view: BucketGroup = { + const view: YamlBucketGroup = { items: cleanUpItems([ ...(from?.items.length ? from.items : [null]), ...(to?.items.length ? to.items : [null]), @@ -2123,7 +2154,7 @@ function declarativeVisSankeyToYaml( const from = report.derivedBuckets.find((item) => item.type === BucketsType.AttributeFrom); const to = report.derivedBuckets.find((item) => item.type === BucketsType.AttributeTo); - const view: BucketGroup = { + const view: YamlBucketGroup = { items: cleanUpItems([ ...(from?.items.length ? from.items : [null]), ...(to?.items.length ? to.items : [null]), @@ -2150,7 +2181,7 @@ function declarativeVisHeadlineToYaml( //buckets const metrics1 = report.derivedBuckets.find((item) => item.type === BucketsType.Measures); const metrics2 = report.derivedBuckets.find((item) => item.type === BucketsType.SecondaryMeasures); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: [...(metrics1?.items ?? [null]), ...(metrics2?.items ?? [])], type: BucketsType.Measures, }; @@ -2180,7 +2211,7 @@ function declarativeVisComboToYaml( "secondary", ); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: [...(metrics1?.items ?? []), ...(metrics2?.items ?? [])], type: BucketsType.Measures, }; @@ -2199,11 +2230,11 @@ function declarativeVisComboToYaml( } } -function addPushpinBucketsToYaml(target: Document | YAMLMap, groups: BucketGroup[]) { +function addPushpinBucketsToYaml(target: Document | YAMLMap, groups: YamlBucketGroup[]) { const sizeBucket = groups.find((item) => item.type === BucketsType.Size); const colorBucket = groups.find((item) => item.type === BucketsType.Color); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([ ...(sizeBucket?.items.length ? sizeBucket.items : [null]), ...(colorBucket?.items ? colorBucket.items : [null]), @@ -2226,10 +2257,10 @@ function addPushpinBucketsToYaml(target: Document | YAMLMap, groups: BucketGroup } } -function addGeoAreaBucketsToYaml(target: Document | YAMLMap, groups: BucketGroup[]) { +function addGeoAreaBucketsToYaml(target: Document | YAMLMap, groups: YamlBucketGroup[]) { const colorBucket = groups.find((item) => item.type === BucketsType.Color); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([...(colorBucket?.items.length ? colorBucket.items : [null])]), type: BucketsType.Measures, }; @@ -2334,6 +2365,7 @@ function declarativeVisRepeaterToYaml( //TOTALS +/** @internal */ export function declarativeTotalToYaml(total: ITotal, _errorContext?: IErrorContext) { const map = new YAMLMap(); @@ -2350,7 +2382,7 @@ export function declarativeTotalToYaml(total: ITotal, _errorContext?: IErrorCont }; } -function groupToYaml(group: BucketGroup) { +function groupToYaml(group: YamlBucketGroup) { return group.items.map((item) => { if (!item) { return null; @@ -2380,7 +2412,7 @@ function groupToYaml(group: BucketGroup) { }); } -function addAxisTypeToGroup(group: BucketGroup | undefined, axis: "primary" | "secondary") { +function addAxisTypeToGroup(group: YamlBucketGroup | undefined, axis: "primary" | "secondary") { if (!group) { return undefined; } @@ -2399,7 +2431,7 @@ function addAxisTypeToGroup(group: BucketGroup | undefined, axis: "primary" | "s } function addChartTypeToGroup( - group: BucketGroup | undefined, + group: YamlBucketGroup | undefined, config: IInsightDefinition["insight"]["properties"], ) { if (!group || !config) { @@ -2482,7 +2514,7 @@ function resolveLayerExportKind(rawLayerType?: string, errorContext?: IErrorCont function appendLayerBucketsForKind( layerMap: YAMLMap, - groups: BucketGroup[], + groups: YamlBucketGroup[], kind: LayerExportKind, errorContext?: IErrorContext, ) { diff --git a/libs/sdk-code-convertors/src/index.ts b/libs/sdk-code-convertors/src/index.ts index a5154a77a4a..f17e293608c 100644 --- a/libs/sdk-code-convertors/src/index.ts +++ b/libs/sdk-code-convertors/src/index.ts @@ -46,6 +46,7 @@ export { yamlReportToDeclarative, yamlReportTotalToDeclarative, yamlSortsToDeclarative, + type VisualisationDefinition, } from "./to/yamlVisualisationToDeclarative.js"; export { yamlDashboardToDeclarative, @@ -54,6 +55,11 @@ export { yamlPluginsToDeclarative, yamlWidgetItemToDeclarative, yamlWidgetToDeclarative, + type DashboardDefinition, + type DashboardSection, + type DashboardWidget, + type EmptyValueHandling, + type FilterContextDefinition, } from "./to/yamlDashboardToDeclarative.js"; export { yamlPluginToDeclarative } from "./to/yamlPluginToDeclarative.js"; export { yamlAttributeHierarchyToDeclarative } from "./to/yamlAttributeHierarchyToDeclarative.js"; @@ -83,6 +89,14 @@ export { declarativeRelativeDateFilterToYaml, declarativeSortsToYaml, declarativeTotalToYaml, + type YamlSorts, + type YamlPostProcessors, + type YamlBuckets, + type YamlBucketGroup, + type YamlBucketGroupItems, + type YamlFieldData, + type YamlFilterMapEntry, + type YamlFilters, } from "./from/declarativeVisualisationToYaml.js"; export { declarativeDashboardToYaml, @@ -115,28 +129,185 @@ export { } from "./conts.js"; // Configs -export { table } from "./configs/table.js"; -export { barChart } from "./configs/barChart.js"; -export { columnChart } from "./configs/columnChart.js"; -export { lineChart } from "./configs/lineChart.js"; -export { areaChart } from "./configs/areaChart.js"; -export { scatterChart } from "./configs/scatterChart.js"; -export { bubbleChart } from "./configs/bubbleChart.js"; -export { pieChart } from "./configs/pieChart.js"; -export { donutChart } from "./configs/donutChart.js"; -export { treemapChart } from "./configs/treemapChart.js"; -export { pyramidChart } from "./configs/pyramidChart.js"; -export { funnelChart } from "./configs/funnelChart.js"; -export { heatmapChart } from "./configs/heatmapChart.js"; -export { bulletChart } from "./configs/bulletChart.js"; -export { waterfallChart } from "./configs/waterfallChart.js"; -export { dependencyWheelChart } from "./configs/dependencyWheelChart.js"; -export { sankeyChart } from "./configs/sankeyChart.js"; -export { headlineChart } from "./configs/headlineChart.js"; -export { comboChart } from "./configs/comboChart.js"; -export { geoChart } from "./configs/geoChart.js"; -export { geoAreaChart } from "./configs/geoAreaChart.js"; -export { repeaterChart, type InlineVisualizations } from "./configs/repeaterChart.js"; +export { + table, + tableLoad, + tableSave, + TABLE_DEFAULTS, + type ITableConfig, + type TableConfigProperties, +} from "./configs/table.js"; +export { + barChart, + barChartLoad, + barChartSave, + BAR_CHART_DEFAULTS, + type IBarChartConfig, + type BarChartConfigProperties, +} from "./configs/barChart.js"; +export { + columnChart, + columnChartLoad, + columnChartSave, + COLUMN_CHART_DEFAULTS, + type IColumnChartConfig, + type ColumnChartConfigProperties, +} from "./configs/columnChart.js"; +export { + lineChart, + lineChartLoad, + lineChartSave, + LINE_CHART_DEFAULTS, + type ILineChartConfig, + type LineChartConfigProperties, +} from "./configs/lineChart.js"; +export { + areaChart, + areaChartLoad, + areaChartSave, + AREA_CHART_DEFAULTS, + type IAreaChartConfig, + type AreaChartConfigProperties, +} from "./configs/areaChart.js"; + +export { + scatterChart, + scatterChartLoad, + scatterChartSave, + SCATTER_CHART_DEFAULTS, + type IScatterChartConfig, + type ScatterChartConfigProperties, +} from "./configs/scatterChart.js"; +export { + bubbleChart, + bubbleChartLoad, + bubbleChartSave, + BUBBLE_CHART_DEFAULTS, + type IBubbleChartConfig, + type BubbleChartConfigProperties, +} from "./configs/bubbleChart.js"; +export { + pieChart, + pieChartLoad, + pieChartSave, + PIE_CHART_DEFAULTS, + type IPieChartConfig, + type PieChartConfigProperties, +} from "./configs/pieChart.js"; +export { + donutChart, + donutChartLoad, + donutChartSave, + DONUT_CHART_DEFAULTS, + type IDonutChartConfig, + type DonutChartConfigProperties, +} from "./configs/donutChart.js"; +export { + treemapChart, + treemapChartLoad, + treemapChartSave, + TREEMAP_CHART_DEFAULTS, + type ITreemapChartConfig, + type TreemapChartConfigProperties, +} from "./configs/treemapChart.js"; +export { + pyramidChart, + pyramidChartLoad, + pyramidChartSave, + PYRAMID_CHART_DEFAULTS, + type IPyramidChartConfig, + type PyramidChartConfigProperties, +} from "./configs/pyramidChart.js"; +export { + funnelChart, + funnelChartLoad, + funnelChartSave, + FUNNEL_CHART_DEFAULTS, + type IFunnelChartConfig, + type FunnelChartConfigProperties, +} from "./configs/funnelChart.js"; +export { + heatmapChart, + heatmapChartLoad, + heatmapChartSave, + HEATMAP_CHART_DEFAULTS, + type IHeatmapChartConfig, + type HeatmapChartConfigProperties, +} from "./configs/heatmapChart.js"; +export { + bulletChart, + bulletChartLoad, + bulletChartSave, + BULLET_CHART_DEFAULTS, + type IBulletChartConfig, + type BulletChartConfigProperties, +} from "./configs/bulletChart.js"; +export { + waterfallChart, + waterfallChartLoad, + waterfallChartSave, + WATERFALL_CHART_DEFAULTS, + type IWaterfallChartConfig, + type WaterfallChartConfigProperties, +} from "./configs/waterfallChart.js"; +export { + dependencyWheelChart, + dependencyWheelChartLoad, + dependencyWheelChartSave, + DEPENDENCY_WHEEL_CHART_DEFAULTS, + type IDependencyWheelChartConfig, + type DependencyWheelChartConfigProperties, +} from "./configs/dependencyWheelChart.js"; +export { + sankeyChart, + sankeyChartLoad, + sankeyChartSave, + SANKEY_CHART_DEFAULTS, + type ISankeyChartConfig, + type SankeyChartConfigProperties, +} from "./configs/sankeyChart.js"; +export { + headlineChart, + headlineChartLoad, + headlineChartSave, + HEADLINE_CHART_DEFAULTS, + type IHeadlineChartConfig, + type HeadlineChartConfigProperties, +} from "./configs/headlineChart.js"; +export { + comboChart, + comboChartLoad, + comboChartSave, + COMBO_CHART_DEFAULTS, + type IComboChartConfig, + type ComboChartConfigProperties, +} from "./configs/comboChart.js"; +export { + geoChart, + geoChartLoad, + geoChartSave, + GEO_CHART_DEFAULTS, + type IGeoChartConfig, + type GeoChartConfigProperties, +} from "./configs/geoChart.js"; +export { + geoAreaChart, + geoAreaChartLoad, + geoAreaChartSave, + GEO_AREA_CHART_DEFAULTS, + type IGeoAreaChartConfig, + type GeoAreaChartConfigProperties, +} from "./configs/geoAreaChart.js"; +export { + repeaterChart, + repeaterChartLoad, + repeaterChartSave, + REPEATER_CHART_DEFAULTS, + saveInlineVisualizations, + type IRepeaterChartConfig, + type RepeaterChartConfigProperties, + type InlineVisualizations, +} from "./configs/repeaterChart.js"; export type { IChartFill as ChartFill, ChartFillType, @@ -167,11 +338,16 @@ export type { PatternFillName, PointShapeSymbol, } from "./configs/types.js"; -export { getValueOrDefault, type VisualisationConfig, type ValueType } from "./configs/utils.js"; +export { + getValueOrDefault, + type ConfigDefaults, + type VisualisationConfig, + type ValueType, +} from "./configs/utils.js"; // Utils needed by orchestrators export { generateFileName, resolveIdFromFileName, type FileNamesUsed } from "./utils/nameUtils.js"; -export { assertUnreachable, type FilePath } from "./utils/sharedUtils.js"; +export { assertUnreachable, type FilePath, type FullFields } from "./utils/sharedUtils.js"; export { convertBucketToTitle } from "./utils/convertBucketToTitle.js"; export { createIdentifier, getIdentifier } from "./utils/yamlUtils.js"; export { diff --git a/libs/sdk-code-convertors/src/to/yamlDashboardToDeclarative.ts b/libs/sdk-code-convertors/src/to/yamlDashboardToDeclarative.ts index 4a3b0d58880..d00b4e012aa 100644 --- a/libs/sdk-code-convertors/src/to/yamlDashboardToDeclarative.ts +++ b/libs/sdk-code-convertors/src/to/yamlDashboardToDeclarative.ts @@ -90,7 +90,8 @@ import { } from "../utils/typeGuards.js"; import { createIdentifier, createLocalIdentifier } from "../utils/yamlUtils.js"; -type DashboardDefinition = Pick< +/** @internal */ +export type DashboardDefinition = Pick< OverrideDashboardDefinition, | "layout" | "plugins" @@ -108,12 +109,17 @@ type DashboardDefinition = Pick< > & { version: string; }; -type FilterContextDefinition = Pick & { + +/** @internal */ +export type FilterContextDefinition = Pick & { version: string; }; -type DashboardSection = Required["layout"]["sections"][number]; -type DashboardWidget = DashboardSection["items"][number]; -type EmptyValueHandling = NonNullable; +/** @internal */ +export type DashboardSection = Required["layout"]["sections"][number]; +/** @internal */ +export type DashboardWidget = DashboardSection["items"][number]; +/** @internal */ +export type EmptyValueHandling = NonNullable; function extractDashboardEmptyValueHandling(filter: unknown): EmptyValueHandling | undefined { const value = (filter as { empty_values?: unknown }).empty_values; @@ -349,6 +355,7 @@ function yamlSectionToDeclarative( }; } +/** @internal */ export function yamlWidgetItemToDeclarative( entities: ExportEntities, input: Widget, @@ -420,6 +427,7 @@ function yamlInsightWidgetToDeclarative( }; } +/** @internal */ export function yamlWidgetToDeclarative( entities: ExportEntities, input: VisualisationWidget | RichTextWidget | VisualizationSwitcherWidget | ContainerWidget, @@ -554,6 +562,7 @@ function yamlWidgetPropertiesToDeclarative(input: VisualisationWidget): any { return {}; } +/** @internal */ export function yamlInteractionToDeclarative( entities: ExportEntities, visualisation: string, @@ -800,6 +809,7 @@ function yamlIgnoredFilterToDeclarative(input: string): IDashboardFilterReferenc return null; } +/** @internal */ export function yamlPluginsToDeclarative(plugins: Dashboard["plugins"]) { return plugins?.map((plugin) => yamlPluginToDeclarative(plugin)); } @@ -870,6 +880,7 @@ function flattenFilters( return result; } +/** @internal */ export function yamlFilterContextToDeclarative( baseId: string, yamlFilters: DashboardFilters | undefined, diff --git a/libs/sdk-code-convertors/src/to/yamlDatasetToDeclarative.ts b/libs/sdk-code-convertors/src/to/yamlDatasetToDeclarative.ts index 5f02c0f9045..834c0efe65b 100644 --- a/libs/sdk-code-convertors/src/to/yamlDatasetToDeclarative.ts +++ b/libs/sdk-code-convertors/src/to/yamlDatasetToDeclarative.ts @@ -181,6 +181,7 @@ export function buildGrain(entities: ExportEntities, primaryKey?: string | strin /** * Build declarative references */ +/** @internal */ export function buildReferences( entities: ExportEntities, refs: Dataset["references"] = [], @@ -262,6 +263,7 @@ export function buildWorkspaceDataFilterReferences( /** * Build declarative facts out of AaC fields */ +/** @internal */ export function buildFacts(fields?: Fields): DeclarativeFact[] { if (!fields) { return []; @@ -364,6 +366,7 @@ export function buildAggregatedFacts( /** * Build declarative attributes out of AaC fields */ +/** @internal */ export function buildAttributes(fields?: Fields, isAuxiliaryDataset = false): DeclarativeAttribute[] { if (!fields) { return []; @@ -432,6 +435,7 @@ export function buildAttributes(fields?: Fields, isAuxiliaryDataset = false): De /** * Build declarative attribute labels out of AaC labels */ +/** @internal */ export function buildAttributeLabels( labels?: Attribute["labels"], isAuxiliaryDataset = false, diff --git a/libs/sdk-code-convertors/src/to/yamlVisualisationToDeclarative.ts b/libs/sdk-code-convertors/src/to/yamlVisualisationToDeclarative.ts index ca7071da45e..2bba5ee373d 100644 --- a/libs/sdk-code-convertors/src/to/yamlVisualisationToDeclarative.ts +++ b/libs/sdk-code-convertors/src/to/yamlVisualisationToDeclarative.ts @@ -101,7 +101,8 @@ import { } from "../utils/typeGuards.js"; import { createIdentifier, createLocalIdentifier } from "../utils/yamlUtils.js"; -type VisualisationDefinition = Pick< +/** @internal */ +export type VisualisationDefinition = Pick< IInsight["insight"], "visualizationUrl" | "properties" | "filters" | "buckets" | "sorts" | "attributeFilterConfigs" > & { @@ -305,6 +306,7 @@ function yamlConfigToDeclarative( //REPORT +/** @internal */ export function yamlReportToDeclarative( entities: ExportEntities, input: Visualisation, @@ -595,6 +597,7 @@ function resolveField(localName: string, field?: Field) { //SORTS +/** @internal */ export function yamlSortsToDeclarative( sort_by: Sorts | undefined, fields: Visualisation["query"]["fields"], @@ -1120,6 +1123,7 @@ function mergeDeclarativeResults(...results: YamlFilterToDeclarativeResult[]): Y }; } +/** @internal */ export function yamlFiltersToDeclarative( entities: ExportEntities, filters_by: QueryFilters | Filter[] | undefined, @@ -1150,6 +1154,7 @@ export function yamlFiltersToDeclarative( //TOTALS +/** @internal */ export function yamlReportTotalToDeclarative(totals: Total[] = [], attributeIdentifier: string): ITotal[] { return totals.map((total) => { return { @@ -1163,6 +1168,7 @@ export function yamlReportTotalToDeclarative(totals: Total[] = [], attributeIden //BUCKETS +/** @internal */ export function yamlBucketsToDeclarative( entities: ExportEntities, input: Visualisation, diff --git a/libs/sdk-code-convertors/src/utils/sharedUtils.ts b/libs/sdk-code-convertors/src/utils/sharedUtils.ts index f23349f4a63..35e5b64c4eb 100644 --- a/libs/sdk-code-convertors/src/utils/sharedUtils.ts +++ b/libs/sdk-code-convertors/src/utils/sharedUtils.ts @@ -75,6 +75,7 @@ export function convertIdOrTitleToId(id: string, title?: string | null): string return id; } +/** @public */ export type FullFields = | AttributeField | MetricField diff --git a/libs/sdk-code-schemas/package.json b/libs/sdk-code-schemas/package.json index 482f0b0f303..59680ef6dc9 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData AAC JSON Schema types and compiled schemas", "license": "MIT", "author": "GoodData", @@ -36,7 +36,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-e2e-utils/package.json b/libs/sdk-e2e-utils/package.json index e310a64382d..d3f578049f7 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData utility functions for Playwright E2E tests", "license": "MIT", "author": "GoodData", @@ -29,7 +29,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm api temp", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm temp", "format-check": "oxfmt --check .", "format-write": "oxfmt .", "lint": "oxlint . --type-aware --quiet && eslint .", diff --git a/libs/sdk-embedding/package.json b/libs/sdk-embedding/package.json index ed75c3fda9c..fe88ba64a5d 100644 --- a/libs/sdk-embedding/package.json +++ b/libs/sdk-embedding/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-embedding", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Embedding APIs", "license": "MIT", "author": "GoodData", @@ -33,7 +33,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-model/api/sdk-model.api.md b/libs/sdk-model/api/sdk-model.api.md index ca7ed9eeca1..56b389342cb 100644 --- a/libs/sdk-model/api/sdk-model.api.md +++ b/libs/sdk-model/api/sdk-model.api.md @@ -2011,6 +2011,7 @@ export interface IDashboardTab { layout?: IDashboardLayout; localIdentifier: string; measureValueFilterConfigs?: IDashboardMeasureValueFilterConfig[]; + parameters?: IDashboardParameter[]; title: string; } @@ -5744,9 +5745,20 @@ export interface IUserGroupDataFilterDefinition extends IUserDataFilterDefinitio // @alpha export type IUserGroupWorkspaceAccessGrantee = IWorkspaceAccess & IGranularUserGroupAccessGrantee; +// @public +export interface IUserSettings extends ISettings { + locale: string; + separators: ISeparators; + userId: string; +} + // @alpha export type IUserWorkspaceAccessGrantee = IWorkspaceAccess & IGranularUserAccessGrantee; +// @public +export interface IUserWorkspaceSettings extends IUserSettings, IWorkspaceSettings { +} + // @public export interface IVariableMetadataObject extends IMetadataObject { // (undocumented) @@ -5958,6 +5970,13 @@ export type IWorkspacePermissions = { [permission in WorkspacePermission]: boolean; }; +// @public +export interface IWorkspaceSettings extends ISettings { + agGridToken?: string; + mapboxToken?: string; + workspace: string; +} + // @public export interface IWorkspaceUser { email: string; diff --git a/libs/sdk-model/package.json b/libs/sdk-model/package.json index dd4b712eaaf..bb542b87ee4 100644 --- a/libs/sdk-model/package.json +++ b/libs/sdk-model/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-model", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Model definitions used by UI components and Backend SPI", "license": "MIT", "author": "GoodData", @@ -32,7 +32,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-model/src/dashboard/dashboard.ts b/libs/sdk-model/src/dashboard/dashboard.ts index f44d3243391..cf50ce99221 100644 --- a/libs/sdk-model/src/dashboard/dashboard.ts +++ b/libs/sdk-model/src/dashboard/dashboard.ts @@ -286,6 +286,16 @@ export interface IDashboardTab { * If not defined, filters are displayed ungrouped as defined in single context. */ filterGroupsConfig?: IDashboardFilterGroupsConfig; + + /** + * Tab-scoped parameter overrides. Each entry references a workspace parameter and optionally + * pins a dashboard-scope value, label, and mode. A parameter affects only the widgets on the + * tab where it is configured; the same ref may be added independently to multiple tabs with + * independent values, labels, and modes. + * + * @alpha + */ + parameters?: IDashboardParameter[]; } /** @@ -486,9 +496,9 @@ export interface IDashboard readonly measureValueFilterConfigs?: IDashboardMeasureValueFilterConfig[]; /** - * Dashboard-level parameter overrides. Each entry references a workspace parameter and - * optionally pins a dashboard-scope value, label, and mode. See {@link IDashboardParameter} - * for smart-persistence rules. + * Legacy dashboard-level parameters. Preserved as a read-only fallback for legacy metadata; + * saves emit parameters per tab on {@link IDashboardTab.parameters} instead. Honored on load + * only when no tab carries parameters. * * @alpha */ @@ -584,7 +594,9 @@ export interface IDashboardDefinition readonly measureValueFilterConfigs?: IDashboardMeasureValueFilterConfig[]; /** - * Dashboard-level parameter overrides. See {@link IDashboardParameter}. + * Legacy dashboard-level parameters. Preserved as a read-only fallback for legacy metadata; + * saves emit parameters per tab on {@link IDashboardTab.parameters} instead. Honored on load + * only when no tab carries parameters. * * @alpha */ diff --git a/libs/sdk-model/src/index.ts b/libs/sdk-model/src/index.ts index 71f063cbb33..d6d4a4e9483 100644 --- a/libs/sdk-model/src/index.ts +++ b/libs/sdk-model/src/index.ts @@ -976,7 +976,12 @@ export { isDashboardParameter, } from "./dashboard/parameter.js"; -export { type ISettings } from "./settings/index.js"; +export { + type ISettings, + type IUserSettings, + type IWorkspaceSettings, + type IUserWorkspaceSettings, +} from "./settings/index.js"; export { type ISeparators, diff --git a/libs/sdk-model/src/settings/index.ts b/libs/sdk-model/src/settings/index.ts index 976aa615f0d..50a4dedc715 100644 --- a/libs/sdk-model/src/settings/index.ts +++ b/libs/sdk-model/src/settings/index.ts @@ -2,7 +2,7 @@ import { type RemotePluggableApplicationsRegistry } from "../pluggableApplication/index.js"; -import { type IFeatureFlags, type IPermanentSettings } from "./settings.js"; +import { type IFeatureFlags, type IPermanentSettings, type ISeparators } from "./settings.js"; /** * Settings are obtained from the backend and are effectively a collection of feature flags or settings with @@ -27,3 +27,54 @@ export interface ISettings extends IPermanentSettings, IFeatureFlags { [key: string]: number | boolean | string | object | undefined | null; } + +/** + * Settings for a particular user. + * + * @public + */ +export interface IUserSettings extends ISettings { + /** + * User to which the settings belong. + */ + userId: string; + + /** + * User locale + */ + locale: string; + + /** + * Regional number formatting + */ + separators: ISeparators; +} + +/** + * Settings for a particular workspace. + * + * @public + */ +export interface IWorkspaceSettings extends ISettings { + /** + * Workspace to which the settings belong. + */ + workspace: string; + + /** + * Stores Mapbox token used for WS + */ + mapboxToken?: string; + + /** + * Stores AgGrid token used for WS + */ + agGridToken?: string; +} + +/** + * Settings for a particular combination of user and workspace. + * + * @public + */ +export interface IUserWorkspaceSettings extends IUserSettings, IWorkspaceSettings {} diff --git a/libs/sdk-pluggable-application-model/api/sdk-pluggable-application-model.api.md b/libs/sdk-pluggable-application-model/api/sdk-pluggable-application-model.api.md index cbe5b23e17b..1e5e1b66df4 100644 --- a/libs/sdk-pluggable-application-model/api/sdk-pluggable-application-model.api.md +++ b/libs/sdk-pluggable-application-model/api/sdk-pluggable-application-model.api.md @@ -9,7 +9,7 @@ import { IEntitlementDescriptor } from '@gooddata/sdk-model'; import { ILocale } from '@gooddata/sdk-model'; import { ITheme } from '@gooddata/sdk-model'; import { IUser } from '@gooddata/sdk-model'; -import { IUserSettings } from '@gooddata/sdk-backend-spi'; +import { IUserSettings } from '@gooddata/sdk-model'; import { IWhiteLabeling } from '@gooddata/sdk-model'; import { IWorkspacePermissions } from '@gooddata/sdk-model'; import { ObjRef } from '@gooddata/sdk-model'; diff --git a/libs/sdk-pluggable-application-model/package.json b/libs/sdk-pluggable-application-model/package.json index 3365cc78838..4fc651bcc91 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK model contracts for pluggable applications", "license": "MIT", "author": "GoodData Corporation", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", @@ -40,7 +40,6 @@ "validate-esm": "node --input-type=module --eval 'import \"@gooddata/sdk-pluggable-application-model\"'" }, "dependencies": { - "@gooddata/sdk-backend-spi": "workspace:*", "@gooddata/sdk-model": "workspace:*", "ts-invariant": "0.10.3", "tslib": "2.8.1" diff --git a/libs/sdk-pluggable-application-model/src/platformContext.ts b/libs/sdk-pluggable-application-model/src/platformContext.ts index d802236adcf..98281fb1402 100644 --- a/libs/sdk-pluggable-application-model/src/platformContext.ts +++ b/libs/sdk-pluggable-application-model/src/platformContext.ts @@ -1,12 +1,12 @@ // (C) 2026 GoodData Corporation -import { type IUserSettings } from "@gooddata/sdk-backend-spi"; import { type ApplicationScope, type IEntitlementDescriptor, type ILocale, type ITheme, type IUser, + type IUserSettings, type IWhiteLabeling, type IWorkspacePermissions, type ObjRef, diff --git a/libs/sdk-ui-all/package.json b/libs/sdk-ui-all/package.json index cd7ef3bec01..22cc32913cf 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - All-In-One", "license": "LicenseRef-LICENSE", "author": "GoodData", @@ -29,7 +29,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-catalog/package.json b/libs/sdk-ui-catalog/package.json index 6f83aa6fc4a..8942a5aadef 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - Analytics Catalog", "license": "MIT", "author": "GoodData Corporation", @@ -38,7 +38,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-charts/package.json b/libs/sdk-ui-charts/package.json index aa57aebed6f..46501306361 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Charts", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", @@ -57,7 +57,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage styles/css *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp styles/css *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", 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 4933804a084..a6104d0b235 100644 --- a/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md +++ b/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md @@ -1289,7 +1289,6 @@ export type DashboardState = { automations: IAutomationsState; users: IUsersState; notificationChannels: INotificationChannelsState; - parameters: IParametersState; dashboardSummaryWorkflow: DashboardSummaryWorkflowState; renderMode: IRenderModeState; ui: IUiState; @@ -8590,6 +8589,8 @@ export interface ITabState { // (undocumented) measureValueFilterConfigs?: IMeasureValueFilterConfigsState; // (undocumented) + parameters?: IParametersState; + // (undocumented) title?: string; } @@ -9706,14 +9707,6 @@ export type ParameterDraggableItem = { ref: ObjRef; }; -// @internal (undocumented) -export const parametersActions: { - addParameter: ActionCreatorWithPayload; - setParameterRuntimeValue: ActionCreatorWithPayload; - removeParameter: ActionCreatorWithPayload; - setParameterEntries: ActionCreatorWithPayload; -}; - // @beta (undocumented) export type PdfConfiguration = { pageSize?: "A3" | "A4" | "LETTER"; @@ -12477,6 +12470,18 @@ readonly removeMeasureValueFilterConfig: (state: WritableDraft, acti payload: string; type: string; }) => void | ITabsState | WritableDraft; +readonly addParameter: (state: WritableDraft, action: { +payload: IAddParameterPayload; +type: string; +}) => void | ITabsState | WritableDraft; +readonly setParameterRuntimeValue: (state: WritableDraft, action: { +payload: ISetParameterRuntimeValuePayload; +type: string; +}) => void | ITabsState | WritableDraft; +readonly removeParameter: (state: WritableDraft, action: { +payload: IRemoveParameterPayload; +type: string; +}) => void | ITabsState | WritableDraft; }, "tabs">; // @alpha (undocumented) diff --git a/libs/sdk-ui-dashboard/package.json b/libs/sdk-ui-dashboard/package.json index c73f91eacf8..f7df07b62b7 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - Dashboard Component", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", @@ -42,7 +42,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-dashboard/src/index.ts b/libs/sdk-ui-dashboard/src/index.ts index 20b0dbe4c6b..86c90b57a73 100644 --- a/libs/sdk-ui-dashboard/src/index.ts +++ b/libs/sdk-ui-dashboard/src/index.ts @@ -1645,20 +1645,22 @@ export type { SetCatalogMeasuresAndFactsPayload, SetCatalogItemsPayload, } from "./model/store/catalog/catalogReducers.js"; -export { parametersActions } from "./model/store/parameters/index.js"; export type { IAddParameterPayload, IRemoveParameterPayload, ISetParameterRuntimeValuePayload, -} from "./model/store/parameters/parametersReducers.js"; -export type { IDashboardParameterEntry, IParametersState } from "./model/store/parameters/parametersState.js"; +} from "./model/store/tabs/parameters/parametersReducers.js"; +export type { + IDashboardParameterEntry, + IParametersState, +} from "./model/store/tabs/parameters/parametersState.js"; export { selectDashboardParameterEntries, selectDashboardParameters, selectEffectiveParameterValuesForWidget, selectIsParametersChanged, selectParameterRuntimeOverrideByRef, -} from "./model/store/parameters/parametersSelectors.js"; +} from "./model/store/tabs/parameters/parametersSelectors.js"; export { drillActions } from "./model/store/drill/index.js"; export { selectDrillableItems, diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/parameterHydration.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/parameterHydration.ts index 2b164c8f45a..638fca2b464 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/parameterHydration.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/parameterHydration.ts @@ -2,12 +2,17 @@ import { type IDashboardParameter, + type IDashboardTab, type IParameterMetadataObject, isNumberParameterDefinition, objRefToString, } from "@gooddata/sdk-model"; -import { type IDashboardParameterEntry } from "../../../store/parameters/parametersState.js"; +import { + type IDashboardParameterEntry, + pickTabParametersSource, +} from "../../../store/tabs/parameters/parametersState.js"; +import { DEFAULT_TAB_ID } from "../../../store/tabs/tabsState.js"; /** * Builds the parameter slice entries from the dashboard's persisted parameters and the @@ -40,3 +45,27 @@ export function hydrateParameterEntries( return { parameter, runtimeOverride: workspaceDefault }; }); } + +/** + * Distributes the dashboard's persisted parameters into per-tab hydrated entry lists, applying + * the V1 → per-tab migration rule (see {@link pickTabParametersSource}). Each tab's parameter + * list is hydrated against the workspace catalog via {@link hydrateParameterEntries}. + * + * For legacy single-tab dashboards (no `tabs[]`), a synthetic tab with `DEFAULT_TAB_ID` is used + * so the V1 root-level `parameters` migrate transparently. + */ +export function distributeParametersToTabs( + tabs: IDashboardTab[] | undefined, + rootParameters: IDashboardParameter[] | undefined, + workspaceParameters: IParameterMetadataObject[], +): Record { + const effectiveTabs: IDashboardTab[] = tabs ?? [ + { localIdentifier: DEFAULT_TAB_ID, title: "", parameters: rootParameters }, + ]; + const result: Record = {}; + for (const tab of effectiveTabs) { + const source = pickTabParametersSource(tab, effectiveTabs, rootParameters); + result[tab.localIdentifier] = hydrateParameterEntries(source, workspaceParameters); + } + return result; +} diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/stateInitializers.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/stateInitializers.ts index f94224a57e8..9381df9b6a4 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/stateInitializers.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/stateInitializers.ts @@ -52,7 +52,6 @@ import { drillActions } from "../../../store/drill/index.js"; import { insightsActions } from "../../../store/insights/index.js"; import { metaActions } from "../../../store/meta/index.js"; import { selectIsNewDashboard } from "../../../store/meta/metaSelectors.js"; -import { parametersActions } from "../../../store/parameters/index.js"; import { type FilterContextState, filterContextInitialState, @@ -73,7 +72,7 @@ import { resolveFilterDisplayForms } from "../../../utils/filterResolver.js"; import { EmptyDashboardLayout, dashboardInitialize } from "./dashboardInitialize.js"; import { loadAvailableDisplayFormRefs } from "./loadAvailableDisplayFormRefs.js"; import { mergedMigratedAttributeFilters } from "./migratedAttributeFilters.js"; -import { hydrateParameterEntries } from "./parameterHydration.js"; +import { distributeParametersToTabs } from "./parameterHydration.js"; /** * Processes a single tab's filterContext and returns initialized FilterContextState. @@ -262,86 +261,49 @@ export function* actionsToInitializeNewDashboard( dateFilterConfigs: [], attributeFilterConfigs: [], layout: dashboardLayout ?? EmptyDashboardLayout, + parameters: dashboard?.parameters, }, ]; + const parametersByTab = distributeParametersToTabs(tabs, dashboard?.parameters, workspaceParameters); // Prepare tabs action with complete filterContext for each tab - const tabsAction = tabs - ? [ - tabsActions.setTabs({ - tabs: tabs.map((tab: IDashboardTab) => ({ - title: tab.title, - localIdentifier: tab.localIdentifier, - filterContext: { - ...filterContextInitialState, - filterContextDefinition, - originalFilterContextDefinition, - filterContextIdentity, - attributeFilterDisplayForms, - }, - dateFilterConfig: { - dateFilterConfig: tab.dateFilterConfig, - effectiveDateFilterConfig: dateFilterConfig, - isUsingDashboardOverrides: false, - dateFilterConfigValidationWarnings: undefined, - }, - dateFilterConfigs: { - dateFilterConfigs: tab.dateFilterConfigs ?? [], - }, - attributeFilterConfigs: { - attributeFilterConfigs: tab.attributeFilterConfigs ?? [], - }, - measureValueFilterConfigs: { - measureValueFilterConfigs: tab.measureValueFilterConfigs ?? [], - }, - layout: { - ...layoutInitialState, - layout: tab.layout ?? dashboardLayout ?? EmptyDashboardLayout, - }, - filterGroupsConfig: tab.filterGroupsConfig, - })), - activeTabLocalIdentifier: - initialTabId ?? dashboard?.activeTabLocalIdentifier ?? DEFAULT_TAB_ID, - }), - ] - : [ - // For dashboards without tabs, create a single default tab - tabsActions.setTabs({ - tabs: [ - { - localIdentifier: DEFAULT_TAB_ID, - title: "", - filterContext: { - ...filterContextInitialState, - filterContextDefinition, - originalFilterContextDefinition, - filterContextIdentity, - attributeFilterDisplayForms, - }, - layout: { - ...layoutInitialState, - layout: dashboardLayout ?? EmptyDashboardLayout, - }, - dateFilterConfig: { - dateFilterConfig: dashboard?.dateFilterConfig, - effectiveDateFilterConfig: dateFilterConfig, - isUsingDashboardOverrides: false, - dateFilterConfigValidationWarnings: undefined, - }, - dateFilterConfigs: { - dateFilterConfigs: dashboard?.dateFilterConfigs ?? [], - }, - attributeFilterConfigs: { - attributeFilterConfigs: dashboard?.attributeFilterConfigs ?? [], - }, - measureValueFilterConfigs: { - measureValueFilterConfigs: dashboard?.measureValueFilterConfigs ?? [], - }, - }, - ], - activeTabLocalIdentifier: DEFAULT_TAB_ID, - }), - ]; + const tabsAction = [ + tabsActions.setTabs({ + tabs: tabs.map((tab: IDashboardTab) => ({ + title: tab.title, + localIdentifier: tab.localIdentifier, + filterContext: { + ...filterContextInitialState, + filterContextDefinition, + originalFilterContextDefinition, + filterContextIdentity, + attributeFilterDisplayForms, + }, + dateFilterConfig: { + dateFilterConfig: tab.dateFilterConfig, + effectiveDateFilterConfig: dateFilterConfig, + isUsingDashboardOverrides: false, + dateFilterConfigValidationWarnings: undefined, + }, + dateFilterConfigs: { + dateFilterConfigs: tab.dateFilterConfigs ?? [], + }, + attributeFilterConfigs: { + attributeFilterConfigs: tab.attributeFilterConfigs ?? [], + }, + measureValueFilterConfigs: { + measureValueFilterConfigs: tab.measureValueFilterConfigs ?? [], + }, + layout: { + ...layoutInitialState, + layout: tab.layout ?? dashboardLayout ?? EmptyDashboardLayout, + }, + filterGroupsConfig: tab.filterGroupsConfig, + parameters: { parameters: parametersByTab[tab.localIdentifier] ?? [] }, + })), + activeTabLocalIdentifier: initialTabId ?? dashboard?.activeTabLocalIdentifier ?? DEFAULT_TAB_ID, + }), + ]; return { initActions: [ @@ -363,9 +325,6 @@ export function* actionsToInitializeNewDashboard( insightsActions.setInsights(insights), drillActions.resetCrossFiltering(), ]), - parametersActions.setParameterEntries( - hydrateParameterEntries(dashboard?.parameters, workspaceParameters), - ), ], dashboard: initialContent ? dashboard : undefined, insights: initialContent ? insights : [], @@ -684,6 +643,13 @@ export function* actionsToInitializeExistingDashboard( const screen: SagaReturnType = yield select(selectScreen); + const parameterSourceDashboard = persistedDashboard ?? dashboard; + const parametersByTab = distributeParametersToTabs( + parameterSourceDashboard.tabs, + parameterSourceDashboard.parameters, + workspaceParameters, + ); + // Process tabs with complete filterContext initialization for each tab let tabsAction = null; const validationResults: ValidationResult[] = []; @@ -753,6 +719,7 @@ export function* actionsToInitializeExistingDashboard( layout: tabLayout, screen, // Preserve only screen from current state }, + parameters: { parameters: parametersByTab[tab.localIdentifier] ?? [] }, }; processedTabs.push(tabState); @@ -826,6 +793,7 @@ export function* actionsToInitializeExistingDashboard( measureValueFilterConfigs: dashboard.measureValueFilterConfigs, } : undefined, + parameters: { parameters: parametersByTab[tabIdentifier] ?? [] }, }; tabsAction = tabsActions.setTabs({ @@ -846,9 +814,6 @@ export function* actionsToInitializeExistingDashboard( uiActions.setWidgetsOverlay(modifiedWidgets), validationResults.length > 0 ? uiActions.setIncompatibleDefaultFiltersOverrideMessage() : null, drillActions.resetCrossFiltering(), - parametersActions.setParameterEntries( - hydrateParameterEntries((persistedDashboard ?? dashboard).parameters, workspaceParameters), - ), ]); } diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/parameterHydration.test.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/parameterHydration.test.ts new file mode 100644 index 00000000000..ab06cf477a2 --- /dev/null +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/parameterHydration.test.ts @@ -0,0 +1,96 @@ +// (C) 2026 GoodData Corporation + +import { describe, expect, it } from "vitest"; + +import { + type IDashboardParameter, + type IDashboardTab, + type IParameterMetadataObject, + idRef, +} from "@gooddata/sdk-model"; + +import { DEFAULT_TAB_ID } from "../../../../store/tabs/tabsState.js"; +import { distributeParametersToTabs } from "../parameterHydration.js"; + +const topNRef = idRef("topN", "parameter"); +const sampleRef = idRef("sampleSize", "parameter"); + +const topNParameter: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", +}; + +const sampleParameter: IDashboardParameter = { + ref: sampleRef, + parameterType: "NUMBER", + mode: "active", +}; + +const topNWorkspace: IParameterMetadataObject = { + type: "parameter", + id: "topN", + uri: "/topN", + ref: topNRef, + title: "Top N", + description: "", + production: true, + deprecated: false, + unlisted: false, + definition: { type: "NUMBER", defaultValue: 10 }, +}; + +function tab(localIdentifier: string, parameters?: IDashboardParameter[]): IDashboardTab { + return { + localIdentifier, + title: "", + ...(parameters === undefined ? {} : { parameters }), + } as IDashboardTab; +} + +describe("distributeParametersToTabs (V1 → per-tab migration)", () => { + it("V1 root parameters, no tabs[] in source — synthesizes DEFAULT_TAB_ID and gets the root array", () => { + const distributed = distributeParametersToTabs(undefined, [topNParameter], [topNWorkspace]); + + expect(Object.keys(distributed)).toEqual([DEFAULT_TAB_ID]); + expect(distributed[DEFAULT_TAB_ID]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + }); + + it("V1 root parameters + multi-tab tabs[] without per-tab parameters — root copies to every tab", () => { + // V1 → per-tab migration on load: when no tab has parameters set, root array seeds every tab. + const tabs: IDashboardTab[] = [tab("tab-A"), tab("tab-B"), tab("tab-C")]; + + const distributed = distributeParametersToTabs(tabs, [topNParameter], [topNWorkspace]); + + expect(distributed["tab-A"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + expect(distributed["tab-B"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + expect(distributed["tab-C"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + }); + + it("V2 dashboards with explicit per-tab parameters — root fallback ignored", () => { + const tabs: IDashboardTab[] = [tab("tab-A", [topNParameter]), tab("tab-B", [sampleParameter])]; + + const distributed = distributeParametersToTabs(tabs, [topNParameter], [topNWorkspace]); + + expect(distributed["tab-A"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + expect(distributed["tab-B"]).toEqual([{ parameter: sampleParameter, runtimeOverride: undefined }]); + }); + + it("explicit empty array on a tab honored — not overwritten by root fallback", () => { + const tabs: IDashboardTab[] = [tab("tab-A", []), tab("tab-B", [topNParameter])]; + + const distributed = distributeParametersToTabs(tabs, [sampleParameter], [topNWorkspace]); + + expect(distributed["tab-A"]).toEqual([]); + expect(distributed["tab-B"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + }); + + it("no root parameters AND no tab parameters — every tab gets empty entries", () => { + const tabs: IDashboardTab[] = [tab("tab-A"), tab("tab-B")]; + + const distributed = distributeParametersToTabs(tabs, undefined, [topNWorkspace]); + + expect(distributed["tab-A"]).toEqual([]); + expect(distributed["tab-B"]).toEqual([]); + }); +}); diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts index 5e948fadf99..5b06832a1e5 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts @@ -9,6 +9,7 @@ import { type IAccessControlAware, type IDashboard, type IDashboardDefinition, + type IDashboardParameter, type IDashboardTab, type IFilterContext, type ITempFilterContext, @@ -36,7 +37,6 @@ import { selectPersistedDashboard, selectPersistedDashboardFilterContextAsFilterContextDefinition, } from "../../store/meta/metaSelectors.js"; -import { selectSmartPersistedDashboardParameters } from "../../store/parameters/parametersSelectors.js"; import { selectIsInViewMode } from "../../store/renderMode/renderModeSelectors.js"; import { savingActions } from "../../store/saving/index.js"; import { selectAttributeFilterConfigsOverrides } from "../../store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js"; @@ -49,6 +49,7 @@ import { import { tabsActions } from "../../store/tabs/index.js"; import { filterOutCustomWidgets, selectBasicLayout } from "../../store/tabs/layout/layoutSelectors.js"; import { selectMeasureValueFilterConfigsOverrides } from "../../store/tabs/measureValueFilterConfigs/measureValueFilterConfigsSelectors.js"; +import { selectSmartPersistedTabsParameters } from "../../store/tabs/parameters/parametersSelectors.js"; import { selectTabs } from "../../store/tabs/tabsSelectors.js"; import { type ITabState } from "../../store/tabs/tabsState.js"; import { selectCurrentUser } from "../../store/user/userSelectors.js"; @@ -99,6 +100,7 @@ function createDashboard(ctx: DashboardContext, saveAsCtx: DashboardSaveAsContex */ function processExistingTabsForSaveAs( tabs: ITabState[], + parametersByTab: Record, useOriginalFilterContext?: boolean, ): IDashboardTab[] { return tabs.map((tab) => { @@ -130,6 +132,8 @@ function processExistingTabsForSaveAs( } as IFilterContext | ITempFilterContext) : undefined; + const tabParameters = parametersByTab[tab.localIdentifier] ?? []; + const result: IDashboardTab = { // explicitly type the result to avoid type errors caused by spread operators localIdentifier: tab.localIdentifier, @@ -141,6 +145,9 @@ function processExistingTabsForSaveAs( ...dateFilterConfigsProp, ...attributeFilterConfigsProp, ...measureValueFilterConfigsProp, + // Always persist `parameters` (incl. `[]`) so V1 root fallback never re-hydrates stale + // root parameters when every tab has been emptied. + parameters: tabParameters, }; return result; @@ -208,8 +215,8 @@ function* createDashboardSaveAsContext(cmd: SaveDashboardAs): SagaIterator = yield select(selectTabs); - const parameters: ReturnType = yield select( - selectSmartPersistedDashboardParameters, + const parametersByTab: ReturnType = yield select( + selectSmartPersistedTabsParameters, ); const capabilities: ReturnType = @@ -219,7 +226,9 @@ function* createDashboardSaveAsContext(cmd: SaveDashboardAs): SagaIterator 0 ? processExistingTabsForSaveAs(tabs, useOriginalFilterContext) : undefined; + tabs && tabs.length > 0 + ? processExistingTabsForSaveAs(tabs, parametersByTab, useOriginalFilterContext) + : undefined; const dashboardFromState: IDashboardDefinition = { type: "IDashboard", @@ -233,7 +242,6 @@ function* createDashboardSaveAsContext(cmd: SaveDashboardAs): SagaIterator, +): IDashboardTab[] { return tabs.map((tab) => { const dateFilterConfig = tab.dateFilterConfig?.dateFilterConfig; @@ -168,6 +173,8 @@ function processExistingTabs(tabs: ITabState[]): IDashboardTab[] { } as IFilterContext | ITempFilterContext) : undefined; + const tabParameters = parametersByTab[tab.localIdentifier] ?? []; + const result: IDashboardTab = { // explicitly type the result to avoid type errors caused by spread operators localIdentifier: tab.localIdentifier, @@ -180,6 +187,9 @@ function processExistingTabs(tabs: ITabState[]): IDashboardTab[] { ...attributeFilterConfigsProp, ...measureValueFilterConfigsProp, ...filterGroupsConfigProp, + // Always persist `parameters` (incl. `[]`) so V1 root fallback never re-hydrates stale + // root parameters when every tab has been emptied. + parameters: tabParameters, }; return result; }); @@ -235,6 +245,7 @@ function resolveProcessedTabs( attributeFilterConfigs: IDashboardDefinition["attributeFilterConfigs"], dateFilterConfigs: IDashboardDefinition["dateFilterConfigs"], measureValueFilterConfigs: IDashboardDefinition["measureValueFilterConfigs"], + parametersByTab: Record, ): IDashboardTab[] | undefined { // If no tabs exist, create a default tab with root-level properties const shouldCreateDefaultTab = !tabs || tabs.length === 0; @@ -251,7 +262,7 @@ function resolveProcessedTabs( } if (tabs) { - return processExistingTabs(tabs); + return processExistingTabs(tabs, parametersByTab); } return undefined; @@ -289,8 +300,8 @@ function* createDashboardSaveContext( const measureValueFilterConfigs: ReturnType = yield select(selectMeasureValueFilterConfigsOverrides); const tabs: ReturnType = yield select(selectTabs); - const parameters: ReturnType = yield select( - selectSmartPersistedDashboardParameters, + const parametersByTab: ReturnType = yield select( + selectSmartPersistedTabsParameters, ); const capabilities: ReturnType = yield select(selectBackendCapabilities); @@ -324,6 +335,7 @@ function* createDashboardSaveContext( attributeFilterConfigs, dateFilterConfigs, measureValueFilterConfigs, + parametersByTab, ); const locale: ReturnType = yield select(selectLocale); @@ -349,7 +361,6 @@ function* createDashboardSaveContext( measureValueFilterConfigs, ), ...(processedTabs ? { tabs: processedTabs } : {}), - ...(parameters.length > 0 ? { parameters } : {}), ...pluginsProp, }; diff --git a/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts b/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts index 4bada4e3271..88b2c67eb08 100644 --- a/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts +++ b/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts @@ -47,7 +47,6 @@ import { listedDashboardsSliceReducer } from "./listedDashboards/index.js"; import { loadingSliceReducer } from "./loading/index.js"; import { metaSliceReducer } from "./meta/index.js"; import { notificationChannelsSliceReducer } from "./notificationChannels/index.js"; -import { parametersSliceReducer } from "./parameters/index.js"; import { permissionsSliceReducer } from "./permissions/index.js"; import { renderModeSliceReducer } from "./renderMode/index.js"; import { savingSliceReducer } from "./saving/index.js"; @@ -324,7 +323,6 @@ export function createDashboardRootReducer({ dashboardPermissions: dashboardPermissionsSliceReducer, showWidgetAsTable: showWidgetAsTableSliceReducer, notificationChannels: notificationChannelsSliceReducer, - parameters: parametersSliceReducer, automations: automationsSliceReducer, users: usersSliceReducer, filterViews: filterViewsSliceReducer, diff --git a/libs/sdk-ui-dashboard/src/model/store/meta/metaSelectors.ts b/libs/sdk-ui-dashboard/src/model/store/meta/metaSelectors.ts index df6c42da14e..1241003f58d 100644 --- a/libs/sdk-ui-dashboard/src/model/store/meta/metaSelectors.ts +++ b/libs/sdk-ui-dashboard/src/model/store/meta/metaSelectors.ts @@ -36,10 +36,6 @@ import { uriRef, } from "@gooddata/sdk-model"; -import { - selectIsParametersChanged, - selectSmartPersistedDashboardParameters, -} from "../parameters/parametersSelectors.js"; import { selectAttributeFilterConfigsOverridesByTab } from "../tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js"; import { selectDateFilterConfigOverrides, @@ -57,6 +53,10 @@ import { selectBasicLayoutByTab, } from "../tabs/layout/layoutSelectors.js"; import { selectMeasureValueFilterConfigsOverridesByTab } from "../tabs/measureValueFilterConfigs/measureValueFilterConfigsSelectors.js"; +import { + selectIsParametersChanged, + selectSmartPersistedTabsParameters, +} from "../tabs/parameters/parametersSelectors.js"; import { selectActiveTabLocalIdentifier, selectTabs } from "../tabs/tabsSelectors.js"; import { DEFAULT_TAB_ID, type ITabState } from "../tabs/tabsState.js"; import { type DashboardSelector, type DashboardState } from "../types.js"; @@ -142,6 +142,7 @@ export const selectPersistedDashboardTabs = createSelector(selectSelf, (state): dateFilterConfig: persistedDashboard.dateFilterConfig, dateFilterConfigs: persistedDashboard.dateFilterConfigs, layout: persistedDashboard.layout, + parameters: persistedDashboard.parameters, }, ]; }); @@ -1175,7 +1176,7 @@ export const selectDashboardWorkingDefinition: DashboardSelector { const dashboardIdentity: Partial = { ref: persistedDashboard?.ref, @@ -1204,7 +1205,6 @@ export const selectDashboardWorkingDefinition: DashboardSelector 0 ? { parameters } : {}), ...(tabs ? { tabs: tabs.map( @@ -1226,6 +1226,7 @@ export const selectDashboardWorkingDefinition: DashboardSelector = parametersSlice.reducer; - -/** - * @internal - */ -export const parametersActions = { ...parametersSlice.actions }; diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersSelectors.ts b/libs/sdk-ui-dashboard/src/model/store/parameters/parametersSelectors.ts deleted file mode 100644 index 49c5eefed0f..00000000000 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersSelectors.ts +++ /dev/null @@ -1,199 +0,0 @@ -// (C) 2026 GoodData Corporation - -import { createSelector } from "@reduxjs/toolkit"; -import { isEqual } from "lodash-es"; - -import { - type IDashboardParameter, - type IInsightParameterValue, - type IParameterMetadataObject, - type ObjRef, - areObjRefsEqual, - insightParameters, - isNumberParameterDefinition, - objRefToString, -} from "@gooddata/sdk-model"; - -import { createMemoizedSelector } from "../_infra/selectors.js"; -import { selectCatalogParameters, selectCatalogParametersIsLoaded } from "../catalog/catalogSelectors.js"; -import { selectEnableParameters } from "../config/configSelectors.js"; -import { selectInsightByWidgetRef } from "../insights/insightsSelectors.js"; -import { type DashboardSelector, type DashboardState } from "../types.js"; - -import { type IDashboardParameterEntry } from "./parametersState.js"; - -const selectSelf = (state: DashboardState) => state.parameters; - -const EMPTY_PARAMETERS: IDashboardParameter[] = []; - -const selectPersistedParametersFromMeta: DashboardSelector = (state) => - state.meta?.persistedDashboard?.parameters ?? EMPTY_PARAMETERS; - -/** - * Returns the persisted-shape parameter entries currently held by the dashboard. - * - * @alpha - */ -export const selectDashboardParameters: DashboardSelector = createSelector( - selectSelf, - (state) => state.parameters.map((entry) => entry.parameter), -); - -/** - * Returns currently active parameter references. - * - * @alpha - */ -export const selectActiveParameterRefKeys: DashboardSelector> = createSelector( - selectDashboardParameters, - (parameters) => new Set(parameters.map((parameter) => objRefToString(parameter.ref))), -); - -/** - * Returns the full per-parameter entries (persisted shape + ephemeral `runtimeOverride`). - * - * @internal - */ -export const selectDashboardParameterEntries: DashboardSelector = createSelector( - selectSelf, - (state) => state.parameters, -); - -/** - * Returns a selector that yields the entry held by the dashboard for a given parameter ref, - * or `undefined` if no such entry exists. - * - * @alpha - */ -export const selectDashboardParameterEntryByRef: ( - ref: ObjRef, -) => DashboardSelector = createMemoizedSelector((ref: ObjRef) => - createSelector(selectSelf, (state) => - state.parameters.find((item) => areObjRefsEqual(item.parameter.ref, ref)), - ), -); - -/** - * Returns a selector that yields the current `runtimeOverride` for a given parameter ref, - * or `undefined` if the dashboard does not hold an entry for that ref. - * - * @alpha - */ -export const selectParameterRuntimeOverrideByRef: (ref: ObjRef) => DashboardSelector = - createMemoizedSelector((ref: ObjRef) => - createSelector(selectDashboardParameterEntryByRef(ref), (entry) => entry?.runtimeOverride), - ); - -/** - * Computes the dashboard parameters in the shape that would be persisted on save right now. - * - * @remarks - * For resolved entries (catalog parameters loaded AND ref present), applies smart persistence: - * `value` is dropped when equal to the workspace default and `label` is dropped when equal - * to the parameter title. For non-resolved entries (catalog not loaded, gated off, or ref - * missing), the persisted entry is passed through verbatim so we never compare against an - * unknown workspace default. - * - * @internal - */ -export const selectSmartPersistedDashboardParameters: DashboardSelector = - createSelector( - selectDashboardParameterEntries, - selectCatalogParameters, - selectCatalogParametersIsLoaded, - selectPersistedParametersFromMeta, - (entries, workspaceParameters, isCatalogLoaded, persistedParameters) => { - const persistedByRef = new Map( - persistedParameters.map((parameter) => [objRefToString(parameter.ref), parameter]), - ); - const workspaceByRef = new Map(workspaceParameters.map((wp) => [objRefToString(wp.ref), wp])); - return entries.map((entry) => { - const refKey = objRefToString(entry.parameter.ref); - const workspaceParameter = isCatalogLoaded ? workspaceByRef.get(refKey) : undefined; - if (!workspaceParameter) { - return persistedByRef.get(refKey) ?? entry.parameter; - } - return smartPersistResolvedEntry(entry, workspaceParameter); - }); - }, - ); - -/** - * Returns true if the dashboard parameters that would be persisted differ from the persisted version. - * - * @alpha - */ -export const selectIsParametersChanged: DashboardSelector = createSelector( - selectSmartPersistedDashboardParameters, - selectPersistedParametersFromMeta, - (smartPersisted, persisted) => !isEqual(smartPersisted, persisted), -); - -/** - * Returns the parameter values to inject into the widget's `IExecutionConfig.parameterValues`. - * - * @remarks - * The result is the intersection of dashboard parameter entries and the parameters referenced - * by the widget's insight (per `insightParameters`). Dashboard parameters not referenced by the - * widget's insight are excluded so that adding/removing unrelated parameters does not invalidate - * the widget's `defFingerprint`. Returns an empty array when `enableParameters` is off so - * persisted parameter values cannot silently affect execution while the UI is hidden. - * - * @alpha - */ -export const selectEffectiveParameterValuesForWidget: ( - ref: ObjRef | undefined, -) => DashboardSelector = createMemoizedSelector((ref: ObjRef | undefined) => - createSelector( - selectDashboardParameterEntries, - selectInsightByWidgetRef(ref), - selectEnableParameters, - (entries, insight, isEnabled) => { - if (!isEnabled || !insight) { - return []; - } - const referencedRefs = new Set( - insightParameters(insight).map((parameter) => objRefToString(parameter.ref)), - ); - const result: IInsightParameterValue[] = []; - for (const entry of entries) { - if (entry.runtimeOverride === undefined) { - continue; - } - if (referencedRefs.has(objRefToString(entry.parameter.ref))) { - result.push({ ref: entry.parameter.ref, value: entry.runtimeOverride }); - } - } - return result; - }, - ), -); - -function smartPersistResolvedEntry( - entry: IDashboardParameterEntry, - workspaceParameter: IParameterMetadataObject, -): IDashboardParameter { - const workspaceDefault = isNumberParameterDefinition(workspaceParameter.definition) - ? workspaceParameter.definition.defaultValue - : undefined; - const result: IDashboardParameter = { - ref: entry.parameter.ref, - parameterType: entry.parameter.parameterType, - mode: entry.parameter.mode, - ...labelOverride(entry, workspaceParameter), - }; - if (entry.runtimeOverride === undefined || entry.runtimeOverride === workspaceDefault) { - return result; - } - return { ...result, value: entry.runtimeOverride }; -} - -function labelOverride( - entry: IDashboardParameterEntry, - workspaceParameter: IParameterMetadataObject, -): { label?: string } { - if (entry.parameter.label && entry.parameter.label !== workspaceParameter.title) { - return { label: entry.parameter.label }; - } - return {}; -} diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersReducers.test.ts b/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersReducers.test.ts deleted file mode 100644 index 8d5bc62a70a..00000000000 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersReducers.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -// (C) 2026 GoodData Corporation - -import { describe, expect, it } from "vitest"; - -import { type IDashboardParameter, idRef } from "@gooddata/sdk-model"; - -import { parametersActions, parametersSliceReducer } from "../index.js"; -import { type IParametersState, parametersInitialState } from "../parametersState.js"; - -const topNRef = idRef("topN", "parameter"); -const sampleRef = idRef("sampleSize", "parameter"); - -const topNParameter: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", -}; - -const topNPinned: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", - value: 25, -}; - -function reduce( - state: IParametersState, - action: ReturnType<(typeof parametersActions)[keyof typeof parametersActions]>, -) { - return parametersSliceReducer(state, action); -} - -describe("parameters slice", () => { - describe("addParameter", () => { - it("adds entry initialized to workspace default when value not pinned", () => { - const next = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - - expect(next.parameters).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); - }); - - it("adds entry initialized to pinned value when present", () => { - const next = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNPinned, workspaceDefault: 10 }), - ); - - expect(next.parameters).toEqual([{ parameter: topNPinned, runtimeOverride: 25 }]); - }); - - it("ignores duplicate refs (picker dedup)", () => { - const once = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - const twice = reduce( - once, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 50 }), - ); - - expect(twice.parameters).toHaveLength(1); - expect(twice.parameters[0]?.runtimeOverride).toBe(10); - }); - }); - - describe("setParameterRuntimeValue", () => { - it("updates only runtimeOverride, leaves persisted entry untouched", () => { - const initial = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - - const next = reduce( - initial, - parametersActions.setParameterRuntimeValue({ ref: topNRef, value: 99 }), - ); - - expect(next.parameters[0]?.parameter).toEqual(topNParameter); - expect(next.parameters[0]?.runtimeOverride).toBe(99); - }); - - it("is a no-op when ref is unknown", () => { - const initial = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - - const next = reduce( - initial, - parametersActions.setParameterRuntimeValue({ ref: sampleRef, value: 99 }), - ); - - expect(next.parameters).toEqual(initial.parameters); - }); - }); - - describe("removeParameter", () => { - it("filters out the entry by ref", () => { - const seeded = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - - const next = reduce(seeded, parametersActions.removeParameter({ ref: topNRef })); - - expect(next.parameters).toEqual([]); - }); - }); - - describe("setParameterEntries", () => { - it("replaces entries (used on dashboard load)", () => { - const replacement = [{ parameter: topNPinned, runtimeOverride: 25 }]; - - const next = reduce(parametersInitialState, parametersActions.setParameterEntries(replacement)); - - expect(next.parameters).toEqual(replacement); - }); - }); -}); diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersSelectors.test.ts b/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersSelectors.test.ts deleted file mode 100644 index f5aac5bf67b..00000000000 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersSelectors.test.ts +++ /dev/null @@ -1,312 +0,0 @@ -// (C) 2026 GoodData Corporation - -import { describe, expect, it, vi } from "vitest"; - -import { - type IDashboard, - type IDashboardParameter, - type IInsight, - type IInsightParameterValue, - type IParameterMetadataObject, - idRef, -} from "@gooddata/sdk-model"; - -vi.mock("../../insights/insightsSelectors.js", () => ({ - selectInsightByWidgetRef: (widgetRef: { identifier: string } | undefined) => () => { - if (!widgetRef) return undefined; - return WIDGET_INSIGHT_MAP[widgetRef.identifier]; - }, -})); - -const WIDGET_INSIGHT_MAP: Record = {}; - -import { type DashboardState } from "../../types.js"; -import { - selectDashboardParameterEntries, - selectDashboardParameters, - selectEffectiveParameterValuesForWidget, - selectIsParametersChanged, - selectParameterRuntimeOverrideByRef, - selectSmartPersistedDashboardParameters, -} from "../parametersSelectors.js"; -import { type IDashboardParameterEntry } from "../parametersState.js"; - -const topNRef = idRef("topN", "parameter"); -const otherRef = idRef("sampleSize", "parameter"); - -const topNParameter: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", -}; - -const topNWorkspace: IParameterMetadataObject = { - type: "parameter", - id: "topN", - uri: "/topN", - ref: topNRef, - title: "Top N", - description: "", - production: true, - deprecated: false, - unlisted: false, - definition: { type: "NUMBER", defaultValue: 10 }, -}; - -const entry: IDashboardParameterEntry = { - parameter: topNParameter, - runtimeOverride: 25, -}; - -function makeState(parameters: IDashboardParameterEntry[]): DashboardState { - return { parameters: { parameters } } as DashboardState; -} - -interface IFullStateOptions { - entries: IDashboardParameterEntry[]; - workspaceParameters?: IParameterMetadataObject[]; - catalogStatus?: "loaded" | "loading" | "failed" | "gated-off" | "uninitialized"; - persistedDashboardParameters?: IDashboardParameter[]; - enableParameters?: boolean; -} - -function makeFullState({ - entries, - workspaceParameters = [], - catalogStatus = "loaded", - persistedDashboardParameters, - enableParameters = true, -}: IFullStateOptions): DashboardState { - const persistedDashboard: Partial | undefined = - persistedDashboardParameters === undefined - ? undefined - : ({ parameters: persistedDashboardParameters } as Partial); - return { - parameters: { parameters: entries }, - catalog: { - parameters: { status: catalogStatus, parameters: workspaceParameters }, - }, - meta: { persistedDashboard }, - config: { config: { settings: { enableParameters } } }, - } as unknown as DashboardState; -} - -describe("parameter selectors", () => { - it("selectDashboardParameters returns persisted-shape entries", () => { - expect(selectDashboardParameters(makeState([entry]))).toEqual([topNParameter]); - }); - - it("selectDashboardParameterEntries returns full entries", () => { - expect(selectDashboardParameterEntries(makeState([entry]))).toEqual([entry]); - }); - - it("selectParameterRuntimeOverrideByRef returns runtimeOverride for matching ref", () => { - const select = selectParameterRuntimeOverrideByRef(topNRef); - expect(select(makeState([entry]))).toBe(25); - }); - - it("selectParameterRuntimeOverrideByRef returns undefined when ref absent", () => { - const select = selectParameterRuntimeOverrideByRef(otherRef); - expect(select(makeState([entry]))).toBeUndefined(); - }); - - describe("selectSmartPersistedDashboardParameters", () => { - it("omits value when runtimeOverride equals workspace default", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 10 }], - workspaceParameters: [topNWorkspace], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([ - { ref: topNRef, parameterType: "NUMBER", mode: "active" }, - ]); - }); - - it("emits value when runtimeOverride differs from workspace default", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - workspaceParameters: [topNWorkspace], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([ - { ref: topNRef, parameterType: "NUMBER", mode: "active", value: 25 }, - ]); - }); - - it("omits label when equal to workspace title", () => { - const state = makeFullState({ - entries: [ - { - parameter: { ...topNParameter, label: "Top N" }, - runtimeOverride: 10, - }, - ], - workspaceParameters: [topNWorkspace], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([ - { ref: topNRef, parameterType: "NUMBER", mode: "active" }, - ]); - }); - - it("preserves label when different from workspace title", () => { - const state = makeFullState({ - entries: [ - { - parameter: { ...topNParameter, label: "Custom Label" }, - runtimeOverride: 10, - }, - ], - workspaceParameters: [topNWorkspace], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([ - { ref: topNRef, parameterType: "NUMBER", mode: "active", label: "Custom Label" }, - ]); - }); - - it("emits non-resolved entry verbatim from persistedDashboard when catalog status is not loaded", () => { - const persisted: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", - value: 99, - }; - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - catalogStatus: "gated-off", - persistedDashboardParameters: [persisted], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([persisted]); - }); - - it("emits non-resolved entry verbatim when ref absent from loaded catalog", () => { - const persisted: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", - value: 99, - }; - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - workspaceParameters: [], - persistedDashboardParameters: [persisted], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([persisted]); - }); - }); - - describe("selectIsParametersChanged", () => { - it("is false when smart-persisted matches persisted", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 10 }], - workspaceParameters: [topNWorkspace], - persistedDashboardParameters: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], - }); - expect(selectIsParametersChanged(state)).toBe(false); - }); - - it("is true when runtimeOverride diverges from persisted value", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 99 }], - workspaceParameters: [topNWorkspace], - persistedDashboardParameters: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], - }); - expect(selectIsParametersChanged(state)).toBe(true); - }); - - it("is true when entry added", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 10 }], - workspaceParameters: [topNWorkspace], - persistedDashboardParameters: [], - }); - expect(selectIsParametersChanged(state)).toBe(true); - }); - - it("is false when no persisted dashboard and no entries", () => { - const state = makeFullState({ - entries: [], - workspaceParameters: [], - }); - expect(selectIsParametersChanged(state)).toBe(false); - }); - }); - - describe("selectEffectiveParameterValuesForWidget", () => { - const widgetRef = idRef("w-1", "insight"); - const sampleSizeRef = idRef("sampleSize", "parameter"); - - function setInsight(parameterValues: IInsightParameterValue[]): IInsight { - const insight = { - insight: { - parameters: parameterValues, - }, - } as unknown as IInsight; - WIDGET_INSIGHT_MAP[widgetRef.identifier] = insight; - return insight; - } - - it("returns runtimeOverride for parameters referenced by the insight", () => { - setInsight([{ ref: topNRef, value: 0 }]); - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - }); - expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([ - { ref: topNRef, value: 25 }, - ]); - }); - - it("excludes dashboard parameters not referenced by the insight", () => { - setInsight([{ ref: topNRef, value: 0 }]); - const sampleSize: IDashboardParameter = { - ref: sampleSizeRef, - parameterType: "NUMBER", - mode: "active", - }; - const state = makeFullState({ - entries: [ - { parameter: topNParameter, runtimeOverride: 25 }, - { parameter: sampleSize, runtimeOverride: 99 }, - ], - }); - expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([ - { ref: topNRef, value: 25 }, - ]); - }); - - it("returns identical reference when an unrelated parameter is added (defFingerprint stability)", () => { - setInsight([{ ref: topNRef, value: 0 }]); - const stateWithoutUnrelated = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - }); - const sampleSize: IDashboardParameter = { - ref: sampleSizeRef, - parameterType: "NUMBER", - mode: "active", - }; - const stateWithUnrelated = makeFullState({ - entries: [ - { parameter: topNParameter, runtimeOverride: 25 }, - { parameter: sampleSize, runtimeOverride: 99 }, - ], - }); - expect(selectEffectiveParameterValuesForWidget(widgetRef)(stateWithoutUnrelated)).toEqual( - selectEffectiveParameterValuesForWidget(widgetRef)(stateWithUnrelated), - ); - }); - - it("returns empty array when widget has no insight", () => { - const missingRef = idRef("missing", "insight"); - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - }); - expect(selectEffectiveParameterValuesForWidget(missingRef)(state)).toEqual([]); - }); - - it("returns empty array when enableParameters is off", () => { - setInsight([{ ref: topNRef, value: 0 }]); - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - enableParameters: false, - }); - expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([]); - }); - }); -}); diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/index.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/index.ts index 359fe086a41..1cea4dd2a9e 100644 --- a/libs/sdk-ui-dashboard/src/model/store/tabs/index.ts +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/index.ts @@ -8,6 +8,7 @@ import { dateFilterConfigsReducers } from "./dateFilterConfigs/dateFilterConfigs import { filterContextReducers } from "./filterContext/filterContextReducers.js"; import { layoutReducers } from "./layout/layoutReducers.js"; import { measureValueFilterConfigsReducers } from "./measureValueFilterConfigs/measureValueFilterConfigsReducers.js"; +import { parametersReducers } from "./parameters/parametersReducers.js"; import { tabsReducers } from "./tabsReducers.js"; import { tabsInitialState } from "./tabsState.js"; @@ -19,6 +20,7 @@ const allReducers = { ...measureValueFilterConfigsReducers, ...filterContextReducers, ...layoutReducers, + ...parametersReducers, } as const; const tabsSlice = createSlice({ diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersReducers.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersReducers.ts similarity index 50% rename from libs/sdk-ui-dashboard/src/model/store/parameters/parametersReducers.ts rename to libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersReducers.ts index abd27105964..cc5024c9e5a 100644 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersReducers.ts +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersReducers.ts @@ -4,12 +4,14 @@ import { type Action, type CaseReducer, type PayloadAction } from "@reduxjs/tool import { type IDashboardParameter, type ObjRef, areObjRefsEqual } from "@gooddata/sdk-model"; -import { type IDashboardParameterEntry, type IParametersState } from "./parametersState.js"; +import { type ITabsState, getActiveTab } from "../tabsState.js"; -type ParametersReducer = CaseReducer; +import { parametersInitialState } from "./parametersState.js"; + +type ParametersReducer = CaseReducer; /** - * Add a parameter to the dashboard. Initial `runtimeOverride` is `parameter.value` + * Add a parameter to the active tab. Initial `runtimeOverride` is `parameter.value` * (when pinned) otherwise the workspace default supplied by the caller. * * @alpha @@ -20,14 +22,21 @@ export interface IAddParameterPayload { } const addParameter: ParametersReducer> = (state, action) => { + const activeTab = getActiveTab(state); + if (!activeTab) { + return; + } const { parameter, workspaceDefault } = action.payload; - if (state.parameters.some((entry) => areObjRefsEqual(entry.parameter.ref, parameter.ref))) { + const tabParameters = activeTab.parameters ?? parametersInitialState; + if (tabParameters.parameters.some((entry) => areObjRefsEqual(entry.parameter.ref, parameter.ref))) { return; } - state.parameters.push({ - parameter, - runtimeOverride: parameter.value ?? workspaceDefault, - }); + activeTab.parameters = { + parameters: [ + ...tabParameters.parameters, + { parameter, runtimeOverride: parameter.value ?? workspaceDefault }, + ], + }; }; /** @@ -42,8 +51,12 @@ const setParameterRuntimeValue: ParametersReducer { + const activeTab = getActiveTab(state); + if (!activeTab?.parameters) { + return; + } const { ref, value } = action.payload; - const entry = state.parameters.find((item) => areObjRefsEqual(item.parameter.ref, ref)); + const entry = activeTab.parameters.parameters.find((item) => areObjRefsEqual(item.parameter.ref, ref)); if (entry) { entry.runtimeOverride = value; } @@ -57,23 +70,19 @@ export interface IRemoveParameterPayload { } const removeParameter: ParametersReducer> = (state, action) => { - state.parameters = state.parameters.filter( - (entry) => !areObjRefsEqual(entry.parameter.ref, action.payload.ref), - ); -}; - -/** - * Replace the entire entry list. Used when (re-)loading a persisted dashboard. - * - * @alpha - */ -const setParameterEntries: ParametersReducer> = (state, action) => { - state.parameters = action.payload; + const activeTab = getActiveTab(state); + if (!activeTab?.parameters) { + return; + } + activeTab.parameters = { + parameters: activeTab.parameters.parameters.filter( + (entry) => !areObjRefsEqual(entry.parameter.ref, action.payload.ref), + ), + }; }; export const parametersReducers = { addParameter, setParameterRuntimeValue, removeParameter, - setParameterEntries, }; diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersSelectors.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersSelectors.ts new file mode 100644 index 00000000000..486ffb3fb69 --- /dev/null +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersSelectors.ts @@ -0,0 +1,361 @@ +// (C) 2026 GoodData Corporation + +import { createSelector } from "@reduxjs/toolkit"; +import { isEqual } from "lodash-es"; + +import { + type IDashboardLayout, + type IDashboardParameter, + type IDashboardTab, + type IInsightParameterValue, + type IInsightWidget, + type IParameterMetadataObject, + type ObjRef, + areObjRefsEqual, + insightParameters, + isDashboardLayout, + isInsightWidget, + isNumberParameterDefinition, + isVisualizationSwitcherWidget, + objRefToString, +} from "@gooddata/sdk-model"; + +import { type ExtendedDashboardWidget } from "../../../types/layoutTypes.js"; +import { createMemoizedSelector } from "../../_infra/selectors.js"; +import { selectCatalogParameters, selectCatalogParametersIsLoaded } from "../../catalog/catalogSelectors.js"; +import { selectEnableParameters } from "../../config/configSelectors.js"; +import { selectInsightsMap } from "../../insights/insightsSelectors.js"; +import { type DashboardSelector } from "../../types.js"; +import { selectActiveTab, selectTabs } from "../tabsSelectors.js"; +import { DEFAULT_TAB_ID, type ITabState } from "../tabsState.js"; + +import { + type IDashboardParameterEntry, + parametersInitialState, + pickTabParametersSource, +} from "./parametersState.js"; + +const EMPTY_PARAMETERS: IDashboardParameter[] = []; +const EMPTY_TABS: IDashboardTab[] = []; + +const selectParametersState = createSelector( + selectActiveTab, + (activeTab) => activeTab?.parameters ?? parametersInitialState, +); + +const selectPersistedParametersFromMeta: DashboardSelector = (state) => + state.meta?.persistedDashboard?.parameters ?? EMPTY_PARAMETERS; + +const selectPersistedDashboardTabsRaw: DashboardSelector = (state) => + state.meta?.persistedDashboard?.tabs ?? EMPTY_TABS; + +/** + * Returns the persisted-shape parameter entries currently held by the active tab. + * + * @alpha + */ +export const selectDashboardParameters: DashboardSelector = createSelector( + selectParametersState, + (state) => state.parameters.map((entry) => entry.parameter), +); + +/** + * Returns currently active parameter references on the active tab. + * + * @alpha + */ +export const selectActiveParameterRefKeys: DashboardSelector> = createSelector( + selectDashboardParameters, + (parameters) => new Set(parameters.map((parameter) => objRefToString(parameter.ref))), +); + +/** + * Returns the full per-parameter entries (persisted shape + ephemeral `runtimeOverride`) for the + * active tab. + * + * @internal + */ +export const selectDashboardParameterEntries: DashboardSelector = createSelector( + selectParametersState, + (state) => state.parameters, +); + +/** + * Returns a selector that yields the entry held by the active tab for a given parameter ref, + * or `undefined` if no such entry exists. + * + * @alpha + */ +export const selectDashboardParameterEntryByRef: ( + ref: ObjRef, +) => DashboardSelector = createMemoizedSelector((ref: ObjRef) => + createSelector(selectParametersState, (state) => + state.parameters.find((item) => areObjRefsEqual(item.parameter.ref, ref)), + ), +); + +/** + * Returns a selector that yields the current `runtimeOverride` for a given parameter ref on the + * active tab, or `undefined` if the active tab does not hold an entry for that ref. + * + * @alpha + */ +export const selectParameterRuntimeOverrideByRef: (ref: ObjRef) => DashboardSelector = + createMemoizedSelector((ref: ObjRef) => + createSelector(selectDashboardParameterEntryByRef(ref), (entry) => entry?.runtimeOverride), + ); + +/** + * Computes the dashboard parameters keyed by tab `localIdentifier` in the shape that would be + * persisted on save right now. + * + * @remarks + * Smart persistence applies independently per tab: `value` is dropped when equal to the + * workspace default, `label` is dropped when equal to the parameter title, all per tab. + * Non-resolved entries (catalog not loaded, gated off, ref missing) are emitted verbatim from + * the previously persisted entry on the same tab when available. V1 fallback applies when no + * tab in the persisted dashboard carries `parameters` — the persisted root array is used as the + * persistence source for every tab. + * + * @internal + */ +export const selectSmartPersistedTabsParameters: DashboardSelector> = + createSelector( + selectTabs, + selectCatalogParameters, + selectCatalogParametersIsLoaded, + selectPersistedDashboardTabsRaw, + selectPersistedParametersFromMeta, + (tabs, workspaceParameters, isCatalogLoaded, persistedTabs, rootPersistedParameters) => { + const result: Record = {}; + if (!tabs) { + return result; + } + const workspaceByRef = new Map(workspaceParameters.map((wp) => [objRefToString(wp.ref), wp])); + const persistedByTabAndRef = buildPersistedByTabAndRef(persistedTabs, rootPersistedParameters); + for (const tab of tabs) { + const entries = tab.parameters?.parameters ?? []; + const persistedForTab = persistedByTabAndRef.get(tab.localIdentifier) ?? new Map(); + result[tab.localIdentifier] = entries.map((entry) => { + const refKey = objRefToString(entry.parameter.ref); + const workspaceParameter = isCatalogLoaded ? workspaceByRef.get(refKey) : undefined; + if (!workspaceParameter) { + return persistedForTab.get(refKey) ?? entry.parameter; + } + return smartPersistResolvedEntry(entry, workspaceParameter); + }); + } + return result; + }, + ); + +/** + * Returns persisted parameters from `meta.persistedDashboard`, keyed by tab `localIdentifier`. + * Honors V1 → per-tab migration: when no tab in the persisted dashboard carries `parameters`, + * the persisted root `parameters` is used as fallback for every tab. For legacy single-tab + * dashboards (no `tabs[]` in persistedDashboard), the synthetic `DEFAULT_TAB_ID` tab carries + * the persisted root parameters. + * + * @internal + */ +const selectPersistedTabsParametersFromMeta: DashboardSelector> = + createSelector( + selectPersistedDashboardTabsRaw, + selectPersistedParametersFromMeta, + (persistedTabs, rootPersistedParameters) => { + const result: Record = {}; + if (persistedTabs.length === 0) { + result[DEFAULT_TAB_ID] = rootPersistedParameters; + return result; + } + for (const tab of persistedTabs) { + result[tab.localIdentifier] = + pickTabParametersSource(tab, persistedTabs, rootPersistedParameters) ?? EMPTY_PARAMETERS; + } + return result; + }, + ); + +/** + * Returns true if the dashboard parameters that would be persisted differ from the persisted + * version on any tab. + * + * @alpha + */ +export const selectIsParametersChanged: DashboardSelector = createSelector( + selectSmartPersistedTabsParameters, + selectPersistedTabsParametersFromMeta, + (smartPersistedByTab, persistedByTab) => { + const allTabIds = new Set([...Object.keys(smartPersistedByTab), ...Object.keys(persistedByTab)]); + for (const tabId of allTabIds) { + const smart = smartPersistedByTab[tabId] ?? EMPTY_PARAMETERS; + const persisted = persistedByTab[tabId] ?? EMPTY_PARAMETERS; + if (!isEqual(smart, persisted)) { + return true; + } + } + return false; + }, +); + +/** + * Returns the parameter values to inject into the widget's `IExecutionConfig.parameterValues`. + * + * @remarks + * The widget's owning tab is resolved from layout, then the result is the intersection of that + * tab's parameter entries and the parameters referenced by the widget's insight (per + * `insightParameters`). Dashboard parameters not referenced by the widget's insight are excluded + * so that adding/removing unrelated parameters does not invalidate the widget's `defFingerprint`. + * Returns an empty array when `enableParameters` is off so persisted parameter values cannot + * silently affect execution while the UI is hidden. + * + * @alpha + */ +export const selectEffectiveParameterValuesForWidget: ( + ref: ObjRef | undefined, +) => DashboardSelector = createMemoizedSelector((ref: ObjRef | undefined) => + createSelector( + selectParameterExecutionContextByWidgetRef(ref), + selectInsightsMap, + selectEnableParameters, + (context, insights, isEnabled) => { + if (!isEnabled || !context) { + return []; + } + const insight = insights.get(context.widget.insight); + if (!insight) { + return []; + } + const entries = context.tab.parameters?.parameters ?? parametersInitialState.parameters; + const referencedRefs = new Set( + insightParameters(insight).map((parameter) => objRefToString(parameter.ref)), + ); + const result: IInsightParameterValue[] = []; + for (const entry of entries) { + if (entry.runtimeOverride === undefined) { + continue; + } + if (referencedRefs.has(objRefToString(entry.parameter.ref))) { + result.push({ ref: entry.parameter.ref, value: entry.runtimeOverride }); + } + } + return result; + }, + ), +); + +interface IParameterExecutionContext { + tab: ITabState; + widget: IInsightWidget; +} + +const selectParameterExecutionContextByWidgetRef: ( + ref: ObjRef | undefined, +) => DashboardSelector = createMemoizedSelector( + (ref: ObjRef | undefined) => + createSelector(selectTabs, (tabs) => findParameterExecutionContext(tabs, ref)), +); + +function findParameterExecutionContext( + tabs: ITabState[] | undefined, + ref: ObjRef | undefined, +): IParameterExecutionContext | undefined { + if (!ref || !tabs) { + return undefined; + } + + for (const tab of tabs) { + const layout = tab.layout?.layout; + if (!layout) { + continue; + } + + const widget = findInsightWidgetInLayout(layout, ref); + if (widget) { + return { tab, widget }; + } + } + + return undefined; +} + +function findInsightWidgetInLayout( + layout: IDashboardLayout, + ref: ObjRef, +): IInsightWidget | undefined { + for (const section of layout.sections) { + for (const item of section.items) { + const widget = item.widget; + if (!widget) { + continue; + } + + if (isInsightWidget(widget) && areObjRefsEqual(widget.ref, ref)) { + return widget; + } + + if (isDashboardLayout(widget)) { + const nestedWidget = findInsightWidgetInLayout(widget, ref); + if (nestedWidget) { + return nestedWidget; + } + } + + if (isVisualizationSwitcherWidget(widget)) { + const visualization = widget.visualizations.find((visualization) => + areObjRefsEqual(visualization.ref, ref), + ); + if (visualization) { + return visualization; + } + } + } + } + + return undefined; +} + +function buildPersistedByTabAndRef( + persistedTabs: ReadonlyArray, + rootPersistedParameters: IDashboardParameter[], +): Map> { + const result = new Map>(); + for (const tab of persistedTabs) { + const sourceParameters = + pickTabParametersSource(tab, persistedTabs, rootPersistedParameters) ?? EMPTY_PARAMETERS; + result.set( + tab.localIdentifier, + new Map(sourceParameters.map((parameter) => [objRefToString(parameter.ref), parameter])), + ); + } + return result; +} + +function smartPersistResolvedEntry( + entry: IDashboardParameterEntry, + workspaceParameter: IParameterMetadataObject, +): IDashboardParameter { + const workspaceDefault = isNumberParameterDefinition(workspaceParameter.definition) + ? workspaceParameter.definition.defaultValue + : undefined; + const result: IDashboardParameter = { + ref: entry.parameter.ref, + parameterType: entry.parameter.parameterType, + mode: entry.parameter.mode, + ...labelOverride(entry, workspaceParameter), + }; + if (entry.runtimeOverride === undefined || entry.runtimeOverride === workspaceDefault) { + return result; + } + return { ...result, value: entry.runtimeOverride }; +} + +function labelOverride( + entry: IDashboardParameterEntry, + workspaceParameter: IParameterMetadataObject, +): { label?: string } { + if (entry.parameter.label && entry.parameter.label !== workspaceParameter.title) { + return { label: entry.parameter.label }; + } + return {}; +} diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersState.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersState.ts similarity index 57% rename from libs/sdk-ui-dashboard/src/model/store/parameters/parametersState.ts rename to libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersState.ts index 39f3156814b..7803b9e30b5 100644 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersState.ts +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersState.ts @@ -1,6 +1,6 @@ // (C) 2026 GoodData Corporation -import { type IDashboardParameter } from "@gooddata/sdk-model"; +import { type IDashboardParameter, type IDashboardTab } from "@gooddata/sdk-model"; /** * Per-parameter state tracked by the dashboard store. @@ -33,3 +33,24 @@ export interface IParametersState { export const parametersInitialState: IParametersState = { parameters: [], }; + +/** + * Picks a tab's persisted parameter source under the V1 → per-tab migration rule. + * + * - If the tab has its own `parameters` (including `[]`) → return it. + * - Else if every tab's `parameters === undefined` AND root `parameters` is defined → root array. + * - Else → `undefined`. + * + * @internal + */ +export function pickTabParametersSource( + tab: IDashboardTab, + allTabs: ReadonlyArray, + rootParameters: IDashboardParameter[] | undefined, +): IDashboardParameter[] | undefined { + if (tab.parameters !== undefined) { + return tab.parameters; + } + const everyTabUndefined = allTabs.length > 0 && allTabs.every((other) => other.parameters === undefined); + return everyTabUndefined ? rootParameters : undefined; +} diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersReducers.test.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersReducers.test.ts new file mode 100644 index 00000000000..f790757ce83 --- /dev/null +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersReducers.test.ts @@ -0,0 +1,191 @@ +// (C) 2026 GoodData Corporation + +import { produce } from "immer"; +import { describe, expect, it } from "vitest"; + +import { type IDashboardParameter, idRef } from "@gooddata/sdk-model"; + +import { tabsActions } from "../../index.js"; +import { type ITabsState } from "../../tabsState.js"; +import { parametersReducers } from "../parametersReducers.js"; +import { type IParametersState } from "../parametersState.js"; + +const topNRef = idRef("topN", "parameter"); +const sampleRef = idRef("sampleSize", "parameter"); + +const topNParameter: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", +}; + +const topNPinned: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", + value: 25, +}; + +function makeState(parameters?: IParametersState["parameters"]): ITabsState { + return { + tabs: [ + { + localIdentifier: "tab-1", + title: "Tab 1", + parameters: parameters ? { parameters } : undefined, + }, + ], + activeTabLocalIdentifier: "tab-1", + }; +} + +function activeParameters(state: ITabsState): IParametersState["parameters"] { + return state.tabs?.[0]?.parameters?.parameters ?? []; +} + +describe("parameters reducers (per tab)", () => { + describe("addParameter", () => { + it("adds entry initialized to workspace default when value not pinned", () => { + const initial = makeState(); + + const next = produce(initial, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), + ), + ); + + expect(activeParameters(next as ITabsState)).toEqual([ + { parameter: topNParameter, runtimeOverride: 10 }, + ]); + }); + + it("adds entry initialized to pinned value when present", () => { + const initial = makeState(); + + const next = produce(initial, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNPinned, workspaceDefault: 10 }), + ), + ); + + expect(activeParameters(next as ITabsState)).toEqual([ + { parameter: topNPinned, runtimeOverride: 25 }, + ]); + }); + + it("ignores duplicate refs (picker dedup) within the active tab", () => { + const initial = makeState(); + + const once = produce(initial, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), + ), + ); + const twice = produce(once, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNParameter, workspaceDefault: 50 }), + ), + ); + + expect(activeParameters(twice as ITabsState)).toHaveLength(1); + expect(activeParameters(twice as ITabsState)[0]?.runtimeOverride).toBe(10); + }); + + it("only writes to the active tab", () => { + const initial: ITabsState = { + tabs: [ + { localIdentifier: "tab-1", title: "Tab 1" }, + { localIdentifier: "tab-2", title: "Tab 2" }, + ], + activeTabLocalIdentifier: "tab-2", + }; + + const next = produce(initial, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), + ), + ); + + expect(next.tabs?.[0]?.parameters).toBeUndefined(); + expect(next.tabs?.[1]?.parameters?.parameters).toEqual([ + { parameter: topNParameter, runtimeOverride: 10 }, + ]); + }); + }); + + describe("setParameterRuntimeValue", () => { + it("updates only runtimeOverride on the active tab, leaves persisted entry untouched", () => { + const initial = makeState([{ parameter: topNParameter, runtimeOverride: 10 }]); + + const next = produce(initial, (draft) => + parametersReducers.setParameterRuntimeValue( + draft, + tabsActions.setParameterRuntimeValue({ ref: topNRef, value: 99 }), + ), + ); + + expect(activeParameters(next as ITabsState)[0]?.parameter).toEqual(topNParameter); + expect(activeParameters(next as ITabsState)[0]?.runtimeOverride).toBe(99); + }); + + it("is a no-op when ref is unknown on the active tab", () => { + const initial = makeState([{ parameter: topNParameter, runtimeOverride: 10 }]); + + const next = produce(initial, (draft) => + parametersReducers.setParameterRuntimeValue( + draft, + tabsActions.setParameterRuntimeValue({ ref: sampleRef, value: 99 }), + ), + ); + + expect(activeParameters(next as ITabsState)).toEqual([ + { parameter: topNParameter, runtimeOverride: 10 }, + ]); + }); + + it("setting runtime override on tab A does not change tab B's value for the same ref", () => { + const initial: ITabsState = { + tabs: [ + { + localIdentifier: "tab-A", + title: "Tab A", + parameters: { parameters: [{ parameter: topNParameter, runtimeOverride: 10 }] }, + }, + { + localIdentifier: "tab-B", + title: "Tab B", + parameters: { parameters: [{ parameter: topNParameter, runtimeOverride: 10 }] }, + }, + ], + activeTabLocalIdentifier: "tab-A", + }; + + const next = produce(initial, (draft) => + parametersReducers.setParameterRuntimeValue( + draft, + tabsActions.setParameterRuntimeValue({ ref: topNRef, value: 99 }), + ), + ); + + expect(next.tabs?.[0]?.parameters?.parameters[0]?.runtimeOverride).toBe(99); + expect(next.tabs?.[1]?.parameters?.parameters[0]?.runtimeOverride).toBe(10); + }); + }); + + describe("removeParameter", () => { + it("filters out the entry by ref from the active tab", () => { + const initial = makeState([{ parameter: topNParameter, runtimeOverride: 10 }]); + + const next = produce(initial, (draft) => + parametersReducers.removeParameter(draft, tabsActions.removeParameter({ ref: topNRef })), + ); + + expect(activeParameters(next as ITabsState)).toEqual([]); + }); + }); +}); diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersSelectors.test.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersSelectors.test.ts new file mode 100644 index 00000000000..be14761095c --- /dev/null +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersSelectors.test.ts @@ -0,0 +1,598 @@ +// (C) 2026 GoodData Corporation + +import { describe, expect, it } from "vitest"; + +import { + type IDashboard, + type IDashboardParameter, + type IInsight, + type IInsightParameterValue, + type IParameterMetadataObject, + type ObjRef, + idRef, + objRefToString, +} from "@gooddata/sdk-model"; + +import { insightsAdapter } from "../../../insights/insightsEntityAdapter.js"; +import { type DashboardState } from "../../../types.js"; +import { + selectActiveParameterRefKeys, + selectDashboardParameterEntries, + selectDashboardParameters, + selectEffectiveParameterValuesForWidget, + selectIsParametersChanged, + selectParameterRuntimeOverrideByRef, + selectSmartPersistedTabsParameters, +} from "../parametersSelectors.js"; +import { type IDashboardParameterEntry } from "../parametersState.js"; + +function makeInsight(ref: ObjRef, parameters: IInsightParameterValue[]): IInsight { + const identifier = (ref as { identifier?: string }).identifier ?? "insight"; + return { + insight: { + ref, + identifier, + uri: `/insights/${identifier}`, + title: identifier, + visualizationUrl: "local:test", + buckets: [], + filters: [], + sorts: [], + properties: {}, + parameters, + }, + } as unknown as IInsight; +} + +function makeInsightsSliceState(insights: IInsight[]) { + return insightsAdapter.setAll(insightsAdapter.getInitialState(), insights); +} + +const BACKEND_CAPABILITIES: DashboardState["backendCapabilities"] = { + backendCapabilities: { + hasTypeScopedIdentifiers: false, + } as DashboardState["backendCapabilities"]["backendCapabilities"], +}; + +const topNRef = idRef("topN", "parameter"); +const otherRef = idRef("sampleSize", "parameter"); + +const topNParameter: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", +}; + +const topNWorkspace: IParameterMetadataObject = { + type: "parameter", + id: "topN", + uri: "/topN", + ref: topNRef, + title: "Top N", + description: "", + production: true, + deprecated: false, + unlisted: false, + definition: { type: "NUMBER", defaultValue: 10 }, +}; + +const entry: IDashboardParameterEntry = { + parameter: topNParameter, + runtimeOverride: 25, +}; + +function makeState(parameters: IDashboardParameterEntry[]): DashboardState { + return { + tabs: { + tabs: [ + { + localIdentifier: "tab-1", + title: "Tab 1", + parameters: { parameters }, + }, + ], + activeTabLocalIdentifier: "tab-1", + }, + } as unknown as DashboardState; +} + +interface IFullStateOptions { + entries: IDashboardParameterEntry[]; + workspaceParameters?: IParameterMetadataObject[]; + catalogStatus?: "loaded" | "loading" | "failed" | "gated-off" | "uninitialized"; + persistedDashboardParameters?: IDashboardParameter[]; + enableParameters?: boolean; + insights?: IInsight[]; +} + +const TAB_ID = "tab-1"; +const W1_REF = { identifier: "w-1", type: "insight" } as const; +const W1_INSIGHT_REF = idRef("insight-1", "insight"); + +function makeFullState({ + entries, + workspaceParameters = [], + catalogStatus = "loaded", + persistedDashboardParameters, + enableParameters = true, + insights = [], +}: IFullStateOptions): DashboardState { + const persistedDashboard: Partial | undefined = + persistedDashboardParameters === undefined + ? undefined + : ({ + parameters: persistedDashboardParameters, + tabs: [ + { + localIdentifier: TAB_ID, + title: "Tab 1", + parameters: persistedDashboardParameters, + }, + ], + } as Partial); + return { + tabs: { + tabs: [ + { + localIdentifier: TAB_ID, + title: "Tab 1", + parameters: { parameters: entries }, + layout: { + layout: { + type: "IDashboardLayout", + sections: [ + { + type: "IDashboardLayoutSection", + items: [ + { + type: "IDashboardLayoutItem", + size: { xl: { gridWidth: 12 } }, + widget: { + type: "insight", + identifier: "w-1", + ref: W1_REF, + insight: W1_INSIGHT_REF, + }, + }, + ], + }, + ], + }, + }, + }, + ], + activeTabLocalIdentifier: TAB_ID, + }, + insights: makeInsightsSliceState(insights), + backendCapabilities: BACKEND_CAPABILITIES, + catalog: { + parameters: { status: catalogStatus, parameters: workspaceParameters }, + }, + meta: { persistedDashboard }, + config: { config: { settings: { enableParameters } } }, + } as unknown as DashboardState; +} + +describe("parameter selectors (per tab)", () => { + it("selectDashboardParameters returns persisted-shape entries from active tab", () => { + expect(selectDashboardParameters(makeState([entry]))).toEqual([topNParameter]); + }); + + it("selectDashboardParameterEntries returns full entries from active tab", () => { + expect(selectDashboardParameterEntries(makeState([entry]))).toEqual([entry]); + }); + + it("selectParameterRuntimeOverrideByRef returns runtimeOverride for matching ref", () => { + const select = selectParameterRuntimeOverrideByRef(topNRef); + expect(select(makeState([entry]))).toBe(25); + }); + + it("selectParameterRuntimeOverrideByRef returns undefined when ref absent", () => { + const select = selectParameterRuntimeOverrideByRef(otherRef); + expect(select(makeState([entry]))).toBeUndefined(); + }); + + describe("selectSmartPersistedTabsParameters", () => { + it("omits value when runtimeOverride equals workspace default (per tab)", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ + [TAB_ID]: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], + }); + }); + + it("emits value when runtimeOverride differs from workspace default (per tab)", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + workspaceParameters: [topNWorkspace], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ + [TAB_ID]: [{ ref: topNRef, parameterType: "NUMBER", mode: "active", value: 25 }], + }); + }); + + it("omits label when equal to workspace title", () => { + const state = makeFullState({ + entries: [{ parameter: { ...topNParameter, label: "Top N" }, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ + [TAB_ID]: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], + }); + }); + + it("preserves label when different from workspace title", () => { + const state = makeFullState({ + entries: [{ parameter: { ...topNParameter, label: "Custom Label" }, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ + [TAB_ID]: [{ ref: topNRef, parameterType: "NUMBER", mode: "active", label: "Custom Label" }], + }); + }); + + it("emits non-resolved entry verbatim from persisted when catalog status is not loaded", () => { + const persisted: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", + value: 99, + }; + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + catalogStatus: "gated-off", + persistedDashboardParameters: [persisted], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ [TAB_ID]: [persisted] }); + }); + + it("emits non-resolved entry verbatim when ref absent from loaded catalog", () => { + const persisted: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", + value: 99, + }; + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + workspaceParameters: [], + persistedDashboardParameters: [persisted], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ [TAB_ID]: [persisted] }); + }); + + it("falls back to live entry when non-resolved and no persisted entry on the same tab", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + catalogStatus: "gated-off", + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ [TAB_ID]: [topNParameter] }); + }); + }); + + describe("selectIsParametersChanged", () => { + it("is false when smart-persisted matches persisted", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + persistedDashboardParameters: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], + }); + expect(selectIsParametersChanged(state)).toBe(false); + }); + + it("is true when runtimeOverride diverges from persisted value", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 99 }], + workspaceParameters: [topNWorkspace], + persistedDashboardParameters: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], + }); + expect(selectIsParametersChanged(state)).toBe(true); + }); + + it("is true when entry added", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + persistedDashboardParameters: [], + }); + expect(selectIsParametersChanged(state)).toBe(true); + }); + + it("is false when no persisted dashboard and no entries", () => { + const state = makeFullState({ + entries: [], + workspaceParameters: [], + }); + expect(selectIsParametersChanged(state)).toBe(false); + }); + }); + + describe("selectEffectiveParameterValuesForWidget", () => { + const widgetRef = W1_REF; + const sampleSizeRef = idRef("sampleSize", "parameter"); + const insightWithTopN: IInsight = makeInsight(W1_INSIGHT_REF, [{ ref: topNRef, value: 0 }]); + + it("returns runtimeOverride for parameters referenced by the insight", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + insights: [insightWithTopN], + }); + expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([ + { ref: topNRef, value: 25 }, + ]); + }); + + it("excludes dashboard parameters not referenced by the insight", () => { + const sampleSize: IDashboardParameter = { + ref: sampleSizeRef, + parameterType: "NUMBER", + mode: "active", + }; + const state = makeFullState({ + entries: [ + { parameter: topNParameter, runtimeOverride: 25 }, + { parameter: sampleSize, runtimeOverride: 99 }, + ], + insights: [insightWithTopN], + }); + expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([ + { ref: topNRef, value: 25 }, + ]); + }); + + it("returns identical reference when an unrelated parameter is added (defFingerprint stability)", () => { + const stateWithoutUnrelated = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + insights: [insightWithTopN], + }); + const sampleSize: IDashboardParameter = { + ref: sampleSizeRef, + parameterType: "NUMBER", + mode: "active", + }; + const stateWithUnrelated = makeFullState({ + entries: [ + { parameter: topNParameter, runtimeOverride: 25 }, + { parameter: sampleSize, runtimeOverride: 99 }, + ], + insights: [insightWithTopN], + }); + expect(selectEffectiveParameterValuesForWidget(widgetRef)(stateWithoutUnrelated)).toEqual( + selectEffectiveParameterValuesForWidget(widgetRef)(stateWithUnrelated), + ); + }); + + it("returns empty array when widget has no insight", () => { + const missingRef = idRef("missing", "insight"); + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + }); + expect(selectEffectiveParameterValuesForWidget(missingRef)(state)).toEqual([]); + }); + + it("returns empty array when enableParameters is off", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + enableParameters: false, + insights: [insightWithTopN], + }); + expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([]); + }); + + it("resolves the owning tab for an insight nested in a visualization switcher", () => { + const switcherChildRef = idRef("switcher-child", "insight"); + const switcherChildInsightRef = idRef("switcher-child-insight", "insight"); + const state = { + tabs: { + tabs: [ + { + localIdentifier: TAB_ID, + title: "Tab 1", + parameters: { + parameters: [{ parameter: topNParameter, runtimeOverride: 42 }], + }, + layout: { + layout: { + type: "IDashboardLayout", + sections: [ + { + type: "IDashboardLayoutSection", + items: [ + { + type: "IDashboardLayoutItem", + size: { xl: { gridWidth: 12 } }, + widget: { + type: "visualizationSwitcher", + identifier: "switcher-1", + ref: { identifier: "switcher-1", type: "insight" }, + visualizations: [ + { + type: "insight", + identifier: "switcher-child", + ref: switcherChildRef, + insight: switcherChildInsightRef, + }, + ], + }, + }, + ], + }, + ], + }, + }, + }, + ], + activeTabLocalIdentifier: TAB_ID, + }, + insights: makeInsightsSliceState([ + makeInsight(switcherChildInsightRef, [{ ref: topNRef, value: 0 }]), + ]), + backendCapabilities: BACKEND_CAPABILITIES, + catalog: { parameters: { status: "loaded", parameters: [] } }, + meta: { persistedDashboard: undefined }, + config: { config: { settings: { enableParameters: true } } }, + } as unknown as DashboardState; + + expect(selectEffectiveParameterValuesForWidget(switcherChildRef)(state)).toEqual([ + { ref: topNRef, value: 42 }, + ]); + }); + }); + + describe("per-tab independence (acceptance tests)", () => { + const widgetA = { identifier: "w-A", type: "insight" } as const; + const widgetB = { identifier: "w-B", type: "insight" } as const; + const insightARef = idRef("insight-A", "insight"); + const insightBRef = idRef("insight-B", "insight"); + const insightAWithTopN = makeInsight(insightARef, [{ ref: topNRef, value: 0 }]); + const insightBWithTopN = makeInsight(insightBRef, [{ ref: topNRef, value: 0 }]); + + function makeTwoTabState({ + tabAEntries, + tabBEntries, + workspaceParameters = [topNWorkspace], + enableParameters = true, + insights = [], + }: { + tabAEntries: IDashboardParameterEntry[]; + tabBEntries: IDashboardParameterEntry[]; + workspaceParameters?: IParameterMetadataObject[]; + enableParameters?: boolean; + insights?: IInsight[]; + }): DashboardState { + return { + tabs: { + tabs: [ + { + localIdentifier: "tab-A", + title: "Tab A", + parameters: { parameters: tabAEntries }, + layout: { + layout: { + type: "IDashboardLayout", + sections: [ + { + type: "IDashboardLayoutSection", + items: [ + { + type: "IDashboardLayoutItem", + size: { xl: { gridWidth: 12 } }, + widget: { + type: "insight", + identifier: "w-A", + ref: widgetA, + insight: insightARef, + }, + }, + ], + }, + ], + }, + }, + }, + { + localIdentifier: "tab-B", + title: "Tab B", + parameters: { parameters: tabBEntries }, + layout: { + layout: { + type: "IDashboardLayout", + sections: [ + { + type: "IDashboardLayoutSection", + items: [ + { + type: "IDashboardLayoutItem", + size: { xl: { gridWidth: 12 } }, + widget: { + type: "insight", + identifier: "w-B", + ref: widgetB, + insight: insightBRef, + }, + }, + ], + }, + ], + }, + }, + }, + ], + activeTabLocalIdentifier: "tab-A", + }, + insights: makeInsightsSliceState(insights), + backendCapabilities: BACKEND_CAPABILITIES, + catalog: { parameters: { status: "loaded", parameters: workspaceParameters } }, + meta: { persistedDashboard: undefined }, + config: { config: { settings: { enableParameters } } }, + } as unknown as DashboardState; + } + + it("per-tab widget execution — widget on tab A consumes tab A's runtime, widget on tab B does not", () => { + // Both widgets reference param topN via insight, but only tab A has it added. + const state = makeTwoTabState({ + tabAEntries: [{ parameter: topNParameter, runtimeOverride: 25 }], + tabBEntries: [], + insights: [insightAWithTopN, insightBWithTopN], + }); + + expect(selectEffectiveParameterValuesForWidget(widgetA)(state)).toEqual([ + { ref: topNRef, value: 25 }, + ]); + expect(selectEffectiveParameterValuesForWidget(widgetB)(state)).toEqual([]); + }); + + it("widgets on different tabs see their own tab's runtimeOverride", () => { + const state = makeTwoTabState({ + tabAEntries: [{ parameter: topNParameter, runtimeOverride: 25 }], + tabBEntries: [{ parameter: topNParameter, runtimeOverride: 99 }], + insights: [insightAWithTopN, insightBWithTopN], + }); + + expect(selectEffectiveParameterValuesForWidget(widgetA)(state)).toEqual([ + { ref: topNRef, value: 25 }, + ]); + expect(selectEffectiveParameterValuesForWidget(widgetB)(state)).toEqual([ + { ref: topNRef, value: 99 }, + ]); + }); + + it("resolves insight for a widget on a non-active tab (cross-tab insight lookup)", () => { + // Regression: widget B lives on tab B (not active). With active-only insight resolution, + // the selector would return [] regardless of tab B's runtimeOverride. Cross-tab lookup + // must return the override defined on tab B. + const state = makeTwoTabState({ + tabAEntries: [], + tabBEntries: [{ parameter: topNParameter, runtimeOverride: 77 }], + insights: [insightAWithTopN, insightBWithTopN], + }); + + expect(selectEffectiveParameterValuesForWidget(widgetB)(state)).toEqual([ + { ref: topNRef, value: 77 }, + ]); + }); + + it("per-tab picker deduplication — active tab dedup ignores other tabs", () => { + // selectActiveParameterRefKeys reflects only the active tab's parameters. + const stateActiveOnA = makeTwoTabState({ + tabAEntries: [{ parameter: topNParameter, runtimeOverride: 25 }], + tabBEntries: [], + }); + const tabAKeys = selectActiveParameterRefKeys(stateActiveOnA); + expect(tabAKeys.has(objRefToString(topNRef))).toBe(true); + + // Switching active tab — same selector now returns tab B's keys (empty). + const stateActiveOnB: DashboardState = { + ...stateActiveOnA, + tabs: { + ...(stateActiveOnA.tabs as unknown as Record), + activeTabLocalIdentifier: "tab-B", + }, + } as unknown as DashboardState; + const tabBKeys = selectActiveParameterRefKeys(stateActiveOnB); + expect(tabBKeys.has(objRefToString(topNRef))).toBe(false); + }); + }); +}); diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/tabsState.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/tabsState.ts index 503164ba1d2..126044d3869 100644 --- a/libs/sdk-ui-dashboard/src/model/store/tabs/tabsState.ts +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/tabsState.ts @@ -9,6 +9,7 @@ import { type IDateFilterConfigsState } from "./dateFilterConfigs/dateFilterConf import type { FilterContextState } from "./filterContext/filterContextState.js"; import type { ILayoutState } from "./layout/layoutState.js"; import { type IMeasureValueFilterConfigsState } from "./measureValueFilterConfigs/measureValueFilterConfigsState.js"; +import { type IParametersState } from "./parameters/parametersState.js"; /** * Identifier used for dashboards without explicit tabs support and the first tab created automatically. @@ -57,6 +58,7 @@ export interface ITabState { filterContext?: FilterContextState; filterGroupsConfig?: IDashboardFilterGroupsConfig; layout?: ILayoutState; + parameters?: IParametersState; /** * UI-only flag indicating the tab is currently being renamed. diff --git a/libs/sdk-ui-dashboard/src/model/store/types.ts b/libs/sdk-ui-dashboard/src/model/store/types.ts index 01810b8a9a4..6caac603397 100644 --- a/libs/sdk-ui-dashboard/src/model/store/types.ts +++ b/libs/sdk-ui-dashboard/src/model/store/types.ts @@ -22,7 +22,6 @@ import { type IFilterViewsState } from "./filterViews/filterViewsState.js"; import { type ILoadingState } from "./loading/loadingState.js"; import { type IDashboardMetaState } from "./meta/metaState.js"; import { type INotificationChannelsState } from "./notificationChannels/notificationChannelsState.js"; -import { type IParametersState } from "./parameters/parametersState.js"; import { type PermissionsState } from "./permissions/permissionsState.js"; import { type IRenderModeState } from "./renderMode/renderModeState.js"; import { type SavingState } from "./saving/savingState.js"; @@ -92,12 +91,6 @@ export type DashboardState = { /** @alpha */ notificationChannels: INotificationChannelsState; - /** - * Dashboard-level parameter overrides slice. - * @alpha - */ - parameters: IParametersState; - /** * Internal state for dashboard summary AI workflow. * diff --git a/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.tsx b/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.tsx index f210513623f..e797146f0ab 100644 --- a/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.tsx @@ -4,7 +4,7 @@ import { ParameterControlButton } from "@gooddata/sdk-ui-kit"; import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js"; import { selectCatalogParameterByRef } from "../../../model/store/catalog/catalogSelectors.js"; -import { selectDashboardParameterEntryByRef } from "../../../model/store/parameters/parametersSelectors.js"; +import { selectDashboardParameterEntryByRef } from "../../../model/store/tabs/parameters/parametersSelectors.js"; import { type ParameterDraggableItem } from "../types.js"; /** diff --git a/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/useFilterDeleteDrop.ts b/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/useFilterDeleteDrop.ts index 7895f3ada86..1077540ca7a 100644 --- a/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/useFilterDeleteDrop.ts +++ b/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/useFilterDeleteDrop.ts @@ -11,7 +11,7 @@ import { removeMeasureValueFilter, } from "../../model/commands/filters.js"; import { useDashboardDispatch } from "../../model/react/DashboardStoreProvider.js"; -import { parametersActions } from "../../model/store/parameters/index.js"; +import { tabsActions } from "../../model/store/tabs/index.js"; import { isAttributeFilterDraggableItem, @@ -42,7 +42,7 @@ export function useFilterDeleteDrop() { const identifier = dashboardFilterLocalIdentifier(item.filter)!; dispatch(removeMeasureValueFilter(identifier)); } else if (isParameterDraggableItem(item)) { - dispatch(parametersActions.removeParameter({ ref: item.ref })); + dispatch(tabsActions.removeParameter({ ref: item.ref })); } }, }, diff --git a/libs/sdk-ui-dashboard/src/presentation/filterBar/filterBar/DefaultFilterBar.tsx b/libs/sdk-ui-dashboard/src/presentation/filterBar/filterBar/DefaultFilterBar.tsx index 430e807a357..c0b99d2a280 100644 --- a/libs/sdk-ui-dashboard/src/presentation/filterBar/filterBar/DefaultFilterBar.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/filterBar/filterBar/DefaultFilterBar.tsx @@ -50,7 +50,6 @@ import { selectIsApplyFiltersAllAtOnceEnabledAndSet, selectIsExport, } from "../../../model/store/config/configSelectors.js"; -import { selectDashboardParameters } from "../../../model/store/parameters/parametersSelectors.js"; import { selectIsInEditMode } from "../../../model/store/renderMode/renderModeSelectors.js"; import { selectEffectiveAttributeFiltersModeMap } from "../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js"; import { @@ -66,6 +65,7 @@ import { } from "../../../model/store/tabs/filterContext/filterContextSelectors.js"; import { selectFilterGroupsConfig } from "../../../model/store/tabs/filterGroups/filterGroupsSelectors.js"; import { selectEffectiveMeasureValueFiltersModeMap } from "../../../model/store/tabs/measureValueFilterConfigs/measureValueFilterConfigsSelectors.js"; +import { selectDashboardParameters } from "../../../model/store/tabs/parameters/parametersSelectors.js"; import { useDashboardComponentsContext } from "../../dashboardContexts/DashboardComponentsContext.js"; import { DraggableFilterDropZone } from "../../dragAndDrop/draggableFilterDropZone/DraggableFilterDropZone.js"; import { DraggableFilterDropZoneHint } from "../../dragAndDrop/draggableFilterDropZone/DraggableFilterDropZoneHint.js"; diff --git a/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterFilter.tsx b/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterFilter.tsx index 03742c70940..b536d842889 100644 --- a/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterFilter.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterFilter.tsx @@ -12,9 +12,9 @@ import { Dropdown, ParameterControlButton, ParameterControlDropdown } from "@goo import { useDashboardDispatch, useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js"; import { selectCatalogParameterByRef } from "../../../model/store/catalog/catalogSelectors.js"; -import { parametersActions } from "../../../model/store/parameters/index.js"; -import { selectParameterRuntimeOverrideByRef } from "../../../model/store/parameters/parametersSelectors.js"; import { selectIsInEditMode } from "../../../model/store/renderMode/renderModeSelectors.js"; +import { tabsActions } from "../../../model/store/tabs/index.js"; +import { selectParameterRuntimeOverrideByRef } from "../../../model/store/tabs/parameters/parametersSelectors.js"; import { DraggableChipSource } from "../../dragAndDrop/DraggableChipSource.js"; /** @@ -80,9 +80,7 @@ export function DashboardParameterFilter({ parameter }: IDashboardParameterFilte value={runtimeOverride} constraints={constraints} onApply={(value) => { - dispatch( - parametersActions.setParameterRuntimeValue({ ref: parameter.ref, value }), - ); + dispatch(tabsActions.setParameterRuntimeValue({ ref: parameter.ref, value })); closeDropdown(); }} onCancel={closeDropdown} diff --git a/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterPicker.tsx b/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterPicker.tsx index 991f0058009..55e9c6eadf3 100644 --- a/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterPicker.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterPicker.tsx @@ -10,8 +10,8 @@ import { selectCatalogParameters, selectCatalogParametersStatus, } from "../../../model/store/catalog/catalogSelectors.js"; -import { parametersActions } from "../../../model/store/parameters/index.js"; -import { selectActiveParameterRefKeys } from "../../../model/store/parameters/parametersSelectors.js"; +import { tabsActions } from "../../../model/store/tabs/index.js"; +import { selectActiveParameterRefKeys } from "../../../model/store/tabs/parameters/parametersSelectors.js"; const PICKER_MAX_LIST_HEIGHT = 320; @@ -48,7 +48,7 @@ export function DashboardParameterPicker({ onAdd, onCancel }: IDashboardParamete continue; } dispatch( - parametersActions.addParameter({ + tabsActions.addParameter({ parameter: { ref, parameterType: "NUMBER", diff --git a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx index bb8165a159a..4b85a4308ec 100644 --- a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx @@ -53,12 +53,12 @@ import { selectCrossFilteringSelectedPointsByWidgetRef, selectDrillableItems, } from "../../../../../model/store/drill/drillSelectors.js"; -import { selectEffectiveParameterValuesForWidget } from "../../../../../model/store/parameters/parametersSelectors.js"; import { selectPermissions } from "../../../../../model/store/permissions/permissionsSelectors.js"; import { selectIsInEditMode, selectIsInExportMode, } from "../../../../../model/store/renderMode/renderModeSelectors.js"; +import { selectEffectiveParameterValuesForWidget } from "../../../../../model/store/tabs/parameters/parametersSelectors.js"; import { selectExecutionTimestamp } from "../../../../../model/store/ui/uiSelectors.js"; import { useDashboardComponentsContext } from "../../../../dashboardContexts/DashboardComponentsContext.js"; import { useMinimalSizeValidation } from "../../../../export/hooks/useMinimalSizeValidation.js"; diff --git a/libs/sdk-ui-ext/package.json b/libs/sdk-ui-ext/package.json index d48eac742d3..6373307ac31 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Extensions", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", @@ -44,7 +44,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-filters/package.json b/libs/sdk-ui-filters/package.json index ea4fdbc48aa..1fc46f534bd 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Filter Components", "license": "MIT", "author": "GoodData Corporation", @@ -38,7 +38,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", 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 0b343a13e2f..31edf2adfb1 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 @@ -13,6 +13,7 @@ import type { GenAIChatInteractionUserFeedback } from '@gooddata/sdk-model'; import type { GenAIChatRoutingUseCase } from '@gooddata/sdk-model'; import { GenAIObjectType } from '@gooddata/sdk-model'; import { IAnalyticalBackend } from '@gooddata/sdk-backend-spi'; +import { IChatConversation } from '@gooddata/sdk-backend-spi'; import { IChatConversationContent } from '@gooddata/sdk-backend-spi'; import { IChatConversationError } from '@gooddata/sdk-backend-spi'; import { IChatConversationItem } from '@gooddata/sdk-backend-spi'; @@ -68,6 +69,33 @@ export type ChatClosedEvent = BaseEvent & { type: "chatClosed"; }; +// @public +export type ChatConversationDeletedErrorEvent = BaseEvent & { + type: "chatConversationDeletedError"; + conversation: IChatConversation; + error: Error; +}; + +// @public +export type ChatConversationDeletedEvent = BaseEvent & { + type: "chatConversationDeleted"; + conversation: IChatConversation; +}; + +// @public +export type ChatConversationPinErrorEvent = BaseEvent & { + type: "chatConversationPinError"; + conversationId: string; + error: Error; +}; + +// @public +export type ChatConversationPinnedEvent = BaseEvent & { + type: "chatConversationPinned"; + conversationId: string; + pinned: boolean; +}; + // @public export type ChatCopyToClipboardEvent = BaseEvent & { type: "chatCopyToClipboard"; @@ -75,7 +103,7 @@ export type ChatCopyToClipboardEvent = BaseEvent & { }; // @public -export type ChatEvent = ChatOpenedEvent | ChatClosedEvent | ChatResetEvent | ChatUserMessageEvent | ChatAssistantMessageEvent | ChatFeedbackEvent | ChatFeedbackErrorEvent | ChatCopyToClipboardEvent | ChatVisualizationErrorEvent | ChatSaveVisualizationErrorEvent | ChatSaveVisualizationSuccessEvent; +export type ChatEvent = ChatOpenedEvent | ChatClosedEvent | ChatResetEvent | ChatConversationPinnedEvent | ChatConversationPinErrorEvent | ChatConversationDeletedEvent | ChatConversationDeletedErrorEvent | ChatUserMessageEvent | ChatAssistantMessageEvent | ChatFeedbackEvent | ChatFeedbackErrorEvent | ChatCopyToClipboardEvent | ChatVisualizationErrorEvent | ChatSaveVisualizationErrorEvent | ChatSaveVisualizationSuccessEvent; // @public export type ChatEventHandler = { @@ -273,6 +301,18 @@ export const isChatAssistantMessageEvent: (event: ChatEvent) => event is ChatAss // @public export const isChatClosedEvent: (event: ChatEvent) => event is ChatClosedEvent; +// @public +export const isChatConversationDeletedErrorEvent: (event: ChatEvent) => event is ChatConversationDeletedErrorEvent; + +// @public +export const isChatConversationDeletedEvent: (event: ChatEvent) => event is ChatConversationDeletedEvent; + +// @public +export const isChatConversationPinErrorEvent: (event: ChatEvent) => event is ChatConversationPinErrorEvent; + +// @public +export const isChatConversationPinnedEvent: (event: ChatEvent) => event is ChatConversationPinnedEvent; + // @public export const isChatCopyToClipboardEvent: (event: ChatEvent) => event is ChatCopyToClipboardEvent; diff --git a/libs/sdk-ui-gen-ai/package.json b/libs/sdk-ui-gen-ai/package.json index 4c68350e034..0235542a2a6 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData GenAI SDK", "license": "MIT", "author": "GoodData Corporation", @@ -41,7 +41,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-gen-ai/src/components/GenAIChatConversations.tsx b/libs/sdk-ui-gen-ai/src/components/GenAIChatConversations.tsx index 7dad5ef4a81..50754ccbe1b 100644 --- a/libs/sdk-ui-gen-ai/src/components/GenAIChatConversations.tsx +++ b/libs/sdk-ui-gen-ai/src/components/GenAIChatConversations.tsx @@ -1,6 +1,15 @@ // (C) 2026 GoodData Corporation -import { type FC, type RefObject, useCallback, useMemo, useRef, useState } from "react"; +import { + type DragEvent, + type FC, + type KeyboardEvent, + type RefObject, + useCallback, + useMemo, + useRef, + useState, +} from "react"; import cx from "classnames"; import { FormattedMessage, useIntl } from "react-intl"; @@ -8,6 +17,7 @@ import { connect, useSelector } from "react-redux"; import { DefaultUiMenuInteractiveItemWrapper, + Dropdown, type IUiMenuItem, UiDrawer, UiIcon, @@ -19,7 +29,11 @@ import { type IChatConversationLocal } from "../model.js"; import { catalogItemsSelector } from "../store/chatWindow/chatWindowSelectors.js"; import { setHistoryAction } from "../store/chatWindow/chatWindowSlice.js"; import { conversationSelector, conversationsSelector } from "../store/messages/messagesSelectors.js"; -import { deleteConversationAction, setCurrentConversationAction } from "../store/messages/messagesSlice.js"; +import { + deleteConversationAction, + pinConversationAction, + setCurrentConversationAction, +} from "../store/messages/messagesSlice.js"; import { type RootState } from "../store/types.js"; import { generateTemporaryTitle } from "../utils.js"; @@ -38,14 +52,18 @@ type GenAIChatConversationsDispatchProps = { setHistory: typeof setHistoryAction; loadConversation: typeof setCurrentConversationAction; deleteConversation: typeof deleteConversationAction; + pinConversation: typeof pinConversationAction; }; export type GenAIChatConversationsProps = GenAIChatConversationsStateProps & GenAIChatConversationsDispatchProps; +type ConversationDropZone = "pin" | "unpin" | "body"; + function GenAIChatConversationsComponent({ setHistory, deleteConversation, + pinConversation, loadConversation, conversations, conversation: currentConversation, @@ -56,6 +74,9 @@ function GenAIChatConversationsComponent({ const { isFullscreen, isSmallScreen } = useFullscreenCheck(); const { isHistory } = useHistoryCheck(); const [conversationToDelete, setConversationToDelete] = useState(); + const [openedId, setOpenedId] = useState(); + const [draggedConversationId, setDraggedConversationId] = useState(); + const [activeDropZone, setActiveDropZone] = useState(); const catalogItems = useSelector(catalogItemsSelector); @@ -78,20 +99,106 @@ function GenAIChatConversationsComponent({ data: conversation, iconRight: (
- { - event.preventDefault(); - event.stopPropagation(); - setConversationToDelete(conversation); + { + setOpenedId(openedId ? undefined : conversation.id); }} - tabIndex={-1} - icon="trash" + isOpen={openedId === conversation.id} + alignPoints={[{ align: "bl tl" }]} + renderButton={({ + toggleDropdown, + buttonRef, + ariaAttributes, + accessibilityConfig, + }) => ( + { + buttonRef.current = element; + }} + size="medium" + variant="tertiary" + label={intl.formatMessage({ + id: "gd.gen-ai.conversations.menu.aria-label", + })} + onClick={(event) => { + event.preventDefault(); + event.stopPropagation(); + toggleDropdown(); + }} + accessibilityConfig={{ + ...accessibilityConfig, + ariaExpanded: ariaAttributes["aria-expanded"], + ariaHaspopup: ariaAttributes["aria-haspopup"], + ariaControls: ariaAttributes["aria-controls"], + }} + tabIndex={-1} + icon="ellipsis" + /> + )} + renderBody={({ closeDropdown, ariaAttributes }) => ( + + ) : ( + + ), + data: conversation, + }, + { + type: "static", + id: "delete-separator", + data: ( +
+ ), + }, + { + type: "interactive", + id: "delete", + stringTitle: intl.formatMessage({ + id: "gd.gen-ai.conversations.delete-dialog.submit", + }), + isDestructive: true, + iconLeft: , + data: { + ...conversation, + action: "delete", + }, + }, + ]} + onSelect={(item, event) => { + const selectedConversation = + item.data as IChatConversationLocal & { + action?: "delete"; + }; + if (selectedConversation.action === "delete") { + setConversationToDelete(conversation); + } else { + pinConversation({ + conversationId: selectedConversation.id, + pinned: !selectedConversation.pinned, + }); + } + event.preventDefault(); + event.stopPropagation(); + }} + onClose={closeDropdown} + ariaAttributes={ariaAttributes} + /> + )} + closeOnEscape + autofocusOnOpen />
), @@ -99,7 +206,12 @@ function GenAIChatConversationsComponent({ currentConversation === "new" ? false : conversation.id === currentConversation?.id, })), })), - [groupedConversations, intl, catalogItems, currentConversation], + [groupedConversations, intl, catalogItems, openedId, currentConversation, pinConversation], + ); + + const draggedConversation = useMemo( + () => conversations?.find((conversation) => conversation.id === draggedConversationId), + [conversations, draggedConversationId], ); const handleDeleteCancel = useCallback(() => { @@ -121,6 +233,79 @@ function GenAIChatConversationsComponent({ setConversationToDelete(undefined); }, [conversationToDelete, deleteConversation]); + const handleDragStart = useCallback((conversationId: string, event: DragEvent) => { + event.dataTransfer.effectAllowed = "move"; + event.dataTransfer.setData("text/plain", conversationId); + setDraggedConversationId(conversationId); + setActiveDropZone("body"); + }, []); + + const handleDragEnd = useCallback(() => { + setDraggedConversationId(undefined); + setActiveDropZone(undefined); + }, []); + + const handleDropZoneDragOver = useCallback( + (dropZone: ConversationDropZone, event: DragEvent) => { + if (!draggedConversation) { + return; + } + + const canDrop = dropZone === "pin" ? !draggedConversation.pinned : draggedConversation.pinned; + if (!canDrop) { + return; + } + + event.preventDefault(); + event.dataTransfer.dropEffect = "move"; + setActiveDropZone(dropZone); + }, + [draggedConversation], + ); + + const handleDropZoneDragLeave = useCallback((event: DragEvent) => { + const nextTarget = event.relatedTarget as Node | null; + + if (nextTarget && event.currentTarget.contains(nextTarget)) { + return; + } + + setActiveDropZone("body"); + }, []); + + const handleDropZoneDrop = useCallback( + (dropZone: ConversationDropZone, event: DragEvent) => { + event.preventDefault(); + + if (!draggedConversation) { + return; + } + + const shouldBePinned = dropZone === "pin"; + if (draggedConversation.pinned !== shouldBePinned) { + pinConversation({ + conversationId: draggedConversation.id, + pinned: shouldBePinned, + }); + } + + setDraggedConversationId(undefined); + setActiveDropZone(undefined); + }, + [draggedConversation, pinConversation], + ); + + const handleMenuUnhandledKeyDown = useCallback( + (event: KeyboardEvent, { focusedItem }: { focusedItem?: IUiMenuItem }) => { + if (event.key === "Delete" && focusedItem) { + event.preventDefault(); + event.stopPropagation(); + setConversationToDelete(focusedItem.data as IChatConversationLocal); + } + }, + [], + ); + return ( <>
}>
@@ -148,66 +333,20 @@ function GenAIChatConversationsComponent({ "gd-gen-ai-chat__window__conversations--isSmallScreen": isSmallScreen, })} > - {(conversations ?? []).length === 0 ? ( -
- -
- , - }} - /> -
-
- ) : ( -
- { - if (event.key === "Delete" && focusedItem) { - event.preventDefault(); - event.stopPropagation(); - setConversationToDelete(focusedItem.data as IChatConversationLocal); - } - }} - InteractiveItemWrapper={(props) => { - const data = props.item.data as IChatConversationLocal; - return ( -
- -
- ); - }} - items={menuItems} - onSelect={(item, event) => { - handleSelect(item.data as IChatConversationLocal); - event.stopPropagation(); - event.preventDefault(); - }} - shouldCloseOnSelect={false} - size="small" - ariaAttributes={{ - id: "gd-gen-ai-conversations-menu", - "aria-label": intl.formatMessage({ id: "gd.gen-ai.conversations.title" }), - }} - /> -
- )} +
{conversationToDelete ? ( @@ -221,6 +360,218 @@ function GenAIChatConversationsComponent({ ); } +interface IDrawerContentProps { + openedId: string | undefined; + conversations: IChatConversationLocal[]; + menuItems: IUiMenuItem[]; + handleSelect: (conversation: IChatConversationLocal) => void; + draggedConversation: IChatConversationLocal | undefined; + activeDropZone: ConversationDropZone | undefined; + onDragStart: (conversationId: string, event: DragEvent) => void; + onDragEnd: () => void; + onDropZoneDragOver: (dropZone: ConversationDropZone, event: DragEvent) => void; + onDropZoneDragLeave: (event: DragEvent) => void; + onDropZoneDrop: (dropZone: ConversationDropZone, event: DragEvent) => void; + onMenuUnhandledKeyDown: (event: KeyboardEvent, context: { focusedItem?: IUiMenuItem }) => void; +} + +function DrawerContent({ + openedId, + conversations, + menuItems, + handleSelect, + draggedConversation, + activeDropZone, + onDragStart, + onDragEnd, + onDropZoneDragOver, + onDropZoneDragLeave, + onDropZoneDrop, + onMenuUnhandledKeyDown, +}: IDrawerContentProps) { + const intl = useIntl(); + + const pinnedItems = useMemo(() => { + return menuItems.filter((item) => item.id === ConversationDateGroup.PINNED); + }, [menuItems]); + + const restItems = useMemo(() => { + return menuItems.filter((item) => item.id !== ConversationDateGroup.PINNED); + }, [menuItems]); + + return ( + <> + {(conversations ?? []).length === 0 ? ( +
+ +
+ , + }} + /> +
+
+ ) : ( +
+
onDropZoneDragOver("pin", event)} + onDrop={(event) => onDropZoneDrop("pin", event)} + > +
+
+ {intl.formatMessage({ + id: "gd.gen-ai.conversations.dnd.pin-placeholder", + })} +
+
+ +
+
onDropZoneDragOver("unpin", event)} + onDragLeave={onDropZoneDragLeave} + onDrop={(event) => onDropZoneDrop("unpin", event)} + > +
+
+ {intl.formatMessage({ + id: "gd.gen-ai.conversations.dnd.unpin-placeholder", + })} +
+
+ +
+ {draggedConversation ? ( +
+ ) : null} +
+ )} + + ); +} + +interface IConversationListProps { + id: string; + openedId: string | undefined; + listItems: IUiMenuItem[]; + onDragStart: (conversationId: string, event: DragEvent) => void; + onDragEnd: () => void; + onMenuUnhandledKeyDown: (event: KeyboardEvent, context: { focusedItem?: IUiMenuItem }) => void; + handleSelect: (conversation: IChatConversationLocal) => void; +} + +function ConversationsList({ + id, + openedId, + listItems, + handleSelect, + onDragStart, + onDragEnd, + onMenuUnhandledKeyDown, +}: IConversationListProps) { + const intl = useIntl(); + + return useMemo(() => { + return ( + ( + + )} + items={listItems} + onSelect={(item, event) => { + handleSelect(item.data as IChatConversationLocal); + event.stopPropagation(); + event.preventDefault(); + }} + shouldCloseOnSelect={false} + size="small" + ariaAttributes={{ + id, + "aria-label": intl.formatMessage({ id: "gd.gen-ai.conversations.title" }), + }} + /> + ); + }, [id, handleSelect, intl, listItems, onDragEnd, onDragStart, onMenuUnhandledKeyDown, openedId]); +} + +type DraggableConversationItemProps = Parameters[0] & { + intl: ReturnType; + openedId: string | undefined; + onDragStart: (conversationId: string, event: DragEvent) => void; + onDragEnd: () => void; +}; + +function DraggableConversationItem(props: DraggableConversationItemProps) { + const data = props.item.data as IChatConversationLocal; + + return ( +
{ + event.currentTarget.classList.add("dragging"); + props.onDragStart(data.id, event); + }} + onDragEnd={(event) => { + event.currentTarget.classList.remove("dragging"); + props.onDragEnd(); + }} + > + +
+ ); +} + const mapStateToProps = (state: RootState): GenAIChatConversationsStateProps => ({ conversation: conversationSelector(state), conversations: conversationsSelector(state), @@ -229,6 +580,7 @@ const mapStateToProps = (state: RootState): GenAIChatConversationsStateProps => const mapDispatchToProps: GenAIChatConversationsDispatchProps = { setHistory: setHistoryAction, deleteConversation: deleteConversationAction, + pinConversation: pinConversationAction, loadConversation: setCurrentConversationAction, }; @@ -239,6 +591,8 @@ export const GenAIChatConversations: FC = connect( function getConversationGroupLabel(group: ConversationDateGroup, intl: ReturnType): string { switch (group) { + case ConversationDateGroup.PINNED: + return intl.formatMessage({ id: "gd.gen-ai.conversations.group.pinned" }); case ConversationDateGroup.TODAY: return intl.formatMessage({ id: "gd.gen-ai.conversations.group.today" }); case ConversationDateGroup.LAST_7_DAYS: diff --git a/libs/sdk-ui-gen-ai/src/components/GenAIChatWrapper.tsx b/libs/sdk-ui-gen-ai/src/components/GenAIChatWrapper.tsx index 93a1dde011b..0f978276550 100644 --- a/libs/sdk-ui-gen-ai/src/components/GenAIChatWrapper.tsx +++ b/libs/sdk-ui-gen-ai/src/components/GenAIChatWrapper.tsx @@ -18,8 +18,12 @@ import { cancelAsyncAction, clearThreadAction, loadThreadAction } from "../store import { type RootState } from "../store/types.js"; import { getAbsoluteSettingHref, + getAbsoluteShellAppOrgSettingHref, + getAbsoluteShellAppWorkspaceSettingHref, getAbsoluteWorkspaceSettingHref, getSettingHref, + getShellAppOrgSettingHref, + getShellAppWorkspaceSettingHref, getWorkspaceSettingHref, } from "../utils.js"; @@ -96,16 +100,27 @@ export function GenAIChatWrapperComponent({ tabIndex: -1, }); + // When the shell host is enabled, the standalone home-ui at `/settings` or + // `/workspaces/{id}/settings` is bounced to the host base path, dropping the + // workspaceId and hash. Switch to host-shaped URLs so the deep-link + // (e.g. `#/ai/change-llm-model`) reaches the settings page intact. + const useShellAppUrls = Boolean(settings?.enableShellApplication); const onSettingClick = useCallback( (type: "change-model" | "create") => (e: MouseEvent) => { switch (type) { case "change-model": if (allowNativeLinks) { - window.location.href = getAbsoluteWorkspaceSettingHref( - workspaceId, - GEN_AI_SECTION, - CHANGE_LLM_MODEL_ACTION, - ); + window.location.href = useShellAppUrls + ? getAbsoluteShellAppWorkspaceSettingHref( + workspaceId, + GEN_AI_SECTION, + CHANGE_LLM_MODEL_ACTION, + ) + : getAbsoluteWorkspaceSettingHref( + workspaceId, + GEN_AI_SECTION, + CHANGE_LLM_MODEL_ACTION, + ); } else { linkHandler?.({ id: CHANGE_LLM_MODEL_ACTION, @@ -114,21 +129,26 @@ export function GenAIChatWrapperComponent({ newTab: e.metaKey, section: GEN_AI_SECTION, preventDefault: e.preventDefault.bind(e), - itemUrl: getWorkspaceSettingHref( - workspaceId, - GEN_AI_SECTION, - CHANGE_LLM_MODEL_ACTION, - ), + itemUrl: useShellAppUrls + ? getShellAppWorkspaceSettingHref( + workspaceId, + GEN_AI_SECTION, + CHANGE_LLM_MODEL_ACTION, + ) + : getWorkspaceSettingHref( + workspaceId, + GEN_AI_SECTION, + CHANGE_LLM_MODEL_ACTION, + ), }); e.stopPropagation(); } break; case "create": if (allowNativeLinks) { - window.location.href = getAbsoluteSettingHref( - GEN_AI_SECTION, - CREATE_LLM_PROVIDER_ACTION, - ); + window.location.href = useShellAppUrls + ? getAbsoluteShellAppOrgSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION) + : getAbsoluteSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION); } else { linkHandler?.({ id: CREATE_LLM_PROVIDER_ACTION, @@ -137,14 +157,16 @@ export function GenAIChatWrapperComponent({ newTab: e.metaKey, section: GEN_AI_SECTION, preventDefault: e.preventDefault.bind(e), - itemUrl: getSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION), + itemUrl: useShellAppUrls + ? getShellAppOrgSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION) + : getSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION), }); e.stopPropagation(); } break; } }, - [allowNativeLinks, linkHandler, workspaceId], + [allowNativeLinks, linkHandler, workspaceId, useShellAppUrls], ); if (evaluated && hasUnsupportedOpenAiModel) { diff --git a/libs/sdk-ui-gen-ai/src/components/messages/conversationContents/ConversationVisualizationContent.tsx b/libs/sdk-ui-gen-ai/src/components/messages/conversationContents/ConversationVisualizationContent.tsx index eb8774ba21b..e7c0e412179 100644 --- a/libs/sdk-ui-gen-ai/src/components/messages/conversationContents/ConversationVisualizationContent.tsx +++ b/libs/sdk-ui-gen-ai/src/components/messages/conversationContents/ConversationVisualizationContent.tsx @@ -119,11 +119,11 @@ function ConversationVisualizationContentCore({ const [isTable, setIsTable] = useState(false); const moreButtonDescId = useId(); - const { setDrillState, DrillOverlay, DrillChooser } = useDrillState({ - containerRef, - filters: [], - setKeyDriverAnalysis, - }); + const [drillState, setDrillState] = useState<{ + keyDriverData: IDashboardKeyDriverCombinationItem[]; + event: IDrillEvent; + } | null>(null); + const { setSaveDialogOpen, SaveDialog } = useSaveDialog({ message, part, @@ -166,7 +166,12 @@ function ConversationVisualizationContentCore({ return (
- + - - +
); @@ -561,103 +565,97 @@ function VisualizationErrorReport({ error }: IVisualizationErrorReportProps) { //hooks -interface IUseDrillStateProps { +interface IDrillStateProps { containerRef: RefObject; - filters: IFilter[]; + drillState: { + keyDriverData: IDashboardKeyDriverCombinationItem[]; + event: IDrillEvent; + } | null; + setDrillState: ( + state: { keyDriverData: IDashboardKeyDriverCombinationItem[]; event: IDrillEvent } | null, + ) => void; + filters?: IFilter[]; setKeyDriverAnalysis?: typeof setKeyDriverAnalysisAction; + children?: ReactNode; } -function useDrillState({ containerRef, filters, setKeyDriverAnalysis }: IUseDrillStateProps) { +function DrillState({ + containerRef, + filters, + setKeyDriverAnalysis, + children, + drillState, + setDrillState, +}: IDrillStateProps) { const intl = useIntl(); - const [drillState, setDrillState] = useState<{ - keyDriverData: IDashboardKeyDriverCombinationItem[]; - event: IDrillEvent; - } | null>(null); const catalogItems = useSelector(catalogItemsSelector); - const DrillChooser = useCallback( - ({ children }: { children: ReactNode }) => { - return ( - { - if (!state) { + return ( + { + if (!state) { + setDrillState(null); + } + }} + closeOnEscape + closeOnParentScroll + alignPoints={[ + { + align: "tl tl", + offset: calculateOffset(containerRef.current, drillState?.event), + }, + { + align: "tl tr", + offset: calculateOffset(containerRef.current, drillState?.event), + }, + ]} + renderBody={() => { + return ( + { + const data = item.data.context as IDashboardKeyDriverCombinationItem; + const event = drillState?.event; + + if (!event) { + return; + } + + const allFilters = mergeFilters( + convertIntersectionToAttributeFilters(event.drillContext.intersection ?? []), + (filters?.map(getDashboardAttributeFilter).filter(Boolean) ?? + []) as IDashboardAttributeFilter[], + ); + + const definition = createKdaDefinitionFromDrill( + catalogItems, + intl.locale, + data, + event, + allFilters, + ); + setKeyDriverAnalysis?.({ keyDriverAnalysis: definition }); + }} + onClose={() => { setDrillState(null); - } - }} - closeOnEscape - closeOnParentScroll - alignPoints={[ - { - align: "tl tl", - offset: calculateOffset(containerRef.current, drillState?.event), - }, - { - align: "tl tr", - offset: calculateOffset(containerRef.current, drillState?.event), - }, - ]} - renderBody={() => { - return ( - { - const data = item.data.context as IDashboardKeyDriverCombinationItem; - const event = drillState?.event; - - if (!event) { - return; - } - - const allFilters = mergeFilters( - convertIntersectionToAttributeFilters( - event.drillContext.intersection ?? [], - ), - filters - .map(getDashboardAttributeFilter) - .filter(Boolean) as IDashboardAttributeFilter[], - ); - - const definition = createKdaDefinitionFromDrill( - catalogItems, - intl.locale, - data, - event, - allFilters, - ); - setKeyDriverAnalysis?.({ keyDriverAnalysis: definition }); - }} - onClose={() => { - setDrillState(null); - }} - /> - ); - }} - renderButton={() => <>{children}} - /> - ); - }, - [catalogItems, containerRef, drillState, filters, intl.locale, setKeyDriverAnalysis], - ); - - const DrillOverlay = useCallback( - () => ( - <> - {drillState ? ( -
- ) : null} - - ), - [drillState], + }} + /> + ); + }} + renderButton={() => ( + <> + {children} + <> + {drillState ? ( +
+ ) : null} + + + )} + /> ); - - return { - DrillOverlay, - DrillChooser, - setDrillState, - drillState, - }; } function calculateOffset(container?: HTMLDivElement | null, drillEvent?: IDrillEvent) { diff --git a/libs/sdk-ui-gen-ai/src/components/utils/conversationGrouper.ts b/libs/sdk-ui-gen-ai/src/components/utils/conversationGrouper.ts index ac261615221..8c66e35e840 100644 --- a/libs/sdk-ui-gen-ai/src/components/utils/conversationGrouper.ts +++ b/libs/sdk-ui-gen-ai/src/components/utils/conversationGrouper.ts @@ -3,6 +3,7 @@ import { type IChatConversationLocal } from "../../model.js"; export enum ConversationDateGroup { + PINNED = "PINNED", TODAY = "TODAY", LAST_7_DAYS = "LAST_7_DAYS", OLDER = "OLDER", @@ -19,6 +20,7 @@ export type ConversationDateBucket = { }; export const DEFAULT_CONVERSATION_DATE_GROUPS: ConversationDateGroupConfig[] = [ + { group: ConversationDateGroup.PINNED, maxAgeDays: Number.POSITIVE_INFINITY }, { group: ConversationDateGroup.TODAY, maxAgeDays: 0 }, { group: ConversationDateGroup.LAST_7_DAYS, maxAgeDays: 6 }, { group: ConversationDateGroup.OLDER, maxAgeDays: Number.POSITIVE_INFINITY }, @@ -40,10 +42,16 @@ export function groupConversationsByDate( .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()); sorted.forEach((conversation) => { + if (conversation.pinned) { + conversationGroups.get(ConversationDateGroup.PINNED)?.push(conversation); + return; + } + const updatedAt = new Date(conversation.updatedAt); const ageInDays = getAgeInDays(updatedAt, now); const targetGroup = groups + .filter((group) => group.group !== ConversationDateGroup.PINNED) .filter((group) => ageInDays <= group.maxAgeDays) .sort((a, b) => a.maxAgeDays - b.maxAgeDays)[0]?.group ?? groups[groups.length - 1].group; diff --git a/libs/sdk-ui-gen-ai/src/components/utils/tests/conversationGrouper.test.ts b/libs/sdk-ui-gen-ai/src/components/utils/tests/conversationGrouper.test.ts index 03de1de8395..747fd200310 100644 --- a/libs/sdk-ui-gen-ai/src/components/utils/tests/conversationGrouper.test.ts +++ b/libs/sdk-ui-gen-ai/src/components/utils/tests/conversationGrouper.test.ts @@ -71,4 +71,28 @@ describe("groupConversationsByDate", () => { }, ]); }); + + it("should put pinned conversations to pinned bucket first", () => { + const conversations: IChatConversationLocal[] = [ + { + ...createConversation("unpinned", daysAgoIso(0, now)), + pinned: false, + }, + { + ...createConversation("pinned", daysAgoIso(14, now)), + pinned: true, + }, + ]; + + expect(groupConversationsByDate(conversations, undefined, now)).toEqual([ + { + group: ConversationDateGroup.PINNED, + conversations: [conversations[1]], + }, + { + group: ConversationDateGroup.TODAY, + conversations: [conversations[0]], + }, + ]); + }); }); diff --git a/libs/sdk-ui-gen-ai/src/index.ts b/libs/sdk-ui-gen-ai/src/index.ts index d9b0fa5390e..baea0a3fb38 100644 --- a/libs/sdk-ui-gen-ai/src/index.ts +++ b/libs/sdk-ui-gen-ai/src/index.ts @@ -55,6 +55,10 @@ export { type ChatSaveVisualizationErrorEvent, type ChatSaveVisualizationSuccessEvent, type ChatCopyToClipboardEvent, + type ChatConversationPinnedEvent, + type ChatConversationDeletedEvent, + type ChatConversationPinErrorEvent, + type ChatConversationDeletedErrorEvent, isChatAssistantMessageEvent, isChatUserMessageEvent, isChatClosedEvent, @@ -66,6 +70,10 @@ export { isChatSaveVisualizationErrorEvent, isChatSaveVisualizationSuccessEvent, isChatCopyToClipboardEvent, + isChatConversationDeletedEvent, + isChatConversationPinnedEvent, + isChatConversationPinErrorEvent, + isChatConversationDeletedErrorEvent, } from "./store/events.js"; export { clearThreadAction, newMessageAction } from "./store/messages/messagesSlice.js"; diff --git a/libs/sdk-ui-gen-ai/src/localization/bundles/en-US.json b/libs/sdk-ui-gen-ai/src/localization/bundles/en-US.json index bbbc7a4ff64..125c9afd73d 100644 --- a/libs/sdk-ui-gen-ai/src/localization/bundles/en-US.json +++ b/libs/sdk-ui-gen-ai/src/localization/bundles/en-US.json @@ -243,9 +243,29 @@ "text": "Older", "crowdinContext": "Header for conversations older than 7 days" }, - "gd.gen-ai.conversations.delete-button.aria-label": { - "text": "Delete conversation", - "crowdinContext": "Aria label for button that opens delete confirmation for a conversation in history list" + "gd.gen-ai.conversations.group.pinned": { + "text": "Pinned", + "crowdinContext": "Menu option to pin a conversation to the top of the conversation history list" + }, + "gd.gen-ai.conversations.menu.pin": { + "text": "Pin", + "crowdinContext": "Menu option to pin a conversation to the top of the conversation history list" + }, + "gd.gen-ai.conversations.menu.unpin": { + "text": "Unpin", + "crowdinContext": "Menu option to unpin a conversation from the top of the conversation history list" + }, + "gd.gen-ai.conversations.menu.aria-label": { + "text": "Conversation menu", + "crowdinContext": "Accessibility label for the conversation menu" + }, + "gd.gen-ai.conversations.dnd.pin-placeholder": { + "text": "Drop to pin", + "crowdinContext": "Drop placeholder shown while dragging an unpinned conversation to pin it" + }, + "gd.gen-ai.conversations.dnd.unpin-placeholder": { + "text": "Drop to unpin", + "crowdinContext": "Drop placeholder shown while dragging a pinned conversation to unpin it" }, "gd.gen-ai.conversations.delete-dialog.title": { "text": "Delete conversation?", diff --git a/libs/sdk-ui-gen-ai/src/store/events.ts b/libs/sdk-ui-gen-ai/src/store/events.ts index 319c1d759b5..4dd3073f0c3 100644 --- a/libs/sdk-ui-gen-ai/src/store/events.ts +++ b/libs/sdk-ui-gen-ai/src/store/events.ts @@ -1,5 +1,6 @@ // (C) 2024-2026 GoodData Corporation +import { type IChatConversation } from "@gooddata/sdk-backend-spi"; import { type SdkErrorType } from "@gooddata/sdk-ui"; import { type TextContentObject } from "../model.js"; @@ -60,6 +61,79 @@ export const isChatResetEvent = (event: ChatEvent): event is ChatResetEvent => { return event.type === "chatReset"; }; +/** + * A chat conversation pinned state change event. + * @public + */ +export type ChatConversationPinnedEvent = BaseEvent & { + type: "chatConversationPinned"; + conversationId: string; + pinned: boolean; +}; + +/** + * Type guard for the ChatConversationPinnedEvent. + * @public + */ +export const isChatConversationPinnedEvent = (event: ChatEvent): event is ChatConversationPinnedEvent => { + return event.type === "chatConversationPinned"; +}; + +/** + * A chat conversation pinned state change error event. + * @public + */ +export type ChatConversationPinErrorEvent = BaseEvent & { + type: "chatConversationPinError"; + conversationId: string; + error: Error; +}; + +/** + * Type guard for the ChatConversationPinnedEvent. + * @public + */ +export const isChatConversationPinErrorEvent = (event: ChatEvent): event is ChatConversationPinErrorEvent => { + return event.type === "chatConversationPinError"; +}; + +/** + * A chat conversation deleted event. + * @public + */ +export type ChatConversationDeletedEvent = BaseEvent & { + type: "chatConversationDeleted"; + conversation: IChatConversation; +}; + +/** + * Type guard for the ChatConversationDeletedEvent. + * @public + */ +export const isChatConversationDeletedEvent = (event: ChatEvent): event is ChatConversationDeletedEvent => { + return event.type === "chatConversationDeleted"; +}; + +/** + * A chat conversation deleted error event. + * @public + */ +export type ChatConversationDeletedErrorEvent = BaseEvent & { + type: "chatConversationDeletedError"; + conversation: IChatConversation; + error: Error; +}; + +/** + * Type guard for the ChatConversationDeletedEvent. + * @public + */ +export const isChatConversationDeletedErrorEvent = ( + event: ChatEvent, +): event is ChatConversationDeletedErrorEvent => { + return event.type === "chatConversationDeletedError"; +}; + /** * A chat user message event. * @public @@ -215,6 +289,10 @@ export type ChatEvent = | ChatOpenedEvent | ChatClosedEvent | ChatResetEvent + | ChatConversationPinnedEvent + | ChatConversationPinErrorEvent + | ChatConversationDeletedEvent + | ChatConversationDeletedErrorEvent | ChatUserMessageEvent | ChatAssistantMessageEvent | ChatFeedbackEvent diff --git a/libs/sdk-ui-gen-ai/src/store/messages/messagesSlice.ts b/libs/sdk-ui-gen-ai/src/store/messages/messagesSlice.ts index 3d2e44b826c..c3f342971e6 100644 --- a/libs/sdk-ui-gen-ai/src/store/messages/messagesSlice.ts +++ b/libs/sdk-ui-gen-ai/src/store/messages/messagesSlice.ts @@ -882,6 +882,59 @@ const messagesSlice = createSlice({ errorMessage?: string; }>, ) => state, + pinConversationAction: ( + state, + _action: PayloadAction<{ + conversationId: string; + pinned: boolean; + }>, + ) => state, + pinConversationSuccessAction: ( + state, + { payload }: PayloadAction<{ conversationId: string; pinned: boolean }>, + ) => { + state.conversations = state.conversations?.map((conversation) => + conversation.id === payload.conversationId + ? { + ...conversation, + pinned: payload.pinned, + } + : conversation, + ); + + if ( + state.currentConversation !== "new" && + state.currentConversation?.id === payload.conversationId + ) { + state.currentConversation = { + ...state.currentConversation, + pinned: payload.pinned, + }; + } + }, + pinConversationFailureAction: ( + state, + { payload }: PayloadAction<{ conversationId: string; error: Error; pinned?: boolean }>, + ) => { + state.conversations = state.conversations?.map((conversation) => + conversation.id === payload.conversationId + ? { + ...conversation, + pinned: payload.pinned, + } + : conversation, + ); + + if ( + state.currentConversation !== "new" && + state.currentConversation?.id === payload.conversationId + ) { + state.currentConversation = { + ...state.currentConversation, + pinned: payload.pinned, + }; + } + }, deleteConversationAction: (state, _action: PayloadAction<{ conversationId: string }>) => state, deleteConversationStartAction: (state, { payload }: PayloadAction<{ conversationId: string }>) => { if ( @@ -897,7 +950,10 @@ const messagesSlice = createSlice({ (conversation) => conversation.id !== payload.conversationId, ); }, - deleteConversationSuccessAction: (state, _action: PayloadAction<{ conversationId: string }>) => state, + deleteConversationSuccessAction: ( + state, + _action: PayloadAction<{ conversation: IChatConversationLocal }>, + ) => state, deleteConversationFailureAction: ( state, { payload }: PayloadAction<{ conversation: IChatConversationLocal; error: Error }>, @@ -944,6 +1000,9 @@ export const { visualizationErrorAction, startNewConversationAction, setCurrentConversationAction, + pinConversationAction, + pinConversationSuccessAction, + pinConversationFailureAction, deleteConversationAction, deleteConversationStartAction, deleteConversationSuccessAction, diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/index.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/index.ts index dd35c7e059f..c7c176150cd 100644 --- a/libs/sdk-ui-gen-ai/src/store/sideEffects/index.ts +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/index.ts @@ -8,6 +8,7 @@ import { evaluateMessageUpdateAction, loadThreadAction, newMessageAction, + pinConversationAction, saveVisualisationRenderStatusAction, saveVisualizationAction, saveVisualizationSuccessAction, @@ -19,6 +20,7 @@ import { loadCatalogItems } from "./loadCatalogItems.js"; import { loadColorPalette } from "./loadColorPalette.js"; import { loadSettings } from "./loadSettings.js"; import { onConversationDelete } from "./onConversationDelete.js"; +import { onConversationPin } from "./onConversationPin.js"; import { onEvent } from "./onEvent.js"; import { onThreadClear } from "./onThreadClear.js"; import { onThreadLoad } from "./onThreadLoad.js"; @@ -44,6 +46,7 @@ export function* rootSaga() { yield takeEvery(saveVisualizationSuccessAction.type, onVisualizationSuccessSave); yield takeEvery(saveVisualisationRenderStatusAction.type, onVisualisationRender); //conversations API + yield takeEvery(pinConversationAction.type, onConversationPin); yield takeEvery(deleteConversationAction.type, onConversationDelete); yield takeEvery(evaluateMessageUpdateAction.type, onUserMessageUpdate); //others diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationDelete.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationDelete.ts index a85b6165ed9..258c6165fd0 100644 --- a/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationDelete.ts +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationDelete.ts @@ -44,7 +44,7 @@ export function* onConversationDelete({ yield put( deleteConversationSuccessAction({ - conversationId: payload.conversationId, + conversation: conversation, }), ); } catch (e) { diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationPin.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationPin.ts new file mode 100644 index 00000000000..102770165ac --- /dev/null +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationPin.ts @@ -0,0 +1,53 @@ +// (C) 2024-2026 GoodData Corporation + +import { type PayloadAction } from "@reduxjs/toolkit"; +import { call, getContext, put, select } from "redux-saga/effects"; + +import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi"; + +import { type IChatConversationLocal } from "../../model.js"; +import { conversationByIdSelector } from "../messages/messagesSelectors.js"; +import { + type pinConversationAction, + pinConversationFailureAction, + pinConversationSuccessAction, +} from "../messages/messagesSlice.js"; + +export function* onConversationPin({ + payload, +}: ReturnType | PayloadAction<{ conversationId: string; pinned: boolean }>) { + const backend: IAnalyticalBackend = yield getContext("backend"); + const workspace: string = yield getContext("workspace"); + const isPreview: boolean | undefined = yield getContext("isPreview"); + + const conversation: IChatConversationLocal | undefined = yield select( + conversationByIdSelector, + payload.conversationId, + ); + + if (!conversation) { + return; + } + + try { + yield put( + pinConversationSuccessAction({ + conversationId: payload.conversationId, + pinned: payload.pinned, + }), + ); + + const chatConversations = backend.workspace(workspace).genAI().getChatConversations({ isPreview }); + const updateConversationCall = chatConversations.update.bind(chatConversations); + yield call(updateConversationCall, payload.conversationId, { pinned: payload.pinned }); + } catch (e) { + console.error("Failed to update pinned state of conversation", e); + yield put( + pinConversationFailureAction({ + conversationId: payload.conversationId, + error: e as Error, + pinned: conversation.pinned, + }), + ); + } +} diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/onEvent.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/onEvent.ts index 70cbacbb10e..acab1e387cb 100644 --- a/libs/sdk-ui-gen-ai/src/store/sideEffects/onEvent.ts +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/onEvent.ts @@ -27,10 +27,14 @@ import { } from "../messages/messagesSelectors.js"; import { clearThreadAction, + deleteConversationFailureAction, + deleteConversationSuccessAction, evaluateMessageCompleteAction, loadConversationSuccessAction, loadThreadSuccessAction, newMessageAction, + pinConversationFailureAction, + pinConversationSuccessAction, saveVisualizationErrorAction, saveVisualizationSuccessAction, setUserFeedback, @@ -51,6 +55,65 @@ export function* onEvent() { yield takeEvery(saveVisualizationErrorAction.type, onSaveVisualizationError); yield takeEvery(saveVisualizationSuccessAction.type, onSaveVisualizationSuccess); yield takeEvery(copyToClipboardAction.type, onCopyToClipboard); + yield takeEvery(pinConversationSuccessAction.type, onConversationPinUpdated); + yield takeEvery(pinConversationFailureAction.type, onConversationPinError); + yield takeEvery(deleteConversationSuccessAction.type, onConversationDeletedSuccess); + yield takeEvery(deleteConversationFailureAction.type, onConversationDeletedError); +} + +function* onConversationPinUpdated({ + payload: { conversationId, pinned }, +}: ReturnType) { + const eventDispatcher: EventDispatcher = yield getContext("eventDispatcher"); + const threadId: string | undefined = yield select(threadIdSelector); + + eventDispatcher.dispatch({ + type: "chatConversationPinned", + threadId, + conversationId, + pinned, + }); +} + +function* onConversationPinError({ + payload: { conversationId, error }, +}: ReturnType) { + const eventDispatcher: EventDispatcher = yield getContext("eventDispatcher"); + const threadId: string | undefined = yield select(threadIdSelector); + + eventDispatcher.dispatch({ + type: "chatConversationPinError", + threadId, + conversationId, + error, + }); +} + +function* onConversationDeletedSuccess({ + payload: { conversation }, +}: ReturnType) { + const eventDispatcher: EventDispatcher = yield getContext("eventDispatcher"); + const threadId: string | undefined = yield select(threadIdSelector); + + eventDispatcher.dispatch({ + type: "chatConversationDeleted", + threadId, + conversation, + }); +} + +function* onConversationDeletedError({ + payload: { conversation, error }, +}: ReturnType) { + const eventDispatcher: EventDispatcher = yield getContext("eventDispatcher"); + const threadId: string | undefined = yield select(threadIdSelector); + + eventDispatcher.dispatch({ + type: "chatConversationDeletedError", + threadId, + conversation, + error, + }); } function* persistMessages() { diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/utils.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/utils.ts index 080f9d58b71..a57eda0a656 100644 --- a/libs/sdk-ui-gen-ai/src/store/sideEffects/utils.ts +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/utils.ts @@ -11,10 +11,6 @@ export function extractError(e: unknown) { return `${e.name}: ${message}`; } - if (typeof e === "object" && e !== null && "detail" in e) { - return String(e.detail); - } - return String(e); } diff --git a/libs/sdk-ui-gen-ai/src/utils.ts b/libs/sdk-ui-gen-ai/src/utils.ts index f60fe1a6e75..6b8d4c9f6f3 100644 --- a/libs/sdk-ui-gen-ai/src/utils.ts +++ b/libs/sdk-ui-gen-ai/src/utils.ts @@ -37,6 +37,37 @@ export function getAbsoluteWorkspaceSettingHref(workspaceId: string, section: st return `${window.location.origin}${getWorkspaceSettingHref(workspaceId, section, action)}`; } +// Shell-host route shape: the host serves the home-ui module under +// `/organization/settings`, and uses `configuration` (not `settings`) for the +// workspace detail route. Used when `enableShellApplication` is on, so +// standalone `/settings`/`/workspaces/{id}/settings` URLs aren't bounced to the +// workspaces list. +export function getShellAppOrgSettingHref(section: string, action?: string) { + if (!action) { + return `/organization/settings/configuration#/${section}`; + } + return `/organization/settings/configuration#/${section}/${action}`; +} + +export function getAbsoluteShellAppOrgSettingHref(section: string, action?: string) { + return `${window.location.origin}${getShellAppOrgSettingHref(section, action)}`; +} + +export function getShellAppWorkspaceSettingHref(workspaceId: string, section: string, action?: string) { + if (!action) { + return `/organization/settings/workspaces/${workspaceId}/configuration#/${section}`; + } + return `/organization/settings/workspaces/${workspaceId}/configuration#/${section}/${action}`; +} + +export function getAbsoluteShellAppWorkspaceSettingHref( + workspaceId: string, + section: string, + action?: string, +) { + return `${window.location.origin}${getShellAppWorkspaceSettingHref(workspaceId, section, action)}`; +} + export function getHeadlineComparison(metrics: IAttributeOrMeasure[]) { return { comparison: { diff --git a/libs/sdk-ui-gen-ai/styles/scss/conversations.scss b/libs/sdk-ui-gen-ai/styles/scss/conversations.scss index 20db708c4dd..55745be4276 100644 --- a/libs/sdk-ui-gen-ai/styles/scss/conversations.scss +++ b/libs/sdk-ui-gen-ai/styles/scss/conversations.scss @@ -24,6 +24,7 @@ min-width: 220px; position: relative; margin: -5px; + height: calc(100% + 10px); &#{$root}--isFullscreen { width: 300px; @@ -42,6 +43,13 @@ background-color: kit-variables.$gd-border-color; } + &__divider_menu { + width: calc(100% - 20px); + height: 1px; + margin: 0 10px; + background-color: kit-variables.$gd-border-color; + } + &__empty { display: flex; padding: 20px 0; @@ -62,6 +70,49 @@ line-height: 20px; } + &__drop-placeholder { + z-index: 1; + position: absolute; + display: none; + text-transform: uppercase; + inset: 0; + margin: 0 10px; + padding: 4px 4px; + border: 2px dashed kit-variables.$gd-palette-primary-base; + background-color: kit-variables.$gd-palette-primary-dimmed; + border-radius: 5px; + color: kit-variables.$gd-color-text; + font-size: 12px; + font-weight: 700; + line-height: 14px; + text-align: center; + + &.isDragging, + &.isDraggingOver { + display: block; + } + + & &__content { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + border-radius: 3px; + } + + &.isDraggingOver &__content { + background-color: kit-variables.$gd-palette-primary-base; + color: kit-variables.$gd-color-white; + } + } + + &__drop-overlay { + position: absolute; + inset: 0; + pointer-events: none; + } + &__list { $list-root: &; @@ -72,11 +123,21 @@ align-items: stretch; gap: 10px; align-self: stretch; + height: 100%; .gd-ui-kit-menu { + max-height: none; + .gd-ui-kit-menu__item-wrapper { + cursor: grab; + } + + .gd-ui-kit-menu__item-wrapper:active { + cursor: grabbing; + } + #{$list-root}__delete-button { position: absolute; - right: 10px; + right: 0; } #{$list-root}__delete-button button { opacity: 0; @@ -93,22 +154,37 @@ pointer-events: auto; } - .gd-ui-kit-menu__item-wrapper:has(#{$list-root}__delete-button button:hover) - .gd-ui-kit-menu__item, - .gd-ui-kit-menu__item-wrapper:has(#{$list-root}__delete-button button:focus-visible) - .gd-ui-kit-menu__item { - background-color: kit-variables.$gd-palette-error-dimmed; - color: kit-variables.$gd-palette-error-base; - } - .gd-ui-kit-menu__group-title-container { padding: 10px 10px 0 10px; } } + &__item.openedMenu { + .gd-ui-kit-menu__item-wrapper #{$list-root}__delete-button button { + opacity: 1; + pointer-events: auto; + } + .gd-ui-kit-menu__item { + background-color: kit-variables.$is-focused-background; + color: kit-variables.$gd-color-dark; + } + .gd-ui-kit-menu__item.gd-ui-kit-menu__item--isSelected { + background-color: kit-variables.$gd-palette-primary-dimmed; + color: kit-variables.$gd-palette-primary-base; + } + } + &__item.generatingTitle .gd-ui-kit-menu__item-title { @include variables.gd-reasoning(); } + + &__item.dragging { + opacity: 0.45; + } + } + + &__drop-group { + position: relative; } &__delete-button { diff --git a/libs/sdk-ui-gen-ai/styles/scss/messages.scss b/libs/sdk-ui-gen-ai/styles/scss/messages.scss index 7b6ca8a910d..05fa34dce1f 100644 --- a/libs/sdk-ui-gen-ai/styles/scss/messages.scss +++ b/libs/sdk-ui-gen-ai/styles/scss/messages.scss @@ -1283,6 +1283,10 @@ color: kit-variables.$gd-palette-error-base; } } + + &--visualization { + position: relative; + } } .gd-gen-ai-chat__conversation__item__feedback { diff --git a/libs/sdk-ui-geo/package.json b/libs/sdk-ui-geo/package.json index ff6c2094ce1..6b8ac73c5fc 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Geo Charts", "license": "MIT", "author": "GoodData Corporation", @@ -39,7 +39,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm styles/css coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm styles/css coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-geo/src/next/context/GeoLayersContext.tsx b/libs/sdk-ui-geo/src/next/context/GeoLayersContext.tsx index a3d8a2cbf49..102bfdff7b0 100644 --- a/libs/sdk-ui-geo/src/next/context/GeoLayersContext.tsx +++ b/libs/sdk-ui-geo/src/next/context/GeoLayersContext.tsx @@ -7,6 +7,7 @@ import { type IColorStrategy } from "@gooddata/sdk-ui-vis-commons"; import type { ILayerPreparedData } from "../hooks/layers/useLayersPrepare.js"; import type { GeoJSONSourceSpecification } from "../layers/common/mapFacade.js"; +import type { ITooltipReferenceMaps } from "../layers/registry/adapterTypes.js"; import { type IAvailableLegends, type IGeoLegendItem } from "../types/common/legends.js"; import { type IAreaGeoData } from "../types/geoData/area.js"; import { type IPushpinGeoData } from "../types/geoData/pushpin.js"; @@ -76,6 +77,11 @@ export interface IGeoLayerData { * Initial viewport hint derived from the layer data. */ initialViewport: Partial | null; + + /** + * Reference id maps for custom-tooltip resolution. + */ + tooltipReferenceMaps?: ITooltipReferenceMaps; } /** @@ -140,6 +146,7 @@ export function GeoLayersProvider({ baseLegendItems: prepared.output?.legend.items ?? EMPTY_LEGEND_ITEMS, availableLegends: prepared.output?.legend.available ?? EMPTY_AVAILABLE_LEGENDS, initialViewport: prepared.output?.initialViewport ?? null, + tooltipReferenceMaps: prepared.output?.tooltipReferenceMaps, }); } } diff --git a/libs/sdk-ui-geo/src/next/context/tests/GeoLayersContext.test.tsx b/libs/sdk-ui-geo/src/next/context/tests/GeoLayersContext.test.tsx new file mode 100644 index 00000000000..1c2252254da --- /dev/null +++ b/libs/sdk-ui-geo/src/next/context/tests/GeoLayersContext.test.tsx @@ -0,0 +1,81 @@ +// (C) 2026 GoodData Corporation + +import { type ReactNode } from "react"; + +import { renderHook } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; + +import { type DataViewFacade } from "@gooddata/sdk-ui"; +import { type IColorStrategy } from "@gooddata/sdk-ui-vis-commons"; + +import type { ILayerPreparedData } from "../../hooks/layers/useLayersPrepare.js"; +import type { GeoJSONSourceSpecification } from "../../layers/common/mapFacade.js"; +import type { IGeoLayerOutput, ITooltipReferenceMaps } from "../../layers/registry/adapterTypes.js"; +import type { IPushpinGeoData } from "../../types/geoData/pushpin.js"; +import type { ILayerExecutionRecord } from "../../types/props/geoChart/internal.js"; +import { GeoLayersProvider, useGeoLayers } from "../GeoLayersContext.js"; + +const testSource: GeoJSONSourceSpecification = { + type: "geojson", + data: { type: "FeatureCollection", features: [] }, +}; + +function makePrepared(overrides: Partial = {}): ILayerPreparedData { + return { + layerId: "L1", + dataView: {} as DataViewFacade, + output: { + source: testSource, + legend: { + items: [], + available: { + hasCategoryLegend: false, + hasColorLegend: false, + hasSizeLegend: false, + }, + }, + geoData: {} as IPushpinGeoData, + colorStrategy: {} as IColorStrategy, + initialViewport: null, + ...overrides, + }, + }; +} + +const layerExecutions: ILayerExecutionRecord[] = [ + { layerId: "L1", layer: { type: "pushpin" } as ILayerExecutionRecord["layer"] } as ILayerExecutionRecord, +]; + +function wrapperWith(layerOutputs: Map) { + return ({ children }: { children: ReactNode }) => ( + + {children} + + ); +} + +describe("GeoLayersContext", () => { + it("propagates tooltipReferenceMaps from prepared output to IGeoLayerData", () => { + const tooltipReferenceMaps: ITooltipReferenceMaps = { + measures: { m_local: "f_population" }, + attributes: { "df.city": "attr.city" }, + }; + const layerOutputs = new Map([["L1", makePrepared({ tooltipReferenceMaps })]]); + + const { result } = renderHook(() => useGeoLayers(), { + wrapper: wrapperWith(layerOutputs), + }); + + expect(result.current.layers.get("L1")?.tooltipReferenceMaps).toBe(tooltipReferenceMaps); + }); + + it("leaves tooltipReferenceMaps undefined when prepared output omits it", () => { + const layerOutputs = new Map([["L1", makePrepared()]]); + + const { result } = renderHook(() => useGeoLayers(), { + wrapper: wrapperWith(layerOutputs), + }); + + expect(result.current.layers.get("L1")?.tooltipReferenceMaps).toBeUndefined(); + }); +}); diff --git a/libs/sdk-ui-geo/src/next/layers/registry/output.ts b/libs/sdk-ui-geo/src/next/layers/registry/output.ts index 1b679784696..243bdbd6500 100644 --- a/libs/sdk-ui-geo/src/next/layers/registry/output.ts +++ b/libs/sdk-ui-geo/src/next/layers/registry/output.ts @@ -23,5 +23,6 @@ export function buildOutputFromLayerData(layerData: IGeoLayerData): IGeoLayerOut geoData: layerData.geoData, colorStrategy: layerData.colorStrategy, initialViewport: layerData.initialViewport, + tooltipReferenceMaps: layerData.tooltipReferenceMaps, }; } diff --git a/libs/sdk-ui-geo/src/next/layers/registry/tests/output.test.ts b/libs/sdk-ui-geo/src/next/layers/registry/tests/output.test.ts index 3c8d13b2590..6adfcbc404d 100644 --- a/libs/sdk-ui-geo/src/next/layers/registry/tests/output.test.ts +++ b/libs/sdk-ui-geo/src/next/layers/registry/tests/output.test.ts @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { describe, expect, it } from "vitest"; @@ -72,4 +72,14 @@ describe("buildOutputFromLayerData", () => { expect(output?.legend.available).toBe(availableLegends); expect(output?.source).toBe(testSource); }); + + it("propagates tooltipReferenceMaps from layer data to output", () => { + const tooltipReferenceMaps = { + measures: { m_local: "f_population" }, + attributes: { "df.city": "attr.city" }, + }; + const output = buildOutputFromLayerData(createLayerData({ tooltipReferenceMaps })); + + expect(output?.tooltipReferenceMaps).toBe(tooltipReferenceMaps); + }); }); diff --git a/libs/sdk-ui-kit/api/sdk-ui-kit.api.md b/libs/sdk-ui-kit/api/sdk-ui-kit.api.md index ed667759808..006e092ae8d 100644 --- a/libs/sdk-ui-kit/api/sdk-ui-kit.api.md +++ b/libs/sdk-ui-kit/api/sdk-ui-kit.api.md @@ -1861,7 +1861,7 @@ export function IconTrash({ color, className, width, height }: IIconProps): JSX. export function IconTreeMap({ className, width, height, color, ariaHidden }: IIconProps): JSX.Element; // @internal (undocumented) -export type IconType = "aiAgent" | "aiAgentDisabled" | "brain" | "brainDisabled" | "check" | "checkCircle" | "certification" | "plus" | "plusCircle" | "sync" | "alert" | "alertPaused" | "close" | "cross" | "edit" | "crossCircle" | "question" | "chevronUp" | "chevronRight" | "chevronDown" | "chevronLeft" | "date" | "navigateUp" | "navigateDown" | "navigateRight" | "navigateLeft" | "download" | "slack" | "expand" | "exclamationCircle" | "book" | "visible" | "invisible" | "lock" | "unlock" | "ai" | "aiFill" | "drawer" | "drawerEmpty" | "prohibited" | "dropDown" | "dropRight" | "clock" | "clockPaused" | "questionMark" | "upload" | "expandRectangle" | "file" | "number" | "code" | "user" | "userPlus" | "users" | "magic" | "tab" | "pauseCircle" | "filter" | "timer" | "mail" | "envelope" | "copy" | "rain" | "earth" | "geoCollection" | "geoCollectionUpload" | "minimize" | "shrink" | "copyright" | "ellipsis" | "pencil" | "folder" | "folderPlus" | "trash" | "arrowUp" | "arrowRight" | "arrowDown" | "arrowLeft" | "undo" | "redo" | "trendDown" | "trendUp" | "save" | "minus" | "minusCircle" | "percent" | "enter" | "enterRight" | "money" | "ghost" | "warning" | "home" | "settings" | "search" | "university" | "printer" | "picture" | "visualization" | "dashboard" | "metric" | "fact" | "ldmAttribute" | "sharp" | "attribute" | "horn" | "cw" | "ccw" | "table" | "directionColumn" | "directionRow" | "header" | "genai" | "genai2" | "explainai" | "hiddenForAi" | "box" | "ellipsisVertical" | "list" | "drillTo" | "hierarchy" | "history" | "history2" | "thumbsUp" | "thumbsDown" | "send" | "visualizationArea" | "visualizationTable" | "visualizationTreemap" | "visualizationScatter" | "visualizationDonut" | "visualizationHeadline" | "visualizationColumn" | "visualizationLine" | "visualizationPyramid" | "visualizationFunnel" | "visualizationHeatmap" | "visualizationBubble" | "visualizationPie" | "visualizationBar" | "visualizationCombo" | "visualizationBullet" | "visualizationWaterfall" | "visualizationDependencywheel" | "visualizationSankey" | "visualizationPushpin" | "visualizationRepeater" | "visualizationXirr" | "link" | "externalLink" | "click" | "fileXlsx" | "filePptx" | "filePdf" | "fileImage" | "fileCsvFormatted" | "fileCsvRaw" | "aiDocument" | "recommendation" | "streamUp" | "streamDown" | "stream" | "density" | "parameter"; +export type IconType = "aiAgent" | "aiAgentDisabled" | "brain" | "brainDisabled" | "check" | "checkCircle" | "certification" | "plus" | "plusCircle" | "sync" | "alert" | "alertPaused" | "close" | "cross" | "edit" | "crossCircle" | "question" | "chevronUp" | "chevronRight" | "chevronDown" | "chevronLeft" | "date" | "navigateUp" | "navigateDown" | "navigateRight" | "navigateLeft" | "download" | "slack" | "expand" | "exclamationCircle" | "book" | "visible" | "invisible" | "lock" | "unlock" | "ai" | "aiFill" | "drawer" | "drawerEmpty" | "prohibited" | "dropDown" | "dropRight" | "clock" | "clockPaused" | "questionMark" | "upload" | "expandRectangle" | "file" | "number" | "code" | "user" | "userPlus" | "users" | "magic" | "tab" | "pauseCircle" | "filter" | "timer" | "mail" | "envelope" | "copy" | "rain" | "earth" | "geoCollection" | "geoCollectionUpload" | "minimize" | "shrink" | "copyright" | "ellipsis" | "pencil" | "folder" | "folderPlus" | "trash" | "arrowUp" | "arrowRight" | "arrowDown" | "arrowLeft" | "undo" | "redo" | "trendDown" | "trendUp" | "save" | "minus" | "minusCircle" | "percent" | "enter" | "enterRight" | "money" | "ghost" | "warning" | "home" | "settings" | "search" | "university" | "printer" | "picture" | "visualization" | "dashboard" | "metric" | "fact" | "ldmAttribute" | "sharp" | "attribute" | "horn" | "cw" | "ccw" | "table" | "directionColumn" | "directionRow" | "header" | "genai" | "genai2" | "explainai" | "hiddenForAi" | "box" | "ellipsisVertical" | "list" | "drillTo" | "hierarchy" | "history" | "history2" | "thumbsUp" | "thumbsDown" | "send" | "visualizationArea" | "visualizationTable" | "visualizationTreemap" | "visualizationScatter" | "visualizationDonut" | "visualizationHeadline" | "visualizationColumn" | "visualizationLine" | "visualizationPyramid" | "visualizationFunnel" | "visualizationHeatmap" | "visualizationBubble" | "visualizationPie" | "visualizationBar" | "visualizationCombo" | "visualizationBullet" | "visualizationWaterfall" | "visualizationDependencywheel" | "visualizationSankey" | "visualizationPushpin" | "visualizationRepeater" | "visualizationXirr" | "link" | "externalLink" | "click" | "fileXlsx" | "filePptx" | "filePdf" | "fileImage" | "fileCsvFormatted" | "fileCsvRaw" | "aiDocument" | "recommendation" | "streamUp" | "streamDown" | "stream" | "density" | "parameter" | "pin" | "unpin"; // @internal (undocumented) export function IconUndo({ color, className, width, height, ariaHidden }: IIconProps): JSX.Element; diff --git a/libs/sdk-ui-kit/package.json b/libs/sdk-ui-kit/package.json index ebbb15d8d95..a49f2f2b61c 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - UI Building Components", "license": "MIT", "author": "GoodData Corporation", @@ -42,7 +42,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage styles/css *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp styles/css *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-kit/src/@ui/@types/icon.ts b/libs/sdk-ui-kit/src/@ui/@types/icon.ts index b35eb824021..7eeed79e910 100644 --- a/libs/sdk-ui-kit/src/@ui/@types/icon.ts +++ b/libs/sdk-ui-kit/src/@ui/@types/icon.ts @@ -165,4 +165,6 @@ export type IconType = | "streamDown" | "stream" | "density" - | "parameter"; + | "parameter" + | "pin" + | "unpin"; diff --git a/libs/sdk-ui-kit/src/@ui/UiIcon/icons.tsx b/libs/sdk-ui-kit/src/@ui/UiIcon/icons.tsx index 78faa3a10ea..fa714cf4d69 100644 --- a/libs/sdk-ui-kit/src/@ui/UiIcon/icons.tsx +++ b/libs/sdk-ui-kit/src/@ui/UiIcon/icons.tsx @@ -960,4 +960,18 @@ export const iconPaths: Record = { history2: ( ), + pin: ( + + ), + unpin: ( + + + + + + ), }; diff --git a/libs/sdk-ui-kit/src/@ui/UiMenu/hooks.tsx b/libs/sdk-ui-kit/src/@ui/UiMenu/hooks.tsx index 8c6b3c4f94b..6b98772e210 100644 --- a/libs/sdk-ui-kit/src/@ui/UiMenu/hooks.tsx +++ b/libs/sdk-ui-kit/src/@ui/UiMenu/hooks.tsx @@ -223,39 +223,69 @@ export function useUiMenuContextValue ({ + controlType, + setControlType, + setFocusedId, + focusedItem, + setShownCustomContentItemId, + shownCustomContentItemId, + pushShownSubview, + popShownSubview, + shownSubview, + onClose, + items, + size, + onSelect: handleSelectItem, + itemDataTestId, + isItemFocusable, + makeItemId, + scrollToView, + menuComponentRef: menuComponentRef, + itemsContainerRef: itemsContainerRef, + + InteractiveItemWrapper: InteractiveItemWrapperComponent, + InteractiveItem: InteractiveItemComponent, + + StaticItem: StaticItemComponent, + GroupItem: GroupItemComponent, + MenuHeader: MenuHeaderComponent, + ContentItemWrapper: ContentItemWrapperComponent, + ContentItem: ContentItemComponent, + Content: ContentComponent, + ItemComponent: Item, + menuCtxData, + }), + [ + ContentComponent, + ContentItemComponent, + ContentItemWrapperComponent, + GroupItemComponent, + InteractiveItemComponent, + InteractiveItemWrapperComponent, + MenuHeaderComponent, + StaticItemComponent, + controlType, + focusedItem, + handleSelectItem, + isItemFocusable, + itemDataTestId, + items, + itemsContainerRef, + makeItemId, + menuComponentRef, + menuCtxData, + onClose, + popShownSubview, + pushShownSubview, + scrollToView, + setFocusedId, + shownCustomContentItemId, + shownSubview, + size, + ], + ); } /** diff --git a/libs/sdk-ui-loaders/package.json b/libs/sdk-ui-loaders/package.json index 3dcc950ccf0..1aebb46b2c0 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK Runtime Component Loaders", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", @@ -32,7 +32,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-pivot/package.json b/libs/sdk-ui-pivot/package.json index 78312410779..e5bdb9798e5 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Pivot Table", "license": "MIT", "author": "GoodData Corporation", @@ -39,7 +39,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-pluggable-application/package.json b/libs/sdk-ui-pluggable-application/package.json index c72806ce51b..ba5f698b551 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK React helpers for pluggable applications", "license": "MIT", "author": "GoodData Corporation", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-semantic-search/package.json b/libs/sdk-ui-semantic-search/package.json index 8b7260bae99..138c6ae74c6 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.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK TypeScript & React skeleton", "license": "MIT", "author": "GoodData Corporation", @@ -39,7 +39,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-tests-e2e/recordings/mappings/TIGER/mapping-insightOnDashboard.spec.ts.json b/libs/sdk-ui-tests-e2e/recordings/mappings/TIGER/mapping-insightOnDashboard.spec.ts.json index 775f0c94df9..418174984ac 100644 --- a/libs/sdk-ui-tests-e2e/recordings/mappings/TIGER/mapping-insightOnDashboard.spec.ts.json +++ b/libs/sdk-ui-tests-e2e/recordings/mappings/TIGER/mapping-insightOnDashboard.spec.ts.json @@ -5559,7 +5559,7 @@ "method": "PUT", "bodyPatterns": [ { - "equalToJson": "{\"data\":{\"attributes\":{\"content\":{\"filterContextRef\":{\"identifier\":{\"id\":\"882c3455-5c89-4577-a9c2-aa60ca875d19\",\"type\":\"filterContext\"}},\"layout\":{\"sections\":[{\"items\":[{\"size\":{\"xl\":{\"gridWidth\":6}},\"type\":\"IDashboardLayoutItem\",\"widget\":{\"dateDataSet\":{\"identifier\":{\"id\":\"dt_closedate_timestamp\",\"type\":\"dataset\"}},\"description\":\"\",\"drills\":[],\"ignoreDashboardFilters\":[],\"insight\":{\"identifier\":{\"id\":\"a40866ab-5272-4f2c-9b5a-dd255b1e5d42\",\"type\":\"visualizationObject\"}},\"localIdentifier\":\"test_widget_local_identifier_0\",\"properties\":{},\"title\":\"\\u003cbutton\\u003ehello\\u003c/button\\u003e\",\"type\":\"insight\"}}],\"type\":\"IDashboardLayoutSection\"}],\"type\":\"IDashboardLayout\"},\"tabs\":[{\"filterContextRef\":{\"identifier\":{\"id\":\"882c3455-5c89-4577-a9c2-aa60ca875d19\",\"type\":\"filterContext\"}},\"layout\":{\"sections\":[{\"items\":[{\"size\":{\"xl\":{\"gridWidth\":6}},\"type\":\"IDashboardLayoutItem\",\"widget\":{\"dateDataSet\":{\"identifier\":{\"id\":\"dt_closedate_timestamp\",\"type\":\"dataset\"}},\"description\":\"\",\"drills\":[],\"ignoreDashboardFilters\":[],\"insight\":{\"identifier\":{\"id\":\"a40866ab-5272-4f2c-9b5a-dd255b1e5d42\",\"type\":\"visualizationObject\"}},\"localIdentifier\":\"test_widget_local_identifier_1\",\"properties\":{},\"title\":\"\\u003cbutton\\u003ehello\\u003c/button\\u003e\",\"type\":\"insight\"}}],\"type\":\"IDashboardLayoutSection\"}],\"type\":\"IDashboardLayout\"},\"localIdentifier\":\"defaultTabId\",\"title\":\"\"}],\"version\":\"2\"},\"description\":\"\",\"tags\":[],\"title\":\"Insight on dashboard\"},\"id\":\"46dbb7b3-468c-436f-a2ff-85fbf4e8d5ad\",\"type\":\"analyticalDashboard\"}}", + "equalToJson": "{\"data\":{\"attributes\":{\"content\":{\"filterContextRef\":{\"identifier\":{\"id\":\"882c3455-5c89-4577-a9c2-aa60ca875d19\",\"type\":\"filterContext\"}},\"layout\":{\"sections\":[{\"items\":[{\"size\":{\"xl\":{\"gridWidth\":6}},\"type\":\"IDashboardLayoutItem\",\"widget\":{\"dateDataSet\":{\"identifier\":{\"id\":\"dt_closedate_timestamp\",\"type\":\"dataset\"}},\"description\":\"\",\"drills\":[],\"ignoreDashboardFilters\":[],\"insight\":{\"identifier\":{\"id\":\"a40866ab-5272-4f2c-9b5a-dd255b1e5d42\",\"type\":\"visualizationObject\"}},\"localIdentifier\":\"test_widget_local_identifier_0\",\"properties\":{},\"title\":\"\\u003cbutton\\u003ehello\\u003c/button\\u003e\",\"type\":\"insight\"}}],\"type\":\"IDashboardLayoutSection\"}],\"type\":\"IDashboardLayout\"},\"parameters\":[],\"tabs\":[{\"filterContextRef\":{\"identifier\":{\"id\":\"882c3455-5c89-4577-a9c2-aa60ca875d19\",\"type\":\"filterContext\"}},\"layout\":{\"sections\":[{\"items\":[{\"size\":{\"xl\":{\"gridWidth\":6}},\"type\":\"IDashboardLayoutItem\",\"widget\":{\"dateDataSet\":{\"identifier\":{\"id\":\"dt_closedate_timestamp\",\"type\":\"dataset\"}},\"description\":\"\",\"drills\":[],\"ignoreDashboardFilters\":[],\"insight\":{\"identifier\":{\"id\":\"a40866ab-5272-4f2c-9b5a-dd255b1e5d42\",\"type\":\"visualizationObject\"}},\"localIdentifier\":\"test_widget_local_identifier_1\",\"properties\":{},\"title\":\"\\u003cbutton\\u003ehello\\u003c/button\\u003e\",\"type\":\"insight\"}}],\"type\":\"IDashboardLayoutSection\"}],\"type\":\"IDashboardLayout\"},\"localIdentifier\":\"defaultTabId\",\"parameters\":[],\"title\":\"\"}],\"version\":\"2\"},\"description\":\"\",\"tags\":[],\"title\":\"Insight on dashboard\"},\"id\":\"46dbb7b3-468c-436f-a2ff-85fbf4e8d5ad\",\"type\":\"analyticalDashboard\"}}", "ignoreArrayOrder": false, "ignoreExtraElements": false } diff --git a/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_full-featured_icon_0_document_0_desktop.png b/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_full-featured_icon_0_document_0_desktop.png index 3a65d9a76561219ee6b87e75b728a6bd699c24d9..3ee7ccea62d4fd1f980f1f714faac1d223a869ba 100644 GIT binary patch delta 42611 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ðy7& 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
_q)Bnm9{KqR*L$o&QOeu8a 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 delta 43755 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 Date: Wed, 13 May 2026 03:16:35 +0000 Subject: [PATCH 2/2] chore: update dependencies after rush update risk: low --- .../rush/browser-approved-packages.json | 2652 +++++++++-------- common/config/rush/pnpm-lock.yaml | 469 +-- 2 files changed, 1588 insertions(+), 1533 deletions(-) diff --git a/common/config/rush/browser-approved-packages.json b/common/config/rush/browser-approved-packages.json index 14c4dd5da82..1b5483ed840 100644 --- a/common/config/rush/browser-approved-packages.json +++ b/common/config/rush/browser-approved-packages.json @@ -1,1218 +1,1434 @@ -// DO NOT ADD COMMENTS IN THIS FILE. They will be lost when the Rush tool resaves it. -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/approved-packages.schema.json", - "packages": [ - { - "name": "@aaronhayes/react-use-hubspot-form", - "allowedCategories": ["production"] - }, - { - "name": "@babel/cli", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@babel/core", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@babel/plugin-proposal-export-default-from", - "allowedCategories": ["production"] - }, - { - "name": "@babel/plugin-transform-async-to-generator", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@babel/plugin-transform-class-properties", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@babel/plugin-transform-object-rest-spread", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@babel/plugin-transform-typescript", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@babel/preset-env", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@babel/preset-react", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@babel/preset-typescript", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@babel/runtime", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@braintree/sanitize-url", - "allowedCategories": ["production"] - }, - { - "name": "@codemirror/autocomplete", - "allowedCategories": ["production"] - }, - { - "name": "@codemirror/commands", - "allowedCategories": ["production"] - }, - { - "name": "@codemirror/lang-yaml", - "allowedCategories": ["production"] - }, - { - "name": "@codemirror/language", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@codemirror/lint", - "allowedCategories": ["production"] - }, - { - "name": "@codemirror/state", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@codemirror/view", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@componentdriven/csf", - "allowedCategories": ["production"] - }, - { - "name": "@floating-ui/dom", - "allowedCategories": ["production"] - }, - { - "name": "@floating-ui/react", - "allowedCategories": ["production"] - }, - { - "name": "@floating-ui/react-dom", - "allowedCategories": ["production"] - }, - { - "name": "@formatjs/cli-lib", - "allowedCategories": ["tools"] - }, - { - "name": "@formatjs/icu-messageformat-parser", - "allowedCategories": ["tools"] - }, - { - "name": "@gooddata/api-client-tiger", - "allowedCategories": ["production", "tools"] - }, - { - "name": "@gooddata/catalog-export", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/eslint-config", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/fixtures", - "allowedCategories": ["production", "tools"] - }, - { - "name": "@gooddata/i18n-toolkit", - "allowedCategories": ["production"] - }, - { - "name": "@gooddata/mock-handling", - "allowedCategories": ["production", "tools"] - }, - { - "name": "@gooddata/number-formatter", - "allowedCategories": ["production"] - }, - { - "name": "@gooddata/plugin-toolkit", - "allowedCategories": ["tools"] - }, - { - "name": "@gooddata/reference-workspace", - "allowedCategories": ["production"] - }, - { - "name": "@gooddata/sdk-backend-base", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-backend-mockingbird", - "allowedCategories": ["production"] - }, - { - "name": "@gooddata/sdk-backend-spi", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-backend-tiger", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-embedding", - "allowedCategories": ["production"] - }, - { - "name": "@gooddata/sdk-model", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui-dashboard", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui-ext", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui-filters", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui-gen-ai", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui-geo", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui-charts", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui-kit", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui-loaders", - "allowedCategories": ["examples", "tools"] - }, - { - "name": "@gooddata/sdk-ui-pivot", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@gooddata/sdk-ui-semantic-search", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@gooddata/sdk-ui-theme-provider", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@gooddata/sdk-ui-vis-commons", - "allowedCategories": ["production"] - }, - { - "name": "@gooddata/sdk-ui-web-components", - "allowedCategories": ["production"] - }, - { - "name": "@gooddata/stylelint-config", - "allowedCategories": ["production"] - }, - { - "name": "@gooddata/util", - "allowedCategories": ["production"] - }, - { - "name": "@lezer/highlight", - "allowedCategories": ["production"] - }, - { - "name": "@microsoft/api-documenter", - "allowedCategories": ["production", "tools"] - }, - { - "name": "@microsoft/api-extractor", - "allowedCategories": ["production", "tools"] - }, - { - "name": "@openapitools/openapi-generator-cli", - "allowedCategories": ["production"] - }, - { - "name": "@react-aria/interactions", - "allowedCategories": ["production"] - }, - { - "name": "@reduxjs/toolkit", - "allowedCategories": ["production"] - }, - { - "name": "@storybook/builder-vite", - "allowedCategories": ["production"] - }, - { - "name": "@storybook/builder-webpack5", - "allowedCategories": ["production"] - }, - { - "name": "@storybook/cli", - "allowedCategories": ["production"] - }, - { - "name": "@storybook/manager-webpack5", - "allowedCategories": ["production"] - }, - { - "name": "@storybook/preset-scss", - "allowedCategories": ["production"] - }, - { - "name": "@storybook/react", - "allowedCategories": ["production"] - }, - { - "name": "@storybook/react-vite", - "allowedCategories": ["production"] - }, - { - "name": "@storybook/react-webpack5", - "allowedCategories": ["production"] - }, - { - "name": "@tanstack/react-virtual", - "allowedCategories": ["production"] - }, - { - "name": "@testing-library/dom", - "allowedCategories": ["production", "tools"] - }, - { - "name": "@testing-library/react", - "allowedCategories": ["production", "tools"] - }, - { - "name": "@testing-library/user-event", - "allowedCategories": ["production"] - }, - { - "name": "@types/babel__core", - "allowedCategories": ["tools"] - }, - { - "name": "@types/blessed", - "allowedCategories": ["tools"] - }, - { - "name": "@types/columnify", - "allowedCategories": ["tools"] - }, - { - "name": "@types/cross-spawn", - "allowedCategories": ["tools"] - }, - { - "name": "@types/debounce-promise", - "allowedCategories": ["production"] - }, - { - "name": "@types/fast-levenshtein", - "allowedCategories": ["production"] - }, - { - "name": "@types/fs-extra", - "allowedCategories": ["tools"] - }, - { - "name": "@types/history", - "allowedCategories": ["examples"] - }, - { - "name": "@types/hoist-non-react-statics", - "allowedCategories": ["production"] - }, - { - "name": "@types/inquirer", - "allowedCategories": ["tools"] - }, - { - "name": "@types/isomorphic-fetch", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@types/js-yaml", - "allowedCategories": ["production"] - }, - { - "name": "@types/json5", - "allowedCategories": ["tools"] - }, - { - "name": "@types/kefir", - "allowedCategories": ["production"] - }, - { - "name": "@types/mapbox-gl", - "allowedCategories": ["production"] - }, - { - "name": "@types/mdast", - "allowedCategories": ["production"] - }, - { - "name": "@types/node", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@types/node-fetch", - "allowedCategories": ["production"] - }, - { - "name": "@types/pdf-parse", - "allowedCategories": ["production"] - }, - { - "name": "@types/qs", - "allowedCategories": ["production"] - }, - { - "name": "@types/raf", - "allowedCategories": ["production", "tools"] - }, - { - "name": "@types/react", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@types/react-datepicker", - "allowedCategories": ["examples"] - }, - { - "name": "@types/react-dom", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@types/react-google-recaptcha", - "allowedCategories": ["examples"] - }, - { - "name": "@types/react-helmet", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@types/react-lines-ellipsis", - "allowedCategories": ["production"] - }, - { - "name": "@types/react-measure", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@types/react-native-listener", - "allowedCategories": ["production"] - }, - { - "name": "@types/react-portal", - "allowedCategories": ["production"] - }, - { - "name": "@types/react-redux", - "allowedCategories": ["production"] - }, - { - "name": "@types/react-router-dom", - "allowedCategories": ["examples", "production"] - }, - { - "name": "@types/react-syntax-highlighter", - "allowedCategories": ["examples"] - }, - { - "name": "@types/react-textarea-autosize", - "allowedCategories": ["production"] - }, - { - "name": "@types/react-transition-group", - "allowedCategories": ["production"] - }, - { - "name": "@types/rimraf", - "allowedCategories": ["tools"] - }, - { - "name": "@types/semver", - "allowedCategories": ["production"] - }, - { - "name": "@types/spark-md5", - "allowedCategories": ["production"] - }, - { - "name": "@types/stringify-object", - "allowedCategories": ["production"] - }, - { - "name": "@types/tar", - "allowedCategories": ["tools"] - }, - { - "name": "@types/tinycolor2", - "allowedCategories": ["production"] - }, - { - "name": "@types/tough-cookie", - "allowedCategories": ["production"] - }, - { - "name": "@types/unist", - "allowedCategories": ["production"] - }, - { - "name": "@types/uuid", - "allowedCategories": ["production"] - }, - { - "name": "@types/validate-npm-package-name", - "allowedCategories": ["tools"] - }, - { - "name": "@types/watchpack", - "allowedCategories": ["tools"] - }, - { - "name": "@types/webpack-env", - "allowedCategories": ["examples"] - }, - { - "name": "@typescript-eslint/eslint-plugin", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@typescript-eslint/parser", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "@vitejs/plugin-react", - "allowedCategories": ["examples"] - }, - { - "name": "@vitejs/plugin-react-swc", - "allowedCategories": ["examples"] - }, - { - "name": "@welldone-software/why-did-you-render", - "allowedCategories": ["examples"] - }, - { - "name": "ag-grid-community", - "allowedCategories": ["production"] - }, - { - "name": "ag-grid-enterprise", - "allowedCategories": ["production"] - }, - { - "name": "ag-grid-react", - "allowedCategories": ["production"] - }, - { - "name": "async", - "allowedCategories": ["production"] - }, - { - "name": "axios", - "allowedCategories": ["production", "tools"] - }, - { - "name": "axios-cache-interceptor", - "allowedCategories": ["production"] - }, - { - "name": "babel-loader", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "babel-plugin-lodash", - "allowedCategories": ["examples", "production"] - }, - { - "name": "babel-plugin-require-context-hook", - "allowedCategories": ["production"] - }, - { - "name": "blessed", - "allowedCategories": ["tools"] - }, - { - "name": "blob-polyfill", - "allowedCategories": ["production"] - }, - { - "name": "case-sensitive-paths-webpack-plugin", - "allowedCategories": ["examples", "tools"] - }, - { - "name": "circular-dependency-plugin", - "allowedCategories": ["examples", "production"] - }, - { - "name": "classnames", - "allowedCategories": ["examples", "production"] - }, - { - "name": "clean-webpack-plugin", - "allowedCategories": ["examples", "production"] - }, - { - "name": "codemirror", - "allowedCategories": ["production"] - }, - { - "name": "columnify", - "allowedCategories": ["tools"] - }, - { - "name": "commander", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "compression-webpack-plugin", - "allowedCategories": ["examples", "production"] - }, - { - "name": "concurrently", - "allowedCategories": ["production", "tools"] - }, - { - "name": "copy-to-clipboard", - "allowedCategories": ["production"] - }, - { - "name": "copy-webpack-plugin", - "allowedCategories": ["production"] - }, - { - "name": "core-js", - "allowedCategories": ["examples", "production"] - }, - { - "name": "cron-parser", - "allowedCategories": ["production"] - }, - { - "name": "cross-spawn", - "allowedCategories": ["tools"] - }, - { - "name": "css-loader", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "date-fns", - "allowedCategories": ["production"] - }, - { - "name": "date-fns-tz", - "allowedCategories": ["production"] - }, - { - "name": "debounce-promise", - "allowedCategories": ["production"] - }, - { - "name": "default-import", - "allowedCategories": ["examples", "production"] - }, - { - "name": "dependency-cruiser", - "allowedCategories": ["production", "tools"] - }, - { - "name": "dotenv", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "dotenv-webpack", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "downshift", - "allowedCategories": ["production"] - }, - { - "name": "@gooddata/emailjs-mime-codec-new", - "allowedCategories": ["production"] - }, - { - "name": "esbuild-loader", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint-import-resolver-typescript", - "allowedCategories": ["examples", "production"] - }, - { - "name": "eslint-plugin-header", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint-plugin-import", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint-plugin-import-esm", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint-plugin-no-only-tests", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint-plugin-react", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint-plugin-react-hooks", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint-plugin-regexp", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint-plugin-sonarjs", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eslint-plugin-tsdoc", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "eventsource-parser", - "allowedCategories": ["production"] - }, - { - "name": "exponential-backoff", - "allowedCategories": ["production"] - }, - { - "name": "fast-glob", - "allowedCategories": ["production", "tools"] - }, - { - "name": "fast-levenshtein", - "allowedCategories": ["production"] - }, - { - "name": "fetch-cookie", - "allowedCategories": ["production"] - }, - { - "name": "fetch-mock", - "allowedCategories": ["production"] - }, - { - "name": "find-up", - "allowedCategories": ["tools"] - }, - { - "name": "fix-esm-import-path", - "allowedCategories": ["production"] - }, - { - "name": "fixed-data-table-2", - "allowedCategories": ["production"] - }, - { - "name": "fork-ts-checker-webpack-plugin", - "allowedCategories": ["examples", "production"] - }, - { - "name": "fs-extra", - "allowedCategories": ["tools"] - }, - { - "name": "full-icu", - "allowedCategories": ["production"] - }, - { - "name": "glob", - "allowedCategories": ["production"] - }, - { - "name": "happy-dom", - "allowedCategories": ["production", "tools"] - }, - { - "name": "highcharts", - "allowedCategories": ["examples", "production"] - }, - { - "name": "highcharts-react-official", - "allowedCategories": ["examples", "production"] - }, - { - "name": "history", - "allowedCategories": ["examples"] - }, - { - "name": "hoist-non-react-statics", - "allowedCategories": ["production"] - }, - { - "name": "html-validate", - "allowedCategories": ["tools"] - }, - { - "name": "html-webpack-plugin", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "http-status-codes", - "allowedCategories": ["production"] - }, - { - "name": "chalk", - "allowedCategories": ["production", "tools"] - }, - { - "name": "chokidar", - "allowedCategories": ["tools"] - }, - { - "name": "immer", - "allowedCategories": ["production"] - }, - { - "name": "inquirer", - "allowedCategories": ["tools"] - }, - { - "name": "isomorphic-fetch", - "allowedCategories": ["examples", "production"] - }, - { - "name": "js-object-pretty-print", - "allowedCategories": ["production"] - }, - { - "name": "js-yaml", - "allowedCategories": ["production"] - }, - { - "name": "jsdom", - "allowedCategories": ["production"] - }, - { - "name": "json-loader", - "allowedCategories": ["production"] - }, - { - "name": "json-stable-stringify", - "allowedCategories": ["production", "tools"] - }, - { - "name": "json5", - "allowedCategories": ["tools"] - }, - { - "name": "jsonschema", - "allowedCategories": ["tools"] - }, - { - "name": "kefir", - "allowedCategories": ["production"] - }, - { - "name": "lru-cache", - "allowedCategories": ["production"] - }, - { - "name": "lz-string", - "allowedCategories": ["production"] - }, - { - "name": "mapbox-gl", - "allowedCategories": ["production"] - }, - { - "name": "mdast", - "allowedCategories": ["production"] - }, - { - "name": "mini-css-extract-plugin", - "allowedCategories": ["production"] - }, - { - "name": "mkdirp", - "allowedCategories": ["production", "tools"] - }, - { - "name": "mocha", - "allowedCategories": ["production"] - }, - { - "name": "mocha-junit-reporter", - "allowedCategories": ["production"] - }, - { - "name": "moment", - "allowedCategories": ["examples", "production"] - }, - { - "name": "node-fetch", - "allowedCategories": ["production"] - }, - { - "name": "node-xlsx", - "allowedCategories": ["production"] - }, - { - "name": "npm-run-all", - "allowedCategories": ["examples", "production"] - }, - { - "name": "open", - "allowedCategories": ["tools"] - }, - { - "name": "ora", - "allowedCategories": ["tools"] - }, - { - "name": "p-map", - "allowedCategories": ["tools"] - }, - { - "name": "pdf-parse", - "allowedCategories": ["production"] - }, - { - "name": "polished", - "allowedCategories": ["production"] - }, - { - "name": "postcss", - "allowedCategories": ["production"] - }, - { - "name": "postcss-value-parser", - "allowedCategories": ["production"] - }, - { - "name": "process", - "allowedCategories": ["examples", "tools"] - }, - { - "name": "qs", - "allowedCategories": ["production"] - }, - { - "name": "raf", - "allowedCategories": ["production", "tools"] - }, - { - "name": "react", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "react-content-loader", - "allowedCategories": ["production"] - }, - { - "name": "react-datepicker", - "allowedCategories": ["examples"] - }, - { - "name": "react-day-picker", - "allowedCategories": ["production"] - }, - { - "name": "react-dnd", - "allowedCategories": ["production"] - }, - { - "name": "react-dnd-html5-backend", - "allowedCategories": ["production"] - }, - { - "name": "react-dom", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "react-fast-compare", - "allowedCategories": ["production"] - }, - { - "name": "react-ga", - "allowedCategories": ["examples"] - }, - { - "name": "react-google-recaptcha", - "allowedCategories": ["examples"] - }, - { - "name": "react-grid-system", - "allowedCategories": ["production"] - }, - { - "name": "react-helmet", - "allowedCategories": ["examples", "production"] - }, - { - "name": "react-intl", - "allowedCategories": ["production", "tools"] - }, - { - "name": "react-lines-ellipsis", - "allowedCategories": ["production"] - }, - { - "name": "react-loading-skeleton", - "allowedCategories": ["production"] - }, - { - "name": "react-markdown", - "allowedCategories": ["production"] - }, - { - "name": "react-measure", - "allowedCategories": ["examples", "production"] - }, - { - "name": "react-native-listener", - "allowedCategories": ["production"] - }, - { - "name": "react-portal", - "allowedCategories": ["production"] - }, - { - "name": "react-redux", - "allowedCategories": ["production"] - }, - { - "name": "react-responsive", - "allowedCategories": ["production"] - }, - { - "name": "react-router-dom", - "allowedCategories": ["examples", "production"] - }, - { - "name": "react-select", - "allowedCategories": ["examples", "production"] - }, - { - "name": "react-select-async-paginate", - "allowedCategories": ["production"] - }, - { - "name": "react-syntax-highlighter", - "allowedCategories": ["examples"] - }, - { - "name": "react-textarea-autosize", - "allowedCategories": ["production"] - }, - { - "name": "react-transition-group", - "allowedCategories": ["production"] - }, - { - "name": "react-window", - "allowedCategories": ["production"] - }, - { - "name": "redux-batched-actions", - "allowedCategories": ["production"] - }, - { - "name": "redux-saga", - "allowedCategories": ["production"] - }, - { - "name": "recharts", - "allowedCategories": ["examples"] - }, - { - "name": "remark", - "allowedCategories": ["production"] - }, - { - "name": "remark-emoji", - "allowedCategories": ["production"] - }, - { - "name": "require-from-string", - "allowedCategories": ["production"] - }, - { - "name": "reselect", - "allowedCategories": ["production"] - }, - { - "name": "sass", - "allowedCategories": ["examples", "production"] - }, - { - "name": "sass-loader", - "allowedCategories": ["examples", "production"] - }, - { - "name": "semver", - "allowedCategories": ["production"] - }, - { - "name": "source-map-loader", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "spark-md5", - "allowedCategories": ["production"] - }, - { - "name": "speed-measure-webpack-plugin", - "allowedCategories": ["examples"] - }, - { - "name": "storybook", - "allowedCategories": ["production"] - }, - { - "name": "stringify-object", - "allowedCategories": ["production"] - }, - { - "name": "strip-ansi", - "allowedCategories": ["tools"] - }, - { - "name": "style-loader", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "styled-jsx", - "allowedCategories": ["examples", "production"] - }, - { - "name": "stylelint", - "allowedCategories": ["production"] - }, - { - "name": "svgo", - "allowedCategories": ["production"] - }, - { - "name": "tar", - "allowedCategories": ["tools"] - }, - { - "name": "tinycolor2", - "allowedCategories": ["production"] - }, - { - "name": "ts-invariant", - "allowedCategories": ["examples", "production"] - }, - { - "name": "ts-loader", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "ts-morph", - "allowedCategories": ["tools"] - }, - { - "name": "tsd", - "allowedCategories": ["production"] - }, - { - "name": "tslib", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "typescript", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "unified", - "allowedCategories": ["production"] - }, - { - "name": "util", - "allowedCategories": ["examples", "tools"] - }, - { - "name": "uuid", - "allowedCategories": ["production"] - }, - { - "name": "validate-npm-package-name", - "allowedCategories": ["examples", "tools"] - }, - { - "name": "vite", - "allowedCategories": ["examples", "production"] - }, - { - "name": "vite-plugin-html", - "allowedCategories": ["examples"] - }, - { - "name": "vite-plugin-mkcert", - "allowedCategories": ["examples"] - }, - { - "name": "vite-plugin-static-copy", - "allowedCategories": ["production"] - }, - { - "name": "vitest", - "allowedCategories": ["production", "tools"] - }, - { - "name": "vitest-dom", - "allowedCategories": ["production"] - }, - { - "name": "wait-on", - "allowedCategories": ["production"] - }, - { - "name": "watchpack", - "allowedCategories": ["tools"] - }, - { - "name": "webpack", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "webpack-bundle-analyzer", - "allowedCategories": ["production", "tools"] - }, - { - "name": "webpack-cli", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "webpack-dev-server", - "allowedCategories": ["examples", "production", "tools"] - }, - { - "name": "xml2js", - "allowedCategories": ["production"] - } - ] -} +// DO NOT ADD COMMENTS IN THIS FILE. They will be lost when the Rush tool resaves it. +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/approved-packages.schema.json", + "packages": [ + { + "name": "@aaronhayes/react-use-hubspot-form", + "allowedCategories": [ "production" ] + }, + { + "name": "@babel/cli", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@babel/core", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@babel/plugin-proposal-export-default-from", + "allowedCategories": [ "production" ] + }, + { + "name": "@babel/plugin-transform-async-to-generator", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@babel/plugin-transform-class-properties", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@babel/plugin-transform-object-rest-spread", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@babel/plugin-transform-typescript", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@babel/preset-env", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@babel/preset-react", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@babel/preset-typescript", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@babel/runtime", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@braintree/sanitize-url", + "allowedCategories": [ "production" ] + }, + { + "name": "@codemirror/autocomplete", + "allowedCategories": [ "production" ] + }, + { + "name": "@codemirror/commands", + "allowedCategories": [ "production" ] + }, + { + "name": "@codemirror/lang-yaml", + "allowedCategories": [ "production" ] + }, + { + "name": "@codemirror/language", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@codemirror/lint", + "allowedCategories": [ "production" ] + }, + { + "name": "@codemirror/state", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@codemirror/view", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@componentdriven/csf", + "allowedCategories": [ "production" ] + }, + { + "name": "@eslint/js", + "allowedCategories": [ "tools" ] + }, + { + "name": "@evil-internetmann/react-dnd", + "allowedCategories": [ "production" ] + }, + { + "name": "@floating-ui/dom", + "allowedCategories": [ "production" ] + }, + { + "name": "@floating-ui/react", + "allowedCategories": [ "production" ] + }, + { + "name": "@floating-ui/react-dom", + "allowedCategories": [ "production" ] + }, + { + "name": "@formatjs/cli-lib", + "allowedCategories": [ "tools" ] + }, + { + "name": "@formatjs/icu-messageformat-parser", + "allowedCategories": [ "tools" ] + }, + { + "name": "@gooddata/api-client-tiger", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@gooddata/catalog-export", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/emailjs-mime-codec-new", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/eslint-config", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/fixtures", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@gooddata/i18n-toolkit", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/lint-config", + "allowedCategories": [ "tools" ] + }, + { + "name": "@gooddata/mock-handling", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@gooddata/number-formatter", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/oxlint-config", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/plugin-toolkit", + "allowedCategories": [ "tools" ] + }, + { + "name": "@gooddata/reference-workspace", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-backend-base", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-backend-mockingbird", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-backend-spi", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-backend-tiger", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-code-convertors", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-code-schemas", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-e2e-utils", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-embedding", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-model", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-pluggable-application-model", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-ui", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-catalog", + "allowedCategories": [ "examples" ] + }, + { + "name": "@gooddata/sdk-ui-charts", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-dashboard", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-ext", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-filters", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-gen-ai", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-geo", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-kit", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-loaders", + "allowedCategories": [ "examples", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-pivot", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@gooddata/sdk-ui-semantic-search", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@gooddata/sdk-ui-tests-app", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-ui-tests-reference-workspace", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-ui-tests-scenarios", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-ui-theme-provider", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@gooddata/sdk-ui-vis-commons", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/sdk-ui-web-components", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/stylelint-config", + "allowedCategories": [ "production" ] + }, + { + "name": "@gooddata/util", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@joint/core", + "allowedCategories": [ "production" ] + }, + { + "name": "@joint/layout-directed-graph", + "allowedCategories": [ "production" ] + }, + { + "name": "@lezer/highlight", + "allowedCategories": [ "production" ] + }, + { + "name": "@microsoft/api-documenter", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@microsoft/api-extractor", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@openapitools/openapi-generator-cli", + "allowedCategories": [ "production" ] + }, + { + "name": "@playwright/test", + "allowedCategories": [ "production" ] + }, + { + "name": "@react-aria/interactions", + "allowedCategories": [ "production" ] + }, + { + "name": "@reduxjs/toolkit", + "allowedCategories": [ "production" ] + }, + { + "name": "@storybook/addon-a11y", + "allowedCategories": [ "production" ] + }, + { + "name": "@storybook/builder-vite", + "allowedCategories": [ "production" ] + }, + { + "name": "@storybook/builder-webpack5", + "allowedCategories": [ "production" ] + }, + { + "name": "@storybook/cli", + "allowedCategories": [ "production" ] + }, + { + "name": "@storybook/manager-webpack5", + "allowedCategories": [ "production" ] + }, + { + "name": "@storybook/preset-scss", + "allowedCategories": [ "production" ] + }, + { + "name": "@storybook/react", + "allowedCategories": [ "production" ] + }, + { + "name": "@storybook/react-vite", + "allowedCategories": [ "production" ] + }, + { + "name": "@storybook/react-webpack5", + "allowedCategories": [ "production" ] + }, + { + "name": "@tanstack/react-virtual", + "allowedCategories": [ "production" ] + }, + { + "name": "@testing-library/dom", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@testing-library/react", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@testing-library/user-event", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/babel__core", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/blessed", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/columnify", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/cross-spawn", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/debounce-promise", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/fast-levenshtein", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/fs-extra", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/geojson", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/history", + "allowedCategories": [ "examples" ] + }, + { + "name": "@types/hoist-non-react-statics", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/inquirer", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/isomorphic-fetch", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@types/js-yaml", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/json5", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/kefir", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/lodash-es", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@types/mapbox-gl", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/maplibre-gl", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/mdast", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/node", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@types/node-fetch", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/pdf-parse", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/qs", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/raf", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@types/react", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@types/react-datepicker", + "allowedCategories": [ "examples" ] + }, + { + "name": "@types/react-dom", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@types/react-google-recaptcha", + "allowedCategories": [ "examples" ] + }, + { + "name": "@types/react-helmet", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@types/react-lines-ellipsis", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/react-measure", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@types/react-native-listener", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/react-portal", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/react-redux", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/react-router-dom", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@types/react-syntax-highlighter", + "allowedCategories": [ "examples" ] + }, + { + "name": "@types/react-textarea-autosize", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/react-transition-group", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/rimraf", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/semver", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/spark-md5", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/stringify-object", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/tar", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/tinycolor2", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/tough-cookie", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/unist", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/uuid", + "allowedCategories": [ "production" ] + }, + { + "name": "@types/validate-npm-package-name", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/watchpack", + "allowedCategories": [ "tools" ] + }, + { + "name": "@types/webpack-env", + "allowedCategories": [ "examples" ] + }, + { + "name": "@typescript-eslint/eslint-plugin", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@typescript-eslint/parser", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@typescript/native-preview", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "@vitejs/plugin-react", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "@vitejs/plugin-react-swc", + "allowedCategories": [ "examples" ] + }, + { + "name": "@vitest/eslint-plugin", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "@welldone-software/why-did-you-render", + "allowedCategories": [ "examples" ] + }, + { + "name": "ag-grid-community", + "allowedCategories": [ "production" ] + }, + { + "name": "ag-grid-enterprise", + "allowedCategories": [ "production" ] + }, + { + "name": "ag-grid-react", + "allowedCategories": [ "production" ] + }, + { + "name": "async", + "allowedCategories": [ "production" ] + }, + { + "name": "axios", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "axios-cache-interceptor", + "allowedCategories": [ "production" ] + }, + { + "name": "babel-loader", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "babel-plugin-lodash", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "babel-plugin-require-context-hook", + "allowedCategories": [ "production" ] + }, + { + "name": "blessed", + "allowedCategories": [ "tools" ] + }, + { + "name": "blob-polyfill", + "allowedCategories": [ "production" ] + }, + { + "name": "case-sensitive-paths-webpack-plugin", + "allowedCategories": [ "examples", "tools" ] + }, + { + "name": "chalk", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "chokidar", + "allowedCategories": [ "tools" ] + }, + { + "name": "circular-dependency-plugin", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "classnames", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "clean-webpack-plugin", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "codemirror", + "allowedCategories": [ "production" ] + }, + { + "name": "columnify", + "allowedCategories": [ "tools" ] + }, + { + "name": "commander", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "compression-webpack-plugin", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "concurrently", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "copy-to-clipboard", + "allowedCategories": [ "production" ] + }, + { + "name": "copy-webpack-plugin", + "allowedCategories": [ "production" ] + }, + { + "name": "core-js", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "cron-parser", + "allowedCategories": [ "production" ] + }, + { + "name": "cross-spawn", + "allowedCategories": [ "tools" ] + }, + { + "name": "css-loader", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "date-fns", + "allowedCategories": [ "production" ] + }, + { + "name": "date-fns-tz", + "allowedCategories": [ "production" ] + }, + { + "name": "debounce-promise", + "allowedCategories": [ "production" ] + }, + { + "name": "default-import", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "dependency-cruiser", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "dotenv", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "dotenv-webpack", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "downshift", + "allowedCategories": [ "production" ] + }, + { + "name": "esbuild-loader", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-import-resolver-typescript", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-chai-friendly", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "eslint-plugin-header", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-headers", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-import", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-import-esm", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-import-x", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-jsdoc", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-no-barrel-files", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-no-only-tests", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-playwright", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "eslint-plugin-react", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-react-hooks", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-regexp", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-sonarjs", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eslint-plugin-storybook", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "eslint-plugin-tsdoc", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "eventsource-parser", + "allowedCategories": [ "production" ] + }, + { + "name": "exponential-backoff", + "allowedCategories": [ "production" ] + }, + { + "name": "fast-equals", + "allowedCategories": [ "production" ] + }, + { + "name": "fast-glob", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "fast-levenshtein", + "allowedCategories": [ "production" ] + }, + { + "name": "fetch-cookie", + "allowedCategories": [ "production" ] + }, + { + "name": "fetch-mock", + "allowedCategories": [ "production" ] + }, + { + "name": "find-up", + "allowedCategories": [ "tools" ] + }, + { + "name": "fix-esm-import-path", + "allowedCategories": [ "production" ] + }, + { + "name": "fixed-data-table-2", + "allowedCategories": [ "production" ] + }, + { + "name": "fork-ts-checker-webpack-plugin", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "fs-extra", + "allowedCategories": [ "tools" ] + }, + { + "name": "full-icu", + "allowedCategories": [ "production" ] + }, + { + "name": "glob", + "allowedCategories": [ "production" ] + }, + { + "name": "globals", + "allowedCategories": [ "tools" ] + }, + { + "name": "happy-dom", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "highcharts", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "highcharts-react-official", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "history", + "allowedCategories": [ "examples" ] + }, + { + "name": "hoist-non-react-statics", + "allowedCategories": [ "production" ] + }, + { + "name": "html-validate", + "allowedCategories": [ "tools" ] + }, + { + "name": "html-webpack-plugin", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "http-status-codes", + "allowedCategories": [ "production" ] + }, + { + "name": "immer", + "allowedCategories": [ "production" ] + }, + { + "name": "inquirer", + "allowedCategories": [ "tools" ] + }, + { + "name": "isomorphic-fetch", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "jiti", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "js-object-pretty-print", + "allowedCategories": [ "production" ] + }, + { + "name": "js-yaml", + "allowedCategories": [ "production" ] + }, + { + "name": "jsdom", + "allowedCategories": [ "production" ] + }, + { + "name": "json-loader", + "allowedCategories": [ "production" ] + }, + { + "name": "json-schema-to-typescript", + "allowedCategories": [ "production" ] + }, + { + "name": "json-stable-stringify", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "json5", + "allowedCategories": [ "tools" ] + }, + { + "name": "jsonschema", + "allowedCategories": [ "tools" ] + }, + { + "name": "kefir", + "allowedCategories": [ "production" ] + }, + { + "name": "lodash-es", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "lru-cache", + "allowedCategories": [ "production" ] + }, + { + "name": "lz-string", + "allowedCategories": [ "production" ] + }, + { + "name": "mapbox-gl", + "allowedCategories": [ "production" ] + }, + { + "name": "maplibre-gl", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "mdast", + "allowedCategories": [ "production" ] + }, + { + "name": "mini-css-extract-plugin", + "allowedCategories": [ "production" ] + }, + { + "name": "mkdirp", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "mocha", + "allowedCategories": [ "production" ] + }, + { + "name": "mocha-junit-reporter", + "allowedCategories": [ "production" ] + }, + { + "name": "moment", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "moment-timezone", + "allowedCategories": [ "production" ] + }, + { + "name": "node-fetch", + "allowedCategories": [ "production" ] + }, + { + "name": "node-xlsx", + "allowedCategories": [ "production" ] + }, + { + "name": "npm-run-all", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "open", + "allowedCategories": [ "tools" ] + }, + { + "name": "ora", + "allowedCategories": [ "tools" ] + }, + { + "name": "oxfmt", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "oxlint", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "oxlint-tsgolint", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "p-map", + "allowedCategories": [ "tools" ] + }, + { + "name": "pdf-parse", + "allowedCategories": [ "production" ] + }, + { + "name": "polished", + "allowedCategories": [ "production" ] + }, + { + "name": "postcss", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "postcss-scss", + "allowedCategories": [ "tools" ] + }, + { + "name": "postcss-value-parser", + "allowedCategories": [ "production" ] + }, + { + "name": "prettier", + "allowedCategories": [ "production" ] + }, + { + "name": "process", + "allowedCategories": [ "examples", "tools" ] + }, + { + "name": "qs", + "allowedCategories": [ "production" ] + }, + { + "name": "raf", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "react", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "react-content-loader", + "allowedCategories": [ "production" ] + }, + { + "name": "react-datepicker", + "allowedCategories": [ "examples" ] + }, + { + "name": "react-day-picker", + "allowedCategories": [ "production" ] + }, + { + "name": "react-dnd", + "allowedCategories": [ "production" ] + }, + { + "name": "react-dnd-html5-backend", + "allowedCategories": [ "production" ] + }, + { + "name": "react-dom", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "react-fast-compare", + "allowedCategories": [ "production" ] + }, + { + "name": "react-ga", + "allowedCategories": [ "examples" ] + }, + { + "name": "react-google-recaptcha", + "allowedCategories": [ "examples" ] + }, + { + "name": "react-grid-system", + "allowedCategories": [ "production" ] + }, + { + "name": "react-helmet", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "react-intl", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "react-lines-ellipsis", + "allowedCategories": [ "production" ] + }, + { + "name": "react-loading-skeleton", + "allowedCategories": [ "production" ] + }, + { + "name": "react-markdown", + "allowedCategories": [ "production" ] + }, + { + "name": "react-measure", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "react-native-listener", + "allowedCategories": [ "production" ] + }, + { + "name": "react-portal", + "allowedCategories": [ "production" ] + }, + { + "name": "react-redux", + "allowedCategories": [ "production" ] + }, + { + "name": "react-responsive", + "allowedCategories": [ "production" ] + }, + { + "name": "react-router-dom", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "react-select", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "react-select-async-paginate", + "allowedCategories": [ "production" ] + }, + { + "name": "react-syntax-highlighter", + "allowedCategories": [ "examples" ] + }, + { + "name": "react-textarea-autosize", + "allowedCategories": [ "production" ] + }, + { + "name": "react-transition-group", + "allowedCategories": [ "production" ] + }, + { + "name": "react-window", + "allowedCategories": [ "production" ] + }, + { + "name": "readdirp", + "allowedCategories": [ "production" ] + }, + { + "name": "recharts", + "allowedCategories": [ "examples" ] + }, + { + "name": "redux", + "allowedCategories": [ "production" ] + }, + { + "name": "redux-batched-actions", + "allowedCategories": [ "production" ] + }, + { + "name": "redux-saga", + "allowedCategories": [ "production" ] + }, + { + "name": "remark", + "allowedCategories": [ "production" ] + }, + { + "name": "remark-emoji", + "allowedCategories": [ "production" ] + }, + { + "name": "remark-gfm", + "allowedCategories": [ "production" ] + }, + { + "name": "require-from-string", + "allowedCategories": [ "production" ] + }, + { + "name": "reselect", + "allowedCategories": [ "production" ] + }, + { + "name": "rolldown", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "rollup", + "allowedCategories": [ "production" ] + }, + { + "name": "sass", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "sass-loader", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "semver", + "allowedCategories": [ "production" ] + }, + { + "name": "source-map-loader", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "spark-md5", + "allowedCategories": [ "production" ] + }, + { + "name": "speed-measure-webpack-plugin", + "allowedCategories": [ "examples" ] + }, + { + "name": "storybook", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "stringify-object", + "allowedCategories": [ "production" ] + }, + { + "name": "strip-ansi", + "allowedCategories": [ "tools" ] + }, + { + "name": "style-loader", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "styled-jsx", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "stylelint", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "stylelint-config-standard", + "allowedCategories": [ "tools" ] + }, + { + "name": "stylelint-order", + "allowedCategories": [ "tools" ] + }, + { + "name": "stylelint-plugin-defensive-css", + "allowedCategories": [ "tools" ] + }, + { + "name": "stylelint-scss", + "allowedCategories": [ "tools" ] + }, + { + "name": "svgo", + "allowedCategories": [ "production" ] + }, + { + "name": "tar", + "allowedCategories": [ "tools" ] + }, + { + "name": "tinycolor2", + "allowedCategories": [ "production" ] + }, + { + "name": "ts-invariant", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "ts-loader", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "ts-morph", + "allowedCategories": [ "tools" ] + }, + { + "name": "tsd", + "allowedCategories": [ "production" ] + }, + { + "name": "tslib", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "typescript", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "unified", + "allowedCategories": [ "production" ] + }, + { + "name": "util", + "allowedCategories": [ "examples", "tools" ] + }, + { + "name": "uuid", + "allowedCategories": [ "production" ] + }, + { + "name": "validate-npm-package-name", + "allowedCategories": [ "examples", "tools" ] + }, + { + "name": "vite", + "allowedCategories": [ "examples", "production" ] + }, + { + "name": "vite-node", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "vite-plugin-css-injected-by-js", + "allowedCategories": [ "production" ] + }, + { + "name": "vite-plugin-environment", + "allowedCategories": [ "production" ] + }, + { + "name": "vite-plugin-html", + "allowedCategories": [ "examples" ] + }, + { + "name": "vite-plugin-mkcert", + "allowedCategories": [ "examples" ] + }, + { + "name": "vite-plugin-static-copy", + "allowedCategories": [ "production" ] + }, + { + "name": "vitest", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "vitest-dom", + "allowedCategories": [ "production" ] + }, + { + "name": "wait-on", + "allowedCategories": [ "production" ] + }, + { + "name": "watchpack", + "allowedCategories": [ "tools" ] + }, + { + "name": "webpack", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "webpack-bundle-analyzer", + "allowedCategories": [ "production", "tools" ] + }, + { + "name": "webpack-cli", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "webpack-dev-server", + "allowedCategories": [ "examples", "production", "tools" ] + }, + { + "name": "xml2js", + "allowedCategories": [ "production" ] + }, + { + "name": "yaml", + "allowedCategories": [ "production" ] + }, + { + "name": "zod", + "allowedCategories": [ "production" ] + } + ] +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index b4a4665422e..c3cb3fad5a4 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -8,7 +8,7 @@ importers: .: {} - ../../../sdk/examples/playground: + ../../examples/playground: devDependencies: '@codemirror/state': specifier: 6.5.3 @@ -167,13 +167,13 @@ importers: specifier: 8.0.0 version: 8.0.0(@types/node@24.12.0)(sass@1.70.0) - ../../../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:* @@ -309,7 +309,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-attributefilter: + ../../examples/sdk-interactive-examples/examples/example-attributefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -445,7 +445,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-chartconfig: + ../../examples/sdk-interactive-examples/examples/example-chartconfig: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -581,7 +581,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-columnchart: + ../../examples/sdk-interactive-examples/examples/example-columnchart: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -717,7 +717,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-combochart: + ../../examples/sdk-interactive-examples/examples/example-combochart: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -853,7 +853,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-dashboard: + ../../examples/sdk-interactive-examples/examples/example-dashboard: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -989,7 +989,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-datefilter: + ../../examples/sdk-interactive-examples/examples/example-datefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1125,7 +1125,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-dependentfilters: + ../../examples/sdk-interactive-examples/examples/example-dependentfilters: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1261,7 +1261,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-execute: + ../../examples/sdk-interactive-examples/examples/example-execute: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1406,7 +1406,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-granularity: + ../../examples/sdk-interactive-examples/examples/example-granularity: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1542,7 +1542,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-headline: + ../../examples/sdk-interactive-examples/examples/example-headline: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1678,7 +1678,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-pivottable: + ../../examples/sdk-interactive-examples/examples/example-pivottable: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1814,7 +1814,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-relativedatefilter: + ../../examples/sdk-interactive-examples/examples/example-relativedatefilter: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -1950,7 +1950,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/examples/sdk-interactive-examples/examples/example-repeater: + ../../examples/sdk-interactive-examples/examples/example-repeater: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -2086,7 +2086,7 @@ importers: specifier: ~3.2.0 version: 3.2.2(vite@8.0.0) - ../../../sdk/libs/api-client-tiger: + ../../libs/api-client-tiger: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2189,7 +2189,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../../sdk/libs/sdk-backend-base: + ../../libs/sdk-backend-base: dependencies: '@braintree/sanitize-url': specifier: ^6.0.0 @@ -2301,7 +2301,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../../sdk/libs/sdk-backend-mockingbird: + ../../libs/sdk-backend-mockingbird: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -2401,7 +2401,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../../sdk/libs/sdk-backend-spi: + ../../libs/sdk-backend-spi: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2486,7 +2486,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../../sdk/libs/sdk-backend-tiger: + ../../libs/sdk-backend-tiger: dependencies: '@gooddata/api-client-tiger': specifier: workspace:* @@ -2628,7 +2628,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../../sdk/libs/sdk-code-convertors: + ../../libs/sdk-code-convertors: dependencies: '@gooddata/api-client-tiger': specifier: workspace:* @@ -2710,7 +2710,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0)(yaml@2.8.3) - ../../../sdk/libs/sdk-code-schemas: + ../../libs/sdk-code-schemas: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -2788,7 +2788,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../../sdk/libs/sdk-e2e-utils: + ../../libs/sdk-e2e-utils: dependencies: '@playwright/test': specifier: 1.59.1 @@ -2876,7 +2876,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/libs/sdk-embedding: + ../../libs/sdk-embedding: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -2961,7 +2961,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../../sdk/libs/sdk-model: + ../../libs/sdk-model: dependencies: '@types/geojson': specifier: ^7946.0.16 @@ -3061,7 +3061,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../../sdk/libs/sdk-pluggable-application-model: + ../../libs/sdk-pluggable-application-model: dependencies: '@gooddata/sdk-model': specifier: workspace:* @@ -3143,7 +3143,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/libs/sdk-ui: + ../../libs/sdk-ui: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -3330,7 +3330,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-all: + ../../libs/sdk-ui-all: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -3427,7 +3427,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/libs/sdk-ui-catalog: + ../../libs/sdk-ui-catalog: dependencies: '@babel/core': specifier: 7.28.4 @@ -3623,7 +3623,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-charts: + ../../libs/sdk-ui-charts: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -3846,7 +3846,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-dashboard: + ../../libs/sdk-ui-dashboard: dependencies: '@codemirror/language': specifier: 6.12.1 @@ -4114,7 +4114,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-ext: + ../../libs/sdk-ui-ext: dependencies: '@codemirror/commands': specifier: 6.10.1 @@ -4397,7 +4397,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-filters: + ../../libs/sdk-ui-filters: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -4599,7 +4599,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-gen-ai: + ../../libs/sdk-ui-gen-ai: dependencies: '@codemirror/autocomplete': specifier: 6.20.0 @@ -4846,7 +4846,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-geo: + ../../libs/sdk-ui-geo: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -5033,7 +5033,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-kit: + ../../libs/sdk-ui-kit: dependencies: '@aaronhayes/react-use-hubspot-form': specifier: 2.1.2 @@ -5325,7 +5325,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-loaders: + ../../libs/sdk-ui-loaders: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -5458,7 +5458,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 @@ -5648,7 +5648,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-pluggable-application: + ../../libs/sdk-ui-pluggable-application: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -5772,7 +5772,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/libs/sdk-ui-semantic-search: + ../../libs/sdk-ui-semantic-search: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -5932,7 +5932,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-tests-app: + ../../libs/sdk-ui-tests-app: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6067,7 +6067,7 @@ importers: specifier: 8.0.0 version: 8.0.0(@types/node@24.12.0)(sass@1.70.0) - ../../../sdk/libs/sdk-ui-tests-e2e: + ../../libs/sdk-ui-tests-e2e: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6166,7 +6166,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:* @@ -6232,7 +6232,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:* @@ -6394,7 +6394,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/libs/sdk-ui-tests-storybook: + ../../libs/sdk-ui-tests-storybook: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -6622,7 +6622,7 @@ importers: specifier: 3.1.2 version: 3.1.2(vite@8.0.0) - ../../../sdk/libs/sdk-ui-theme-provider: + ../../libs/sdk-ui-theme-provider: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -6779,7 +6779,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/libs/sdk-ui-vis-commons: + ../../libs/sdk-ui-vis-commons: dependencies: '@gooddata/number-formatter': specifier: ^1.0.6 @@ -6948,7 +6948,7 @@ importers: specifier: 0.1.1 version: 0.1.1(vitest@4.1.0) - ../../../sdk/libs/sdk-ui-web-components: + ../../libs/sdk-ui-web-components: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -7117,7 +7117,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/libs/util: + ../../libs/util: dependencies: lodash-es: specifier: ^4.17.23 @@ -7199,7 +7199,7 @@ importers: specifier: 4.1.0 version: 4.1.0(happy-dom@18.0.1)(sass@1.70.0) - ../../../sdk/tools/app-toolkit: + ../../tools/app-toolkit: dependencies: '@babel/cli': specifier: ^7.23.4 @@ -7356,7 +7356,7 @@ importers: specifier: 5.93.0 version: 5.93.0(webpack-cli@6.0.1) - ../../../sdk/tools/applink: + ../../tools/applink: devDependencies: '@gooddata/eslint-config': specifier: workspace:* @@ -7461,7 +7461,7 @@ importers: specifier: ^2.4.4 version: 2.4.4 - ../../../sdk/tools/catalog-export: + ../../tools/catalog-export: dependencies: '@babel/core': specifier: 7.28.4 @@ -7585,7 +7585,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/tools/dashboard-plugin-template: + ../../tools/dashboard-plugin-template: dependencies: json-stable-stringify: specifier: 1.3.0 @@ -7781,7 +7781,7 @@ importers: specifier: 5.2.2 version: 5.2.2(webpack-cli@6.0.1)(webpack@5.93.0) - ../../../sdk/tools/eslint-config: + ../../tools/eslint-config: devDependencies: '@eslint/js': specifier: 9.28.0 @@ -7874,7 +7874,7 @@ importers: specifier: ^5.2.0 version: 5.2.0(@types/node@24.12.0)(jiti@2.6.1) - ../../../sdk/tools/i18n-toolkit: + ../../tools/i18n-toolkit: dependencies: '@formatjs/cli-lib': specifier: ^6.1.1 @@ -7983,7 +7983,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/tools/lint-config: + ../../tools/lint-config: devDependencies: '@typescript/native-preview': specifier: 7.0.0-dev.20260202.1 @@ -7998,7 +7998,7 @@ importers: specifier: 5.9.3 version: 5.9.3 - ../../../sdk/tools/mock-handling: + ../../tools/mock-handling: dependencies: '@gooddata/sdk-backend-base': specifier: workspace:* @@ -8107,7 +8107,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/tools/oxlint-config: + ../../tools/oxlint-config: devDependencies: '@eslint/js': specifier: 9.28.0 @@ -8185,7 +8185,7 @@ importers: specifier: ^5.2.0 version: 5.2.0(@types/node@24.12.0)(jiti@2.6.1) - ../../../sdk/tools/plugin-toolkit: + ../../tools/plugin-toolkit: dependencies: '@babel/cli': specifier: ^7.23.4 @@ -8333,7 +8333,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/tools/react-app-template: + ../../tools/react-app-template: dependencies: '@codemirror/state': specifier: 6.5.3 @@ -8496,7 +8496,7 @@ importers: specifier: 5.2.2 version: 5.2.2(webpack-cli@6.0.1)(webpack@5.93.0) - ../../../sdk/tools/reference-workspace: + ../../tools/reference-workspace: dependencies: '@gooddata/sdk-backend-spi': specifier: workspace:* @@ -8572,7 +8572,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:* @@ -8654,7 +8654,7 @@ importers: specifier: 4.1.0 version: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) - ../../../sdk/tools/stylelint-config: + ../../tools/stylelint-config: dependencies: postcss: specifier: 8.5.6 @@ -8786,7 +8786,7 @@ packages: resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 /@babel/helper-compilation-targets@7.28.6: resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} @@ -8810,7 +8810,7 @@ packages: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -8853,15 +8853,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-imports@7.27.1: - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - /@babel/helper-module-imports@7.28.6: resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} @@ -8871,19 +8862,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4): - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 - transitivePeerDependencies: - - supports-color - /@babel/helper-module-transforms@7.28.6(@babel/core@7.28.4): resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} @@ -8943,7 +8921,7 @@ packages: '@babel/core': 7.28.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -8951,8 +8929,8 @@ packages: resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -8960,10 +8938,6 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.27.1: - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.28.5: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -9481,7 +9455,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -9690,10 +9664,10 @@ packages: dependencies: '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color dev: true @@ -10000,20 +9974,6 @@ packages: '@babel/parser': 7.29.0 '@babel/types': 7.29.0 - /@babel/traverse@7.28.4: - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.0 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - /@babel/traverse@7.29.0: resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} @@ -10028,13 +9988,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types@7.28.4: - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - /@babel/types@7.29.0: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -10161,13 +10114,13 @@ packages: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - /@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0): + /@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.1): resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} engines: {node: '>=18'} peerDependencies: postcss-selector-parser: ^7.0.0 dependencies: - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 /@dagrejs/dagre@1.1.8: resolution: {integrity: sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw==} @@ -11588,7 +11541,7 @@ packages: /@nestjs/axios@4.0.1(@nestjs/common@11.1.6)(axios@1.12.2)(rxjs@7.8.2): resolution: {integrity: sha512-68pFJgu+/AZbWkGu65Z3r55bTsCPlgyKaV4BSG8yUAD72q1PPuyVRgUwFv6BxdnibTUHlyxm06FmYWNC+bjN7A==} peerDependencies: - '@nestjs/common': ^10.0.0 || ^11.0.0 + '@nestjs/common': ^10.0.0 || ^11.0.0 || 9.3.11 axios: ^1.3.1 rxjs: ^7.0.0 dependencies: @@ -11626,7 +11579,7 @@ packages: engines: {node: '>= 20'} requiresBuild: true peerDependencies: - '@nestjs/common': ^11.0.0 + '@nestjs/common': ^11.0.0 || 9.3.11 '@nestjs/microservices': ^11.0.0 '@nestjs/platform-express': ^11.0.0 '@nestjs/websockets': ^11.0.0 @@ -12143,7 +12096,7 @@ packages: react-redux: optional: true dependencies: - '@standard-schema/spec': 1.0.0 + '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 immer: 10.1.1 react: 19.1.1 @@ -12300,7 +12253,7 @@ packages: dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.4 dev: true /@rollup/rollup-android-arm-eabi@4.54.0: @@ -12612,10 +12565,6 @@ packages: engines: {node: '>=10'} dev: false - /@standard-schema/spec@1.0.0: - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - dev: false - /@standard-schema/spec@1.1.0: resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -12657,7 +12606,7 @@ packages: dependencies: '@storybook/codemod': 10.1.11(@testing-library/dom@10.4.1)(react-dom@19.1.1)(react@19.1.1) '@types/semver': 7.3.13 - commander: 14.0.2 + commander: 14.0.3 create-storybook: 10.1.11(@testing-library/dom@10.4.1)(react-dom@19.1.1)(react@19.1.1) jscodeshift: 0.15.2 storybook: 10.1.11(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.1.1)(react@19.1.1) @@ -13426,20 +13375,6 @@ packages: - supports-color dev: true - /@typescript-eslint/project-service@8.52.0(typescript@5.9.3): - resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - dependencies: - '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) - '@typescript-eslint/types': 8.53.0 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/project-service@8.58.0(typescript@5.9.3): resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13454,14 +13389,6 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@8.52.0: - resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/visitor-keys': 8.52.0 - dev: true - /@typescript-eslint/scope-manager@8.58.0: resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13470,15 +13397,6 @@ packages: '@typescript-eslint/visitor-keys': 8.58.0 dev: true - /@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3): - resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - dependencies: - typescript: 5.9.3 - dev: true - /@typescript-eslint/tsconfig-utils@8.58.0(typescript@5.9.3): resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13506,41 +13424,11 @@ packages: - supports-color dev: true - /@typescript-eslint/types@8.52.0: - resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - - /@typescript-eslint/types@8.53.0: - resolution: {integrity: sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - /@typescript-eslint/types@8.58.0: resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3): - resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - dependencies: - '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/visitor-keys': 8.52.0 - debug: 4.4.3 - minimatch: 10.1.2 - semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@8.58.0(typescript@5.9.3): resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13561,23 +13449,6 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@8.52.0(eslint@9.39.2)(typescript@5.9.3): - resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) - '@typescript-eslint/scope-manager': 8.52.0 - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/utils@8.58.0(eslint@9.39.2)(typescript@5.9.3): resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13595,14 +13466,6 @@ packages: - supports-color dev: true - /@typescript-eslint/visitor-keys@8.52.0: - resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@typescript-eslint/types': 8.52.0 - eslint-visitor-keys: 4.2.1 - dev: true - /@typescript-eslint/visitor-keys@8.58.0: resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13682,6 +13545,7 @@ packages: /@ungap/structured-clone@1.3.0: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher dev: false /@unrs/resolver-binding-android-arm-eabi@1.11.1: @@ -13868,8 +13732,8 @@ packages: vitest: optional: true dependencies: - '@typescript-eslint/scope-manager': 8.52.0 - '@typescript-eslint/utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/utils': 8.58.0(eslint@9.39.2)(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 vitest: 4.1.0(@types/node@24.12.0)(happy-dom@18.0.1) @@ -14084,6 +13948,9 @@ packages: peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x + peerDependenciesMeta: + webpack: + optional: true dependencies: webpack: 5.93.0(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.93.0) @@ -14094,6 +13961,9 @@ packages: peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x + peerDependenciesMeta: + webpack: + optional: true dependencies: webpack: 5.93.0(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.93.0) @@ -14106,6 +13976,8 @@ packages: webpack-cli: 6.x.x webpack-dev-server: '*' peerDependenciesMeta: + webpack: + optional: true webpack-dev-server: optional: true dependencies: @@ -14126,25 +13998,17 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-import-attributes@1.9.5(acorn@8.15.0): + /acorn-import-attributes@1.9.5(acorn@8.16.0): resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.15.0 + acorn: 8.16.0 /acorn-jsx-walk@2.0.0: resolution: {integrity: sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==} dev: true - /acorn-jsx@5.3.2(acorn@8.15.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.15.0 - dev: true - /acorn-jsx@5.3.2(acorn@8.16.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -14160,29 +14024,16 @@ packages: acorn: 8.16.0 dev: true - /acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - dependencies: - acorn: 8.15.0 - /acorn-walk@8.3.5: resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} dependencies: acorn: 8.16.0 - dev: true - - /acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true /acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /ag-charts-community@13.1.0: resolution: {integrity: sha512-w+uFTjxlAoTq1+8tgUORtB/zr9jm38ibXzbbWnkBP9Dep9yahi5a1jZL7yExAX35uq3g9QtjTh0Oj/QPDBQ9Ew==} @@ -14627,6 +14478,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' + peerDependenciesMeta: + webpack: + optional: true dependencies: '@babel/core': 7.28.4 find-cache-dir: 3.3.2 @@ -14696,6 +14550,7 @@ packages: /basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.1, please upgrade dev: true /batch@0.6.1: @@ -15104,11 +14959,6 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - /commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - dev: true - /commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -15775,16 +15625,14 @@ packages: engines: {node: '>=10'} peerDependencies: webpack: ^4 || ^5 + peerDependenciesMeta: + webpack: + optional: true dependencies: dotenv-defaults: 2.0.2 webpack: 5.93.0(webpack-cli@6.0.1) dev: true - /dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: true - /dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -15897,20 +15745,12 @@ packages: tapable: 1.1.3 dev: true - /enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.3 - /enhanced-resolve@5.20.1: resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.3.2 - dev: true /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -16112,6 +15952,9 @@ packages: resolution: {integrity: sha512-D7HeJNdkDKKMarPQO/3dlJT6RwN2YJO7ENU6RPlpOz5YxSHnUNi2yvW41Bckvi1EVwctIaLzlb0ni5ag2GINYA==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true dependencies: esbuild: 0.25.9 get-tsconfig: 4.10.1 @@ -16455,7 +16298,7 @@ packages: eslint: '>=8' storybook: ^10.1.11 dependencies: - '@typescript-eslint/utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.2)(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) storybook: 10.1.11(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.1.1)(react@19.1.1) transitivePeerDependencies: @@ -16567,8 +16410,8 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 dev: true @@ -16758,7 +16601,7 @@ packages: pend: 1.2.0 dev: true - /fdir@6.5.0(picomatch@4.0.3): + /fdir@6.5.0(picomatch@4.0.4): resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -16767,7 +16610,7 @@ packages: picomatch: optional: true dependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 /fetch-cookie@0.7.3: resolution: {integrity: sha512-rZPkLnI8x5V+zYAiz8QonAHsTb4BY+iFowFBI1RFn0zrO343AVp9X7/yUj/9wL6Ef/8fLls8b/vGtzUvmyAUGA==} @@ -17177,6 +17020,7 @@ packages: /glob@11.0.3: resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true dependencies: foreground-child: 3.3.1 @@ -17519,7 +17363,7 @@ packages: html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 - tapable: 2.2.3 + tapable: 2.3.2 webpack: 5.93.0(webpack-cli@6.0.1) dev: true @@ -20016,14 +19860,9 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - /picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - dev: true /pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} @@ -20155,13 +19994,6 @@ packages: postcss: 8.5.6 dev: false - /postcss-selector-parser@7.1.0: - resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - /postcss-selector-parser@7.1.1: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} @@ -20741,6 +20573,9 @@ packages: resolution: {integrity: sha512-6orZWyCnIQXMGY4DUGM0oj0L7oYnwTACsfsru/J7r94RM3P9eS7SORGpr3LCeRCMoIMQcpfKZ7X4NdyFHBS8Eg==} peerDependencies: redux: '>=1.0.0' + peerDependenciesMeta: + redux: + optional: true dependencies: redux: 5.0.1 dev: false @@ -20755,6 +20590,9 @@ packages: resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} peerDependencies: redux: ^5.0.0 + peerDependenciesMeta: + redux: + optional: true dependencies: redux: 5.0.1 dev: false @@ -21489,6 +21327,9 @@ packages: engines: {node: '>= 14.15.0'} peerDependencies: webpack: ^5.72.1 + peerDependenciesMeta: + webpack: + optional: true dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 @@ -21621,7 +21462,7 @@ packages: '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 - esbuild: 0.25.9 + esbuild: 0.27.2 open: 10.2.0 prettier: 3.6.2 recast: 0.23.11 @@ -21796,6 +21637,9 @@ packages: engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true dependencies: webpack: 5.93.0(webpack-cli@6.0.1) dev: true @@ -21878,7 +21722,7 @@ packages: '@csstools/css-syntax-patches-for-csstree': 1.0.26 '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) '@dual-bundle/import-meta-resolve': 4.2.1 balanced-match: 2.0.0 colord: 2.9.3 @@ -21905,7 +21749,7 @@ packages: postcss: 8.5.6 postcss-resolve-nested-selector: 0.1.6 postcss-safe-parser: 7.0.1(postcss@8.5.6) - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 string-width: 4.2.3 @@ -22000,14 +21844,9 @@ packages: engines: {node: '>=6'} dev: true - /tapable@2.2.3: - resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} - engines: {node: '>=6'} - /tapable@2.3.2: resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} - dev: true /tar-stream@1.6.2: resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} @@ -22025,6 +21864,7 @@ packages: /tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -22056,6 +21896,8 @@ packages: optional: true uglify-js: optional: true + webpack: + optional: true dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 @@ -22070,7 +21912,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -22133,8 +21975,8 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 /tinypool@2.1.0: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} @@ -22249,15 +22091,6 @@ packages: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: false - /ts-api-utils@2.4.0(typescript@5.9.3): - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - dependencies: - typescript: 5.9.3 - dev: true - /ts-api-utils@2.5.0(typescript@5.9.3): resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -22290,6 +22123,9 @@ packages: peerDependencies: typescript: '*' webpack: '*' + peerDependenciesMeta: + webpack: + optional: true dependencies: chalk: 4.1.2 enhanced-resolve: 4.5.0 @@ -22313,7 +22149,7 @@ packages: dependencies: chalk: 4.1.2 enhanced-resolve: 5.20.1 - tapable: 2.2.3 + tapable: 2.3.2 tsconfig-paths: 4.2.0 dev: true @@ -22566,8 +22402,8 @@ packages: engines: {node: '>=18.12.0'} dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 - picomatch: 4.0.3 + acorn: 8.16.0 + picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 dev: true @@ -22694,6 +22530,7 @@ packages: /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true /validate-npm-package-license@3.0.4: @@ -22774,7 +22611,7 @@ packages: colorette: 2.0.20 connect-history-api-fallback: 1.6.0 consola: 2.15.3 - dotenv: 16.0.3 + dotenv: 16.4.5 dotenv-expand: 8.0.3 ejs: 3.1.10 fast-glob: 3.3.3 @@ -22841,9 +22678,9 @@ packages: dependencies: '@types/node': 24.12.0 esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.4) jiti: 2.6.1 - picomatch: 4.0.3 + picomatch: 4.0.4 postcss: 8.5.6 rollup: 4.54.0 tinyglobby: 0.2.15 @@ -22897,7 +22734,7 @@ packages: '@oxc-project/runtime': 0.115.0 '@types/node': 24.12.0 lightningcss: 1.32.0 - picomatch: 4.0.3 + picomatch: 4.0.4 postcss: 8.5.8 rolldown: 1.0.0-rc.9 sass: 1.70.0 @@ -22950,7 +22787,7 @@ packages: dependencies: '@oxc-project/runtime': 0.115.0 lightningcss: 1.32.0 - picomatch: 4.0.3 + picomatch: 4.0.4 postcss: 8.5.8 rolldown: 1.0.0-rc.9 sass: 1.70.0 @@ -23022,7 +22859,7 @@ packages: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 @@ -23092,7 +22929,7 @@ packages: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 @@ -23162,7 +22999,7 @@ packages: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 @@ -23232,7 +23069,7 @@ packages: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 @@ -23303,8 +23140,8 @@ packages: hasBin: true dependencies: '@discoveryjs/json-ext': 0.5.7 - acorn: 8.15.0 - acorn-walk: 8.3.4 + acorn: 8.16.0 + acorn-walk: 8.3.5 commander: 7.2.0 debounce: 1.2.1 escape-string-regexp: 4.0.0 @@ -23327,6 +23164,8 @@ packages: webpack-bundle-analyzer: '*' webpack-dev-server: '*' peerDependenciesMeta: + webpack: + optional: true webpack-bundle-analyzer: optional: true webpack-dev-server: @@ -23453,11 +23292,11 @@ packages: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.20.1 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -23468,7 +23307,7 @@ packages: mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 3.3.0 - tapable: 2.2.3 + tapable: 2.3.2 terser-webpack-plugin: 5.3.14(webpack@5.93.0) watchpack: 2.4.4 webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.93.0)