diff --git a/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_extra_actions.tsx b/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_extra_actions.tsx index e7cdba71008f9a..fa9d09d7a6af04 100644 --- a/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_extra_actions.tsx +++ b/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_extra_actions.tsx @@ -8,11 +8,11 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import React, { useCallback, Dispatch, useContext } from 'react'; import { EuiFlexGroup, EuiButtonEmpty, EuiFlexItem } from '@elastic/eui'; import { DistributeEquallyIcon } from '../assets/distribute_equally'; -import { TooltipWrapper } from '../tooltip_wrapper'; import type { ColorRangesActions } from './types'; import { ColorRangesContext } from './color_ranges_context'; diff --git a/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_item_buttons.tsx b/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_item_buttons.tsx index 5cd9bb50bafb19..658d93aebdde3e 100644 --- a/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_item_buttons.tsx +++ b/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_item_buttons.tsx @@ -10,11 +10,11 @@ import React, { Dispatch, useCallback, useContext } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonIcon, EuiIconProps } from '@elastic/eui'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { PaletteContinuity, CustomPaletteParams } from '../../../palettes'; import { isLastItem } from './utils'; -import { TooltipWrapper } from '../tooltip_wrapper'; import type { ColorRangesActions, ColorRange, ColorRangeAccessor } from './types'; import { ColorRangesContext } from './color_ranges_context'; diff --git a/packages/kbn-coloring/tsconfig.json b/packages/kbn-coloring/tsconfig.json index 315e59225601ca..3a97faa1b9d3af 100644 --- a/packages/kbn-coloring/tsconfig.json +++ b/packages/kbn-coloring/tsconfig.json @@ -22,6 +22,7 @@ "@kbn/test-jest-helpers", "@kbn/data-plugin", "@kbn/ui-theme", + "@kbn/visualization-utils", ], "exclude": [ "target/**/*", diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx index adcff950575e3b..04e79334cf219f 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx @@ -22,6 +22,7 @@ import { getAggregateQueryMode, getLanguageDisplayName } from '@kbn/es-query'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; import type { IndexManagementPluginSetup } from '@kbn/index-management-plugin/public'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { type LanguageDocumentationSections, LanguageDocumentationPopover, @@ -172,7 +173,6 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const [showLineNumbers, setShowLineNumbers] = useState(isCodeEditorExpanded); const [isCompactFocused, setIsCompactFocused] = useState(isCodeEditorExpanded); const [isCodeEditorExpandedFocused, setIsCodeEditorExpandedFocused] = useState(false); - const [isWordWrapped, setIsWordWrapped] = useState(false); const [editorMessages, setEditorMessages] = useState<{ errors: MonacoMessage[]; @@ -478,15 +478,14 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } }, [calculateVisibleCode, code, isCompactFocused, queryString]); - useEffect(() => { - if (isCodeEditorExpanded && !isWordWrapped) { - const pipes = code?.split('|'); - const pipesWithNewLine = code?.split('\n|'); - if (pipes?.length === pipesWithNewLine?.length) { - setIsWordWrapped(true); - } - } - }, [code, isCodeEditorExpanded, isWordWrapped]); + const linesBreaksButtonsStatus = useMemo(() => { + const pipes = code?.split('|'); + const pipesWithNewLine = code?.split('\n|'); + return { + addLineBreaksDisabled: pipes?.length === pipesWithNewLine?.length, + removeLineBreaksDisabled: pipesWithNewLine?.length === 1, + }; + }, [code]); const onResize = ({ width }: { width: number }) => { setIsSpaceReduced(Boolean(editorIsInline && width < BREAKPOINT_WIDTH)); @@ -499,7 +498,6 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const onQueryUpdate = useCallback( (value: string) => { setCode(value); - setIsWordWrapped(false); onTextLangQueryChange({ [language]: value } as AggregateQuery); }, [language, onTextLangQueryChange] @@ -561,58 +559,72 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ responsive={false} > - + + + { + const updatedCode = getWrappedInPipesCode(code, false); + if (code !== updatedCode) { + setCode(updatedCode); + onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); + } + }} + /> + + + + + - { - editor1.current?.updateOptions({ - wordWrap: isWordWrapped ? 'off' : 'on', - }); - setIsWordWrapped(!isWordWrapped); - const updatedCode = getWrappedInPipesCode(code, isWordWrapped); - if (code !== updatedCode) { - setCode(updatedCode); - onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); - } - }} - /> - + )} + isDisabled={linesBreaksButtonsStatus.removeLineBreaksDisabled} + onClick={() => { + const updatedCode = getWrappedInPipesCode(code, true); + if (code !== updatedCode) { + setCode(updatedCode); + onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); + } + }} + /> + + + diff --git a/packages/kbn-text-based-editor/tsconfig.json b/packages/kbn-text-based-editor/tsconfig.json index 63222d0d6026bb..72240c8aa060d3 100644 --- a/packages/kbn-text-based-editor/tsconfig.json +++ b/packages/kbn-text-based-editor/tsconfig.json @@ -23,7 +23,8 @@ "@kbn/data-plugin", "@kbn/expressions-plugin", "@kbn/data-views-plugin", - "@kbn/index-management-plugin" + "@kbn/index-management-plugin", + "@kbn/visualization-utils" ], "exclude": [ "target/**/*", diff --git a/packages/kbn-visualization-ui-components/components/color_picker.tsx b/packages/kbn-visualization-ui-components/components/color_picker.tsx index 26a428bb17e0b9..3a2613d16d6658 100644 --- a/packages/kbn-visualization-ui-components/components/color_picker.tsx +++ b/packages/kbn-visualization-ui-components/components/color_picker.tsx @@ -8,6 +8,7 @@ import React, { useEffect, useRef, useState } from 'react'; import { i18n } from '@kbn/i18n'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { EuiFormRow, EuiColorPicker, @@ -17,7 +18,6 @@ import { euiPaletteColorBlind, } from '@elastic/eui'; import { getColorAlpha, makeColorWithAlpha } from '@kbn/coloring'; -import { TooltipWrapper } from './tooltip_wrapper'; const tooltipContent = { auto: i18n.translate('visualizationUiComponents.colorPicker.tooltip.auto', { diff --git a/packages/kbn-visualization-ui-components/components/drag_drop_bucket/default_bucket_container.tsx b/packages/kbn-visualization-ui-components/components/drag_drop_bucket/default_bucket_container.tsx index d73c46064a3ca6..0448e6bda33db8 100644 --- a/packages/kbn-visualization-ui-components/components/drag_drop_bucket/default_bucket_container.tsx +++ b/packages/kbn-visualization-ui-components/components/drag_drop_bucket/default_bucket_container.tsx @@ -16,7 +16,7 @@ import { EuiPanel, useEuiTheme, } from '@elastic/eui'; -import { TooltipWrapper } from '../tooltip_wrapper'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { BucketContainerProps } from './types'; export const DefaultBucketContainer = ({ diff --git a/packages/kbn-visualization-ui-components/components/drag_drop_bucket/fields_bucket_container.tsx b/packages/kbn-visualization-ui-components/components/drag_drop_bucket/fields_bucket_container.tsx index cfc5b074b6c335..89f771eef4f01d 100644 --- a/packages/kbn-visualization-ui-components/components/drag_drop_bucket/fields_bucket_container.tsx +++ b/packages/kbn-visualization-ui-components/components/drag_drop_bucket/fields_bucket_container.tsx @@ -16,7 +16,7 @@ import { EuiPanel, useEuiTheme, } from '@elastic/eui'; -import { TooltipWrapper } from '../tooltip_wrapper'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { BucketContainerProps } from './types'; export const FieldsBucketContainer = ({ diff --git a/packages/kbn-visualization-ui-components/components/index.ts b/packages/kbn-visualization-ui-components/components/index.ts index e20879f9e99902..88fecd132a8687 100644 --- a/packages/kbn-visualization-ui-components/components/index.ts +++ b/packages/kbn-visualization-ui-components/components/index.ts @@ -14,8 +14,6 @@ export * from './debounced_input'; export * from './debounced_value'; -export * from './tooltip_wrapper'; - export * from './color_picker'; export * from './icon_select'; diff --git a/packages/kbn-visualization-ui-components/index.ts b/packages/kbn-visualization-ui-components/index.ts index 16c51f96a869b4..34c14599d6f00f 100644 --- a/packages/kbn-visualization-ui-components/index.ts +++ b/packages/kbn-visualization-ui-components/index.ts @@ -11,7 +11,6 @@ export { NameInput, DebouncedInput, useDebouncedValue, - TooltipWrapper, ColorPicker, IconSelect, IconSelectSetting, diff --git a/packages/kbn-visualization-ui-components/tsconfig.json b/packages/kbn-visualization-ui-components/tsconfig.json index a9d6627828dc7e..e5dcfa9c5c8584 100644 --- a/packages/kbn-visualization-ui-components/tsconfig.json +++ b/packages/kbn-visualization-ui-components/tsconfig.json @@ -31,6 +31,7 @@ "@kbn/coloring", "@kbn/field-formats-plugin", "@kbn/field-utils", - "@kbn/calculate-width-from-char-count" + "@kbn/calculate-width-from-char-count", + "@kbn/visualization-utils" ], } diff --git a/packages/kbn-visualization-utils/index.ts b/packages/kbn-visualization-utils/index.ts index 7aa0a2c5d770c4..1665599e93d54f 100644 --- a/packages/kbn-visualization-utils/index.ts +++ b/packages/kbn-visualization-utils/index.ts @@ -7,3 +7,4 @@ */ export { getTimeZone } from './src/get_timezone'; +export { TooltipWrapper } from './src/tooltip_wrapper'; diff --git a/packages/kbn-visualization-ui-components/components/tooltip_wrapper.tsx b/packages/kbn-visualization-utils/src/tooltip_wrapper.tsx similarity index 100% rename from packages/kbn-visualization-ui-components/components/tooltip_wrapper.tsx rename to packages/kbn-visualization-utils/src/tooltip_wrapper.tsx diff --git a/x-pack/packages/kbn-random-sampling/src/ui/slider_control/index.tsx b/x-pack/packages/kbn-random-sampling/src/ui/slider_control/index.tsx index 1f7495e4312985..40a9256f9ba079 100644 --- a/x-pack/packages/kbn-random-sampling/src/ui/slider_control/index.tsx +++ b/x-pack/packages/kbn-random-sampling/src/ui/slider_control/index.tsx @@ -8,7 +8,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiRange, EuiText, useEuiTheme } from '@elastic/eui'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { TooltipWrapper } from './tooltip_wrapper'; +import { TooltipWrapper } from '@kbn/visualization-utils'; export interface ControlSliderProps { /** Allowed values to show on the Control Slider */ diff --git a/x-pack/packages/kbn-random-sampling/src/ui/slider_control/tooltip_wrapper.tsx b/x-pack/packages/kbn-random-sampling/src/ui/slider_control/tooltip_wrapper.tsx deleted file mode 100644 index 5ab7800e053494..00000000000000 --- a/x-pack/packages/kbn-random-sampling/src/ui/slider_control/tooltip_wrapper.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiToolTip, EuiToolTipProps } from '@elastic/eui'; - -export type TooltipWrapperProps = Partial> & { - tooltipContent: string; - /** When the condition is truthy, the tooltip will be shown */ - condition: boolean; -}; - -export const TooltipWrapper: React.FunctionComponent = ({ - children, - condition, - tooltipContent, - ...tooltipProps -}) => { - return ( - <> - {condition ? ( - - <>{children} - - ) : ( - children - )} - - ); -}; diff --git a/x-pack/packages/kbn-random-sampling/tsconfig.json b/x-pack/packages/kbn-random-sampling/tsconfig.json index 5c5673e4b67870..b4b34fcb94036e 100644 --- a/x-pack/packages/kbn-random-sampling/tsconfig.json +++ b/x-pack/packages/kbn-random-sampling/tsconfig.json @@ -13,6 +13,7 @@ ], "kbn_references": [ "@kbn/i18n-react", + "@kbn/visualization-utils", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/graph/public/components/search_bar.tsx b/x-pack/plugins/graph/public/components/search_bar.tsx index 101a2b3170f0b3..ad604ddc590914 100644 --- a/x-pack/plugins/graph/public/components/search_bar.tsx +++ b/x-pack/plugins/graph/public/components/search_bar.tsx @@ -12,6 +12,7 @@ import { i18n } from '@kbn/i18n'; import { connect } from 'react-redux'; import { toElasticsearchQuery, fromKueryExpression, Query } from '@kbn/es-query'; import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { QueryStringInput } from '@kbn/unified-search-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; import { IUnifiedSearchPluginServices } from '@kbn/unified-search-plugin/public/types'; @@ -27,8 +28,6 @@ import { selectedFieldsSelector, } from '../state_management'; -import { TooltipWrapper } from './tooltip_wrapper'; - export interface SearchBarProps { isLoading: boolean; urlQuery: string | null; diff --git a/x-pack/plugins/graph/public/components/tooltip_wrapper.tsx b/x-pack/plugins/graph/public/components/tooltip_wrapper.tsx deleted file mode 100644 index 5ab7800e053494..00000000000000 --- a/x-pack/plugins/graph/public/components/tooltip_wrapper.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiToolTip, EuiToolTipProps } from '@elastic/eui'; - -export type TooltipWrapperProps = Partial> & { - tooltipContent: string; - /** When the condition is truthy, the tooltip will be shown */ - condition: boolean; -}; - -export const TooltipWrapper: React.FunctionComponent = ({ - children, - condition, - tooltipContent, - ...tooltipProps -}) => { - return ( - <> - {condition ? ( - - <>{children} - - ) : ( - children - )} - - ); -}; diff --git a/x-pack/plugins/graph/tsconfig.json b/x-pack/plugins/graph/tsconfig.json index c1fc3807c4c182..0618744404be40 100644 --- a/x-pack/plugins/graph/tsconfig.json +++ b/x-pack/plugins/graph/tsconfig.json @@ -49,6 +49,7 @@ "@kbn/content-management-utils", "@kbn/logging", "@kbn/content-management-table-list-view-common", + "@kbn/visualization-utils", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx index bdc88a7cef4527..0d6556344a7102 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx @@ -29,7 +29,7 @@ import { } from '@kbn/data-plugin/public'; import { extendedBoundsToAst, intervalOptions } from '@kbn/data-plugin/common'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { updateColumnParam } from '../layer_helpers'; import { OperationDefinition, ParamEditorProps } from '.'; import { FieldBasedIndexPatternColumn } from './column_types'; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx index bd10558d714046..8bd02702c841a9 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx @@ -25,7 +25,7 @@ import { } from '@kbn/coloring'; import { GaugeTicksPositions, GaugeColorModes } from '@kbn/expression-gauge-plugin/common'; import { getMaxValue, getMinValue } from '@kbn/expression-gauge-plugin/public'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { isNumericFieldForDatatable } from '../../../common/expressions/datatable/utils'; import { applyPaletteParams, PalettePanelContainer } from '../../shared_components'; import type { VisualizationDimensionEditorProps } from '../../types'; diff --git a/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx b/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx index ebc0b1040623fc..c621a59e9ea9b5 100644 --- a/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx +++ b/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx @@ -11,7 +11,7 @@ import { Position } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; import { LegendSize } from '@kbn/visualizations-plugin/public'; import { EuiIconAxisLeft, EuiIconAxisBottom } from '@kbn/chart-icons'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { VisualizationToolbarProps } from '../../types'; import { LegendSettingsPopover, diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx index fe070e50449d63..ad3215634a2610 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { ToolbarPopover } from '../../../shared_components'; import { TitlePositionOptions } from './title_position_option'; import { FramePublicAPI } from '../../../types'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx index 3697ce988efb5c..a02d4c1d82772a 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx @@ -11,7 +11,7 @@ import { Position, ScaleType } from '@elastic/charts'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { AxisExtentConfig } from '@kbn/expression-xy-plugin/common'; import { LegendSize } from '@kbn/visualizations-plugin/public'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { LegendSettingsPopoverProps } from '../../../shared_components/legend/legend_settings_popover'; import type { VisualizationToolbarProps, FramePublicAPI } from '../../../types'; import { State, XYState, AxesSettingsConfig } from '../types'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/shared/marker_decoration_settings.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/shared/marker_decoration_settings.tsx index 3f620a9379538b..e2b149dfc0eb60 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/shared/marker_decoration_settings.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/shared/marker_decoration_settings.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonGroup, EuiFormRow } from '@elastic/eui'; import { IconPosition } from '@kbn/expression-xy-plugin/common'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { YAxisMode } from '../../types'; import { idPrefix } from '../dimension_editor'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx index bd147779fed8d5..b8b244daf85d29 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { ToolbarPopover, ValueLabelsSettings } from '../../../../shared_components'; import { MissingValuesOptions } from './missing_values_option'; import { LineCurveOption } from './line_curve_option'; diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index dd714b72c998d8..6052ae05d37cfb 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -97,7 +97,8 @@ "@kbn/shared-ux-button-toolbar", "@kbn/cell-actions", "@kbn/calculate-width-from-char-count", - "@kbn/discover-utils" + "@kbn/discover-utils", + "@kbn/visualization-utils" ], "exclude": [ "target/**/*"