diff --git a/jest.config.js b/jest.config.js index 7f49f0d8d00..3370925ec1d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -28,6 +28,7 @@ module.exports = { moduleNameMapper: { '\\.svg': '/public/test/mocks/svg.ts', '\\.css': '/public/test/mocks/style.ts', + 'react-inlinesvg': '/public/test/mocks/react-inlinesvg.tsx', 'monaco-editor/esm/vs/editor/editor.api': '/public/test/mocks/monaco.ts', // near-membrane-dom won't work in a nodejs environment. '@locker/near-membrane-dom': '/public/test/mocks/nearMembraneDom.ts', diff --git a/packages/grafana-data/src/types/icon.ts b/packages/grafana-data/src/types/icon.ts index d2e9d9303bf..b75521182db 100644 --- a/packages/grafana-data/src/types/icon.ts +++ b/packages/grafana-data/src/types/icon.ts @@ -93,6 +93,7 @@ export const availableIconsIndex = { eye: true, 'eye-slash': true, 'ellipsis-h': true, + /* @deprecated, use 'spinner' instead */ 'fa fa-spinner': true, favorite: true, 'file-alt': true, @@ -198,6 +199,7 @@ export const availableIconsIndex = { sitemap: true, slack: true, 'sliders-v-alt': true, + spinner: true, 'sort-amount-down': true, 'sort-amount-up': true, 'square-shape': true, diff --git a/packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinksListItem.test.tsx b/packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinksListItem.test.tsx index b0877f8bcba..90df2a95099 100644 --- a/packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinksListItem.test.tsx +++ b/packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinksListItem.test.tsx @@ -84,7 +84,6 @@ describe('DataLinksListItem', () => { setupTestContext({ link }); expect(screen.getByText(/data link url not provided/i)).toBeInTheDocument(); - expect(screen.getByTitle('')).toBeInTheDocument(); }); }); @@ -109,7 +108,6 @@ describe('DataLinksListItem', () => { setupTestContext({ link }); expect(screen.getByText(/data link url not provided/i)).toBeInTheDocument(); - expect(screen.getByTitle('')).toBeInTheDocument(); }); }); }); diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangeInput.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangeInput.tsx index 1e60b37a3e1..d0eb37aa84e 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangeInput.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangeInput.tsx @@ -68,7 +68,7 @@ export const TimeRangeInput = ({ onChange(timeRange); }; - const onRangeClear = (event: MouseEvent) => { + const onRangeClear = (event: MouseEvent) => { event.stopPropagation(); const from = dateTime(null); const to = dateTime(null); diff --git a/packages/grafana-ui/src/components/FormField/FormField.test.tsx b/packages/grafana-ui/src/components/FormField/FormField.test.tsx index 553d92e0e17..c64baf0c568 100644 --- a/packages/grafana-ui/src/components/FormField/FormField.test.tsx +++ b/packages/grafana-ui/src/components/FormField/FormField.test.tsx @@ -1,4 +1,4 @@ -import { render, screen, waitFor } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; @@ -42,8 +42,6 @@ describe('FormField', () => { screen.getAllByRole('textbox')[0].focus(); await userEvent.tab(); - await waitFor(() => { - screen.getByText(tooltip); - }); + expect(await screen.findByText(tooltip)).toBeInTheDocument(); }); }); diff --git a/packages/grafana-ui/src/components/FormLabel/FormLabel.tsx b/packages/grafana-ui/src/components/FormLabel/FormLabel.tsx index f413e444bc9..bd5e24fdc6c 100644 --- a/packages/grafana-ui/src/components/FormLabel/FormLabel.tsx +++ b/packages/grafana-ui/src/components/FormLabel/FormLabel.tsx @@ -37,7 +37,7 @@ export const FormLabel = ({ {children} {tooltip && ( - + )} diff --git a/packages/grafana-ui/src/components/Icon/Icon.tsx b/packages/grafana-ui/src/components/Icon/Icon.tsx index ab1feb1c055..8920290a259 100644 --- a/packages/grafana-ui/src/components/Icon/Icon.tsx +++ b/packages/grafana-ui/src/components/Icon/Icon.tsx @@ -9,7 +9,7 @@ import { IconName, IconType, IconSize } from '../../types/icon'; import { getIconRoot, getIconSubDir, getSvgSize } from './utils'; -export interface IconProps extends React.HTMLAttributes { +export interface IconProps extends Omit, 'onLoad' | 'onError' | 'ref'> { name: IconName; size?: IconSize; type?: IconType; @@ -18,16 +18,14 @@ export interface IconProps extends React.HTMLAttributes { const getIconStyles = (theme: GrafanaTheme2) => { return { - // line-height: 0; is needed for correct icon alignment in Safari - container: css({ - label: 'Icon', - display: 'inline-block', - lineHeight: 0, - }), icon: css({ - verticalAlign: 'middle', display: 'inline-block', fill: 'currentColor', + flexShrink: 0, + label: 'Icon', + // line-height: 0; is needed for correct icon alignment in Safari + lineHeight: 0, + verticalAlign: 'middle', }), orange: css({ fill: theme.v1.palette.orange, @@ -35,53 +33,44 @@ const getIconStyles = (theme: GrafanaTheme2) => { }; }; -export const Icon = React.forwardRef( - ({ size = 'md', type = 'default', name, className, style, title = '', ...divElementProps }, ref) => { +export const Icon = React.forwardRef( + ({ size = 'md', type = 'default', name, className, style, title = '', ...rest }, ref) => { const styles = useStyles2(getIconStyles); - /* Temporary solution to display also font awesome icons */ - if (name?.startsWith('fa fa-')) { - return ; - } - if (!isIconName(name)) { console.warn('Icon component passed an invalid icon name', name); } - if (!name || name.includes('..')) { - return
invalid icon name
; - } + // handle the deprecated 'fa fa-spinner' + const iconName: IconName = name === 'fa fa-spinner' ? 'spinner' : name; const iconRoot = getIconRoot(); const svgSize = getSvgSize(size); const svgHgt = svgSize; const svgWid = name.startsWith('gf-bar-align') ? 16 : name.startsWith('gf-interp') ? 30 : svgSize; - const subDir = getIconSubDir(name, type); - const svgPath = `${iconRoot}${subDir}/${name}.svg`; + const subDir = getIconSubDir(iconName, type); + const svgPath = `${iconRoot}${subDir}/${iconName}.svg`; return ( -
- -
+ ); } ); Icon.displayName = 'Icon'; - -function getFontAwesomeIconStyles(iconName: string, className?: string): string { - return cx( - iconName, - { - 'fa-spin': iconName === 'fa fa-spinner', - }, - className - ); -} diff --git a/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx b/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx index ab08d0d51ef..1ea9e8e2163 100644 --- a/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx +++ b/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx @@ -112,7 +112,7 @@ export class RefreshPicker extends PureComponent { tooltip={tooltip} onClick={onRefresh} variant={variant} - icon={isLoading ? 'fa fa-spinner' : 'sync'} + icon={isLoading ? 'spinner' : 'sync'} style={width ? { width } : undefined} data-testid={selectors.components.RefreshPicker.runButtonV2} > diff --git a/packages/grafana-ui/src/components/Spinner/Spinner.tsx b/packages/grafana-ui/src/components/Spinner/Spinner.tsx index b27a4675b47..a6a68d5cccc 100644 --- a/packages/grafana-ui/src/components/Spinner/Spinner.tsx +++ b/packages/grafana-ui/src/components/Spinner/Spinner.tsx @@ -28,7 +28,7 @@ export const Spinner = ({ className, inline = false, iconClassName, style, size const styles = getStyles(size, inline); return (
- +
); }; diff --git a/public/app/core/components/TagFilter/TagBadge.tsx b/public/app/core/components/TagFilter/TagBadge.tsx index 8d4c84502d2..59c83c72b8c 100644 --- a/public/app/core/components/TagFilter/TagBadge.tsx +++ b/public/app/core/components/TagFilter/TagBadge.tsx @@ -6,7 +6,7 @@ export interface Props { label: string; removeIcon: boolean; count: number; - onClick?: React.MouseEventHandler; + onClick?: React.MouseEventHandler; } export class TagBadge extends React.Component { diff --git a/public/app/features/alerting/unified/components/receivers/GlobalConfigForm.tsx b/public/app/features/alerting/unified/components/receivers/GlobalConfigForm.tsx index 33c5da50700..e0c4975a04d 100644 --- a/public/app/features/alerting/unified/components/receivers/GlobalConfigForm.tsx +++ b/public/app/features/alerting/unified/components/receivers/GlobalConfigForm.tsx @@ -91,7 +91,7 @@ export const GlobalConfigForm = ({ config, alertManagerSourceName }: Props) => { {!readOnly && ( <> {loading && ( - )} diff --git a/public/app/features/alerting/unified/components/receivers/TemplateForm.tsx b/public/app/features/alerting/unified/components/receivers/TemplateForm.tsx index c498d25bd2b..2fa2eb4f66c 100644 --- a/public/app/features/alerting/unified/components/receivers/TemplateForm.tsx +++ b/public/app/features/alerting/unified/components/receivers/TemplateForm.tsx @@ -203,7 +203,7 @@ export const TemplateForm = ({ existing, alertManagerSourceName, config, provena
{loading && ( - )} diff --git a/public/app/features/alerting/unified/components/receivers/form/ChannelSubForm.tsx b/public/app/features/alerting/unified/components/receivers/form/ChannelSubForm.tsx index 77691f9ecbb..8fd3f9056a1 100644 --- a/public/app/features/alerting/unified/components/receivers/form/ChannelSubForm.tsx +++ b/public/app/features/alerting/unified/components/receivers/form/ChannelSubForm.tsx @@ -159,7 +159,7 @@ export function ChannelSubForm({ variant="secondary" type="button" onClick={() => handleTest()} - icon={testingReceiver ? 'fa fa-spinner' : 'message'} + icon={testingReceiver ? 'spinner' : 'message'} > Test diff --git a/public/app/features/alerting/unified/components/receivers/form/ReceiverForm.tsx b/public/app/features/alerting/unified/components/receivers/form/ReceiverForm.tsx index a301e3573e5..5f0476e9456 100644 --- a/public/app/features/alerting/unified/components/receivers/form/ReceiverForm.tsx +++ b/public/app/features/alerting/unified/components/receivers/form/ReceiverForm.tsx @@ -186,7 +186,7 @@ export function ReceiverForm({ {isEditable && ( <> {isSubmitting && ( - )} diff --git a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/QueryAndExpressionsStep.tsx b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/QueryAndExpressionsStep.tsx index 6b2b2febf60..b1b56b46e48 100644 --- a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/QueryAndExpressionsStep.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/QueryAndExpressionsStep.tsx @@ -488,7 +488,7 @@ export const QueryAndExpressionsStep = ({ editingExistingRule, onDataChange }: P {config.expressionsEnabled && } {isPreviewLoading && ( - )} diff --git a/public/app/features/alerting/unified/components/silences/SilencesEditor.tsx b/public/app/features/alerting/unified/components/silences/SilencesEditor.tsx index 93f08924190..ebcefaced79 100644 --- a/public/app/features/alerting/unified/components/silences/SilencesEditor.tsx +++ b/public/app/features/alerting/unified/components/silences/SilencesEditor.tsx @@ -242,7 +242,7 @@ export const SilencesEditor = ({ silence, alertManagerSourceName }: Props) => {
{loading && ( - )} diff --git a/public/app/features/correlations/CorrelationsPage.test.tsx b/public/app/features/correlations/CorrelationsPage.test.tsx index dc5e8f18a17..478b13ee1b7 100644 --- a/public/app/features/correlations/CorrelationsPage.test.tsx +++ b/public/app/features/correlations/CorrelationsPage.test.tsx @@ -292,7 +292,9 @@ describe('CorrelationsPage', () => { await userEvent.click(await screen.findByRole('button', { name: /add$/i })); - expect(mocks.reportInteraction).toHaveBeenLastCalledWith('grafana_correlations_added'); + await waitFor(() => { + expect(mocks.reportInteraction).toHaveBeenCalledWith('grafana_correlations_added'); + }); // the table showing correlations should have appeared expect(await screen.findByRole('table')).toBeInTheDocument(); @@ -439,7 +441,9 @@ describe('CorrelationsPage', () => { await userEvent.click(screen.getByRole('button', { name: /add$/i })); - expect(mocks.reportInteraction).toHaveBeenLastCalledWith('grafana_correlations_added'); + await waitFor(() => { + expect(mocks.reportInteraction).toHaveBeenCalledWith('grafana_correlations_added'); + }); // the table showing correlations should have appeared expect(await screen.findByRole('table')).toBeInTheDocument(); @@ -474,7 +478,9 @@ describe('CorrelationsPage', () => { expect(screen.queryByRole('cell', { name: /some label$/i })).not.toBeInTheDocument(); - expect(mocks.reportInteraction).toHaveBeenLastCalledWith('grafana_correlations_deleted'); + await waitFor(() => { + expect(mocks.reportInteraction).toHaveBeenCalledWith('grafana_correlations_deleted'); + }); }); it('correctly edits correlations', async () => { @@ -486,7 +492,9 @@ describe('CorrelationsPage', () => { const rowExpanderButton = within(tableRows[0]).getByRole('button', { name: /toggle row expanded/i }); await userEvent.click(rowExpanderButton); - expect(mocks.reportInteraction).toHaveBeenLastCalledWith('grafana_correlations_details_expanded'); + await waitFor(() => { + expect(mocks.reportInteraction).toHaveBeenCalledWith('grafana_correlations_details_expanded'); + }); await userEvent.clear(screen.getByRole('textbox', { name: /label/i })); await userEvent.type(screen.getByRole('textbox', { name: /label/i }), 'edited label'); @@ -500,9 +508,11 @@ describe('CorrelationsPage', () => { await userEvent.click(screen.getByRole('button', { name: /save$/i })); - expect(await screen.findByRole('cell', { name: /edited label$/i })).toBeInTheDocument(); + expect(await screen.findByRole('cell', { name: /edited label$/i }, { timeout: 5000 })).toBeInTheDocument(); - expect(mocks.reportInteraction).toHaveBeenLastCalledWith('grafana_correlations_edited'); + await waitFor(() => { + expect(mocks.reportInteraction).toHaveBeenCalledWith('grafana_correlations_edited'); + }); }); it('correctly edits transformations', async () => { @@ -553,7 +563,9 @@ describe('CorrelationsPage', () => { expect(screen.getByText('Please define an expression')).toBeInTheDocument(); await userEvent.type(screen.getByLabelText(/expression/i), 'test expression'); await userEvent.click(screen.getByRole('button', { name: /save$/i })); - expect(mocks.reportInteraction).toHaveBeenLastCalledWith('grafana_correlations_edited'); + await waitFor(() => { + expect(mocks.reportInteraction).toHaveBeenCalledWith('grafana_correlations_edited'); + }); }); }); @@ -684,7 +696,9 @@ describe('CorrelationsPage', () => { await userEvent.click(rowExpanderButton); - expect(mocks.reportInteraction).toHaveBeenLastCalledWith('grafana_correlations_details_expanded'); + await waitFor(() => { + expect(mocks.reportInteraction).toHaveBeenCalledWith('grafana_correlations_details_expanded'); + }); // form elements should be readonly const labelInput = await screen.findByRole('textbox', { name: /label/i }); diff --git a/public/app/features/correlations/Forms/CorrelationFormNavigation.tsx b/public/app/features/correlations/Forms/CorrelationFormNavigation.tsx index 287fe2564ca..fb08aa8d671 100644 --- a/public/app/features/correlations/Forms/CorrelationFormNavigation.tsx +++ b/public/app/features/correlations/Forms/CorrelationFormNavigation.tsx @@ -11,7 +11,7 @@ export const CorrelationFormNavigation = () => { const { readOnly, loading, correlation } = useCorrelationsFormContext(); const LastPageNext = !readOnly && ( - ); diff --git a/public/app/features/dashboard/components/EmbeddedDashboard/SaveDashboardForm.tsx b/public/app/features/dashboard/components/EmbeddedDashboard/SaveDashboardForm.tsx index 910486e18a0..63f41ba0000 100644 --- a/public/app/features/dashboard/components/EmbeddedDashboard/SaveDashboardForm.tsx +++ b/public/app/features/dashboard/components/EmbeddedDashboard/SaveDashboardForm.tsx @@ -45,7 +45,7 @@ export const SaveDashboardForm = ({ dashboard, onCancel, onSubmit, onSuccess, sa - {!hasChanges &&
No changes to save
} diff --git a/public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardForm.tsx b/public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardForm.tsx index 92ac378d9e3..622eef95c90 100644 --- a/public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardForm.tsx +++ b/public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardForm.tsx @@ -126,7 +126,7 @@ export const SaveDashboardForm = ({
- diff --git a/public/app/features/search/page/components/MoveToFolderModal.tsx b/public/app/features/search/page/components/MoveToFolderModal.tsx index 31440bc7c2d..e0451bf6e6c 100644 --- a/public/app/features/search/page/components/MoveToFolderModal.tsx +++ b/public/app/features/search/page/components/MoveToFolderModal.tsx @@ -132,7 +132,7 @@ export const MoveToFolderModal = ({ results, onMoveItems, onDismiss }: Props) => - diff --git a/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.test.tsx index 841e5d58e3c..a1f785be110 100644 --- a/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.test.tsx +++ b/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.test.tsx @@ -138,7 +138,9 @@ describe('VisualMetricQueryEditor', () => { expect(screen.getByText('metric.test_label')).toBeInTheDocument(); const service = await screen.findByLabelText('Service'); openMenu(service); - await select(service, 'Srv 2', { container: document.body }); + await act(async () => { + await select(service, 'Srv 2', { container: document.body }); + }); expect(onChange).toBeCalledWith(expect.objectContaining({ filters: ['metric.type', '=', 'type2'] })); expect(query).toEqual(defaultQuery); expect(screen.queryByText('metric.test_label')).not.toBeInTheDocument(); diff --git a/public/app/plugins/datasource/cloud-monitoring/components/__snapshots__/VariableQueryEditor.test.tsx.snap b/public/app/plugins/datasource/cloud-monitoring/components/__snapshots__/VariableQueryEditor.test.tsx.snap index 8d61351c259..dd402db3302 100644 --- a/public/app/plugins/datasource/cloud-monitoring/components/__snapshots__/VariableQueryEditor.test.tsx.snap +++ b/public/app/plugins/datasource/cloud-monitoring/components/__snapshots__/VariableQueryEditor.test.tsx.snap @@ -88,8 +88,12 @@ exports[`VariableQueryEditor renders correctly 1`] = `
-
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.tsx index d697131a905..4e0dff5e540 100644 --- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.tsx @@ -107,7 +107,7 @@ const QueryHeader = ({ variant={dataIsStale ? 'primary' : 'secondary'} size="sm" onClick={onRunQuery} - icon={data?.state === LoadingState.Loading ? 'fa fa-spinner' : undefined} + icon={data?.state === LoadingState.Loading ? 'spinner' : undefined} disabled={data?.state === LoadingState.Loading || emptyLogsExpression} > Run queries diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.test.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.test.tsx index 3d89c73ba0e..4f69b4dc33e 100644 --- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.test.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.test.tsx @@ -285,7 +285,7 @@ describe('LogGroupsSelector', () => { /> ); await userEvent.click(screen.getByText('Select log groups')); - await screen.getByRole('button', { name: 'select-clear-value' }).click(); + await userEvent.click(screen.getByRole('button', { name: 'select-clear-value' })); await userEvent.click(screen.getByText('Add log groups')); expect(onChange).toHaveBeenCalledWith([ { diff --git a/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx b/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx index eeb814cc25f..a9293b17fa8 100644 --- a/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx +++ b/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx @@ -176,7 +176,7 @@ export const LokiQueryEditor = React.memo((props) => { variant={dataIsStale ? 'primary' : 'secondary'} size="sm" onClick={onRunQuery} - icon={data?.state === LoadingState.Loading ? 'fa fa-spinner' : undefined} + icon={data?.state === LoadingState.Loading ? 'spinner' : undefined} disabled={data?.state === LoadingState.Loading} > {queries && queries.length > 1 ? `Run queries` : `Run query`} diff --git a/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryEditorSelector.tsx b/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryEditorSelector.tsx index 63108bfea33..d222406603d 100644 --- a/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryEditorSelector.tsx +++ b/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryEditorSelector.tsx @@ -130,7 +130,7 @@ export const PromQueryEditorSelector = React.memo((props) => { variant={dataIsStale ? 'primary' : 'secondary'} size="sm" onClick={onRunQuery} - icon={data?.state === LoadingState.Loading ? 'fa fa-spinner' : undefined} + icon={data?.state === LoadingState.Loading ? 'spinner' : undefined} disabled={data?.state === LoadingState.Loading} > Run queries diff --git a/public/img/icons/unicons/spinner-alt.svg b/public/img/icons/unicons/spinner-alt.svg deleted file mode 100644 index d197db9dfeb..00000000000 --- a/public/img/icons/unicons/spinner-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/img/icons/unicons/spinner.svg b/public/img/icons/unicons/spinner.svg index dbc7f48a55c..fca18c39393 100644 --- a/public/img/icons/unicons/spinner.svg +++ b/public/img/icons/unicons/spinner.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/public/test/mocks/react-inlinesvg.tsx b/public/test/mocks/react-inlinesvg.tsx new file mode 100644 index 00000000000..b0326a7a6fe --- /dev/null +++ b/public/test/mocks/react-inlinesvg.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +export default function ReactInlineSVG({ src, innerRef, cacheRequests, preProcessor, ...rest }) { + return ; +} + +export const cacheStore = {};