diff --git a/.eslintrc b/.eslintrc index 3a4a80b8ae7..56189b548d2 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,11 +1,12 @@ { "extends": ["@grafana/eslint-config"], "root": true, - "plugins": ["no-only-tests", "@emotion"], + "plugins": ["no-only-tests", "@emotion", "lodash"], "rules": { "no-only-tests/no-only-tests": "error", "react/prop-types": "off", - "@emotion/jsx-import": "error" + "@emotion/jsx-import": "error", + "lodash/import-scope": [2, "member"] }, "overrides": [ { diff --git a/package.json b/package.json index c56afe95499..bcd88f21605 100644 --- a/package.json +++ b/package.json @@ -146,6 +146,7 @@ "eslint": "7.21.0", "eslint-config-prettier": "7.2.0", "eslint-plugin-jsdoc": "31.6.1", + "eslint-plugin-lodash": "^7.2.0", "eslint-plugin-no-only-tests": "2.4.0", "eslint-plugin-prettier": "3.3.1", "eslint-plugin-react": "7.22.0", diff --git a/packages/grafana-data/src/dataframe/MutableDataFrame.ts b/packages/grafana-data/src/dataframe/MutableDataFrame.ts index 81d17a8826e..a76873b64dc 100644 --- a/packages/grafana-data/src/dataframe/MutableDataFrame.ts +++ b/packages/grafana-data/src/dataframe/MutableDataFrame.ts @@ -1,7 +1,7 @@ import { Field, DataFrame, DataFrameDTO, FieldDTO, FieldType } from '../types/dataFrame'; import { QueryResultMeta } from '../types/data'; import { guessFieldTypeFromValue, guessFieldTypeForField, toDataFrameDTO } from './processDataFrame'; -import isString from 'lodash/isString'; +import { isString } from 'lodash'; import { makeFieldParser } from '../utils/fieldParser'; import { MutableVector, Vector } from '../types/vector'; import { ArrayVector } from '../vector/ArrayVector'; diff --git a/packages/grafana-data/src/datetime/datemath.test.ts b/packages/grafana-data/src/datetime/datemath.test.ts index e1f8cbd8e86..fe07179832b 100644 --- a/packages/grafana-data/src/datetime/datemath.test.ts +++ b/packages/grafana-data/src/datetime/datemath.test.ts @@ -1,5 +1,5 @@ import sinon, { SinonFakeTimers } from 'sinon'; -import each from 'lodash/each'; +import { each } from 'lodash'; import * as dateMath from './datemath'; import { dateTime, DurationUnit, DateTime } from './moment_wrapper'; diff --git a/packages/grafana-data/src/datetime/datemath.ts b/packages/grafana-data/src/datetime/datemath.ts index 7881729016f..d35e1392576 100644 --- a/packages/grafana-data/src/datetime/datemath.ts +++ b/packages/grafana-data/src/datetime/datemath.ts @@ -1,5 +1,4 @@ -import includes from 'lodash/includes'; -import isDate from 'lodash/isDate'; +import { includes, isDate } from 'lodash'; import { DateTime, dateTime, dateTimeForTimeZone, ISO_8601, isDateTime, DurationUnit } from './moment_wrapper'; import { TimeZone } from '../types/index'; diff --git a/packages/grafana-data/src/datetime/rangeutil.ts b/packages/grafana-data/src/datetime/rangeutil.ts index 1360e991287..c2201e435ed 100644 --- a/packages/grafana-data/src/datetime/rangeutil.ts +++ b/packages/grafana-data/src/datetime/rangeutil.ts @@ -1,6 +1,4 @@ -import each from 'lodash/each'; -import groupBy from 'lodash/groupBy'; -import has from 'lodash/has'; +import { each, groupBy, has } from 'lodash'; import { RawTimeRange, TimeRange, TimeZone, IntervalValues } from '../types/time'; diff --git a/packages/grafana-data/src/field/displayProcessor.ts b/packages/grafana-data/src/field/displayProcessor.ts index c5525217353..bd538320090 100644 --- a/packages/grafana-data/src/field/displayProcessor.ts +++ b/packages/grafana-data/src/field/displayProcessor.ts @@ -1,5 +1,5 @@ // Libraries -import _ from 'lodash'; +import { toString, toNumber as _toNumber, isEmpty, isBoolean } from 'lodash'; // Types import { Field, FieldType } from '../types/dataFrame'; @@ -36,7 +36,7 @@ const timeFormats: KeyValue = { }; export function getDisplayProcessor(options?: DisplayProcessorOptions): DisplayProcessor { - if (!options || _.isEmpty(options) || !options.field) { + if (!options || isEmpty(options) || !options.field) { return toStringProcessor; } @@ -65,7 +65,7 @@ export function getDisplayProcessor(options?: DisplayProcessorOptions): DisplayP value = dateTime(value).valueOf(); } - let text = _.toString(value); + let text = toString(value); let numeric = isStringUnit ? NaN : toNumber(value); let prefix: string | undefined = undefined; let suffix: string | undefined = undefined; @@ -87,7 +87,7 @@ export function getDisplayProcessor(options?: DisplayProcessorOptions): DisplayP } if (!isNaN(numeric)) { - if (shouldFormat && !_.isBoolean(value)) { + if (shouldFormat && !isBoolean(value)) { const v = formatFunc(numeric, config.decimals, null, options.timeZone); text = v.text; suffix = v.suffix; @@ -123,11 +123,11 @@ function toNumber(value: any): number { if (typeof value === 'boolean') { return value ? 1 : 0; } - return _.toNumber(value); + return _toNumber(value); } function toStringProcessor(value: any): DisplayValue { - return { text: _.toString(value), numeric: toNumber(value) }; + return { text: toString(value), numeric: toNumber(value) }; } export function getRawDisplayProcessor(): DisplayProcessor { diff --git a/packages/grafana-data/src/field/fieldComparers.ts b/packages/grafana-data/src/field/fieldComparers.ts index e0173b42302..1eab7665c67 100644 --- a/packages/grafana-data/src/field/fieldComparers.ts +++ b/packages/grafana-data/src/field/fieldComparers.ts @@ -1,7 +1,7 @@ import { Field, FieldType } from '../types/dataFrame'; import { Vector } from '../types/vector'; import { dateTime } from '../datetime'; -import isNumber from 'lodash/isNumber'; +import { isNumber } from 'lodash'; type IndexComparer = (a: number, b: number) => number; diff --git a/packages/grafana-data/src/field/fieldDisplay.test.ts b/packages/grafana-data/src/field/fieldDisplay.test.ts index fc8325e10e9..16353d5e2d1 100644 --- a/packages/grafana-data/src/field/fieldDisplay.test.ts +++ b/packages/grafana-data/src/field/fieldDisplay.test.ts @@ -1,4 +1,4 @@ -import merge from 'lodash/merge'; +import { merge } from 'lodash'; import { getFieldDisplayValues, GetFieldDisplayValuesOptions } from './fieldDisplay'; import { toDataFrame } from '../dataframe/processDataFrame'; import { ReducerID } from '../transformations/fieldReducer'; diff --git a/packages/grafana-data/src/field/fieldDisplay.ts b/packages/grafana-data/src/field/fieldDisplay.ts index 551c551cc43..34f17416c66 100644 --- a/packages/grafana-data/src/field/fieldDisplay.ts +++ b/packages/grafana-data/src/field/fieldDisplay.ts @@ -1,5 +1,4 @@ -import toString from 'lodash/toString'; -import isEmpty from 'lodash/isEmpty'; +import { toString, isEmpty } from 'lodash'; import { getDisplayProcessor } from './displayProcessor'; import { diff --git a/packages/grafana-data/src/field/fieldOverrides.ts b/packages/grafana-data/src/field/fieldOverrides.ts index 80621e87c7d..2cbb6e50384 100644 --- a/packages/grafana-data/src/field/fieldOverrides.ts +++ b/packages/grafana-data/src/field/fieldOverrides.ts @@ -19,10 +19,7 @@ import { } from '../types'; import { fieldMatchers, reduceField, ReducerID } from '../transformations'; import { FieldMatcher } from '../types/transformations'; -import isNumber from 'lodash/isNumber'; -import set from 'lodash/set'; -import unset from 'lodash/unset'; -import get from 'lodash/get'; +import { isNumber, set, unset, get } from 'lodash'; import { getDisplayProcessor, getRawDisplayProcessor } from './displayProcessor'; import { guessFieldTypeForField } from '../dataframe'; import { standardFieldConfigEditorRegistry } from './standardFieldConfigEditorRegistry'; diff --git a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts index 0abdd672f69..7c9b55f2728 100644 --- a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts +++ b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts @@ -1,4 +1,4 @@ -import toNumber from 'lodash/toNumber'; +import { toNumber } from 'lodash'; import { DataFrame, DisplayValue, GrafanaTheme, TimeZone } from '../types'; import { getDisplayProcessor } from './displayProcessor'; import { formattedValueToString } from '../valueFormats'; diff --git a/packages/grafana-data/src/panel/PanelPlugin.ts b/packages/grafana-data/src/panel/PanelPlugin.ts index ce68b477d3c..b33f608dea0 100644 --- a/packages/grafana-data/src/panel/PanelPlugin.ts +++ b/packages/grafana-data/src/panel/PanelPlugin.ts @@ -11,7 +11,7 @@ import { } from '../types'; import { FieldConfigEditorBuilder, PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders'; import { ComponentClass, ComponentType } from 'react'; -import set from 'lodash/set'; +import { set } from 'lodash'; import { deprecationWarning } from '../utils'; import { FieldConfigOptionsRegistry } from '../field'; import { createFieldConfigRegistry } from './registryFactories'; diff --git a/packages/grafana-data/src/transformations/fieldReducer.test.ts b/packages/grafana-data/src/transformations/fieldReducer.test.ts index ac8d0f0e28d..ec22d69f552 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.test.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.test.ts @@ -1,4 +1,4 @@ -import difference from 'lodash/difference'; +import { difference } from 'lodash'; import { fieldReducers, ReducerID, reduceField } from './fieldReducer'; diff --git a/packages/grafana-data/src/transformations/fieldReducer.ts b/packages/grafana-data/src/transformations/fieldReducer.ts index c2ab0c639df..e23fdad4cb8 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.ts @@ -1,5 +1,5 @@ // Libraries -import isNumber from 'lodash/isNumber'; +import { isNumber } from 'lodash'; import { NullValueMode, Field, FieldState, FieldCalcs, FieldType } from '../types/index'; import { Registry, RegistryItem } from '../utils/Registry'; diff --git a/packages/grafana-data/src/transformations/transformers/calculateField.ts b/packages/grafana-data/src/transformations/transformers/calculateField.ts index 8dd1812e151..2ee6ca9c303 100644 --- a/packages/grafana-data/src/transformations/transformers/calculateField.ts +++ b/packages/grafana-data/src/transformations/transformers/calculateField.ts @@ -9,7 +9,7 @@ import { RowVector } from '../../vector/RowVector'; import { ArrayVector, BinaryOperationVector, ConstantVector } from '../../vector'; import { AsNumberVector } from '../../vector/AsNumberVector'; import { getTimeField } from '../../dataframe/processDataFrame'; -import defaults from 'lodash/defaults'; +import { defaults } from 'lodash'; import { BinaryOperationID, binaryOperators } from '../../utils/binaryOperators'; import { ensureColumnsTransformer } from './ensureColumns'; import { getFieldDisplayName } from '../../field'; diff --git a/packages/grafana-data/src/utils/csv.ts b/packages/grafana-data/src/utils/csv.ts index 17da168f682..a9a7e7dfd45 100644 --- a/packages/grafana-data/src/utils/csv.ts +++ b/packages/grafana-data/src/utils/csv.ts @@ -1,6 +1,6 @@ // Libraries import Papa, { ParseConfig, Parser, ParseResult } from 'papaparse'; -import defaults from 'lodash/defaults'; +import { defaults } from 'lodash'; // Types import { DataFrame, Field, FieldConfig, FieldType } from '../types'; diff --git a/packages/grafana-data/src/utils/namedColorsPalette.ts b/packages/grafana-data/src/utils/namedColorsPalette.ts index c64a169d83b..5354a386f89 100644 --- a/packages/grafana-data/src/utils/namedColorsPalette.ts +++ b/packages/grafana-data/src/utils/namedColorsPalette.ts @@ -1,4 +1,4 @@ -import flatten from 'lodash/flatten'; +import { flatten } from 'lodash'; import tinycolor from 'tinycolor2'; import { GrafanaTheme, GrafanaThemeType } from '../types/theme'; diff --git a/packages/grafana-data/src/utils/url.ts b/packages/grafana-data/src/utils/url.ts index 51b577893dd..c733cf137ea 100644 --- a/packages/grafana-data/src/utils/url.ts +++ b/packages/grafana-data/src/utils/url.ts @@ -2,7 +2,7 @@ * @preserve jquery-param (c) 2015 KNOWLEDGECODE | MIT */ -import _ from 'lodash'; +import { toNumber } from 'lodash'; import { ExploreUrlState } from '../types/explore'; /** @@ -156,7 +156,7 @@ export function parseKeyValue(keyValue: string) { let parsedVal: any; if (typeof val === 'string' && val !== '') { - parsedVal = val === 'true' || val === 'false' ? val === 'true' : _.toNumber(val); + parsedVal = val === 'true' || val === 'false' ? val === 'true' : toNumber(val); } else { parsedVal = val; } diff --git a/packages/grafana-runtime/src/config.ts b/packages/grafana-runtime/src/config.ts index 57221ffcf7e..facc8225dfc 100644 --- a/packages/grafana-runtime/src/config.ts +++ b/packages/grafana-runtime/src/config.ts @@ -1,4 +1,4 @@ -import merge from 'lodash/merge'; +import { merge } from 'lodash'; import { getTheme } from '@grafana/ui'; import { BuildInfo, diff --git a/packages/grafana-toolkit/src/cli/tasks/changelog.ts b/packages/grafana-toolkit/src/cli/tasks/changelog.ts index 7afd4353706..7e797d15ec9 100644 --- a/packages/grafana-toolkit/src/cli/tasks/changelog.ts +++ b/packages/grafana-toolkit/src/cli/tasks/changelog.ts @@ -1,8 +1,6 @@ -// @ts-ignore -import * as _ from 'lodash'; +import { difference, sortBy } from 'lodash'; import { Task } from './task'; import GithubClient from '../utils/githubClient'; -import difference from 'lodash/difference'; import chalk from 'chalk'; import { useSpinner } from '../utils/useSpinner'; @@ -26,8 +24,8 @@ const getPackageChangelog = (packageName: string, issues: any[]) => { } let markdown = chalk.bold.yellow(`\n\n/*** ${packageName} changelog ***/\n\n`); - const bugs = _.sortBy(issues.filter(filterBugs), 'title'); - const notBugs = _.sortBy(difference(issues, bugs), 'title'); + const bugs = sortBy(issues.filter(filterBugs), 'title'); + const notBugs = sortBy(difference(issues, bugs), 'title'); if (notBugs.length > 0) { markdown += '### Features / Enhancements\n'; @@ -89,7 +87,7 @@ const changelogTaskRunner = ({ milestone }: ChangelogOptions) => mergedIssues.push(item); } } - const issues = _.sortBy(mergedIssues, 'title'); + const issues = sortBy(mergedIssues, 'title'); const toolkitIssues = issues.filter((item: any) => item.labels.find((label: any) => label.name === 'area/grafana/toolkit') diff --git a/packages/grafana-toolkit/src/cli/tasks/component.create.ts b/packages/grafana-toolkit/src/cli/tasks/component.create.ts index c730cb1c671..8227c450c36 100644 --- a/packages/grafana-toolkit/src/cli/tasks/component.create.ts +++ b/packages/grafana-toolkit/src/cli/tasks/component.create.ts @@ -1,6 +1,6 @@ import { Task, TaskRunner } from './task'; import fs from 'fs'; -import _ from 'lodash'; +import { template as _template } from 'lodash'; import { prompt } from 'inquirer'; import { pascalCase } from '../utils/pascalCase'; import { promptConfirm, promptInput, promptList } from '../utils/prompt'; @@ -53,7 +53,7 @@ export const promptDetails = () => { export const generateComponents: ComponentGenerator = async ({ details, path }) => { const name = pascalCase(details.name); const getCompiled = (template: string) => { - return _.template(template)({ ...details, name }); + return _template(template)({ ...details, name }); }; const filePath = `${path}/${name}`; let paths = []; diff --git a/packages/grafana-toolkit/src/cli/tasks/plugin/create.ts b/packages/grafana-toolkit/src/cli/tasks/plugin/create.ts index 9a93b7a3e4e..7a54628a4a2 100644 --- a/packages/grafana-toolkit/src/cli/tasks/plugin/create.ts +++ b/packages/grafana-toolkit/src/cli/tasks/plugin/create.ts @@ -2,7 +2,7 @@ import chalk from 'chalk'; import commandExists from 'command-exists'; import { promises as fs, readFileSync } from 'fs'; import { prompt } from 'inquirer'; -import kebabCase from 'lodash/kebabCase'; +import { kebabCase } from 'lodash'; import path from 'path'; import gitPromise from 'simple-git/promise'; import { promptConfirm, promptInput } from '../../utils/prompt'; diff --git a/packages/grafana-toolkit/src/cli/utils/pascalCase.ts b/packages/grafana-toolkit/src/cli/utils/pascalCase.ts index e842a711aa8..d1e277ec3cd 100644 --- a/packages/grafana-toolkit/src/cli/utils/pascalCase.ts +++ b/packages/grafana-toolkit/src/cli/utils/pascalCase.ts @@ -1,3 +1,3 @@ -import _ from 'lodash'; +import { flow, camelCase, upperFirst } from 'lodash'; -export const pascalCase = _.flow(_.camelCase, _.upperFirst); +export const pascalCase = flow(camelCase, upperFirst); diff --git a/packages/grafana-ui/src/components/ColorPicker/ColorInput.tsx b/packages/grafana-ui/src/components/ColorPicker/ColorInput.tsx index 1805bd867ef..fc1dee2f15e 100644 --- a/packages/grafana-ui/src/components/ColorPicker/ColorInput.tsx +++ b/packages/grafana-ui/src/components/ColorPicker/ColorInput.tsx @@ -1,6 +1,6 @@ import React from 'react'; import tinycolor from 'tinycolor2'; -import debounce from 'lodash/debounce'; +import { debounce } from 'lodash'; import { ColorPickerProps } from './ColorPickerPopover'; import { Input } from '../Forms/Legacy/Input/Input'; diff --git a/packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx b/packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx index 0fc0e89fa45..244d0a68b69 100644 --- a/packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx +++ b/packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx @@ -1,5 +1,4 @@ import React, { Component, createRef } from 'react'; -import omit from 'lodash/omit'; import { PopoverController } from '../Tooltip/PopoverController'; import { Popover } from '../Tooltip/Popover'; import { ColorPickerPopover, ColorPickerProps, ColorPickerChangeHandler } from './ColorPickerPopover'; @@ -43,7 +42,7 @@ export const colorPickerFactory = ( const { theme, children } = this.props; const styles = getStyles(theme); const popoverElement = React.createElement(popover, { - ...omit(this.props, 'children'), + ...{ ...this.props, children: null }, onChange: this.onColorChange, }); diff --git a/packages/grafana-ui/src/components/ColorPicker/ColorPickerPopover.test.tsx b/packages/grafana-ui/src/components/ColorPicker/ColorPickerPopover.test.tsx index 112ce7a7ee8..589b3ba645d 100644 --- a/packages/grafana-ui/src/components/ColorPicker/ColorPickerPopover.test.tsx +++ b/packages/grafana-ui/src/components/ColorPicker/ColorPickerPopover.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; import { ColorPickerPopover } from './ColorPickerPopover'; import { ColorSwatch } from './NamedColorsGroup'; -import flatten from 'lodash/flatten'; +import { flatten } from 'lodash'; import { getNamedColorPalette, getColorFromHexRgbOrName } from '@grafana/data'; const allColors = flatten(Array.from(getNamedColorPalette().values())); diff --git a/packages/grafana-ui/src/components/ColorPicker/NamedColorsGroup.tsx b/packages/grafana-ui/src/components/ColorPicker/NamedColorsGroup.tsx index 014d2b25747..cd78c9122c5 100644 --- a/packages/grafana-ui/src/components/ColorPicker/NamedColorsGroup.tsx +++ b/packages/grafana-ui/src/components/ColorPicker/NamedColorsGroup.tsx @@ -2,8 +2,7 @@ import React, { FunctionComponent } from 'react'; import { Themeable } from '../../types'; import { ColorDefinition } from '@grafana/data'; import { Color } from 'csstype'; -import upperFirst from 'lodash/upperFirst'; -import find from 'lodash/find'; +import { upperFirst, find } from 'lodash'; type ColorChangeHandler = (color: ColorDefinition) => void; diff --git a/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx b/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx index 2c4d4281f40..badfe4c557a 100644 --- a/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx +++ b/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx @@ -1,5 +1,5 @@ import React, { FC, useCallback, useEffect, useRef } from 'react'; -import isNil from 'lodash/isNil'; +import { isNil } from 'lodash'; import classNames from 'classnames'; import { css } from '@emotion/css'; import Scrollbars from 'react-custom-scrollbars'; diff --git a/packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx b/packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx index 2a9010006af..94c55d1006a 100644 --- a/packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx +++ b/packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx @@ -1,7 +1,7 @@ import { ThemeContext } from '../../index'; import { GrafanaTheme, VariableSuggestion } from '@grafana/data'; import { css, cx } from '@emotion/css'; -import _ from 'lodash'; +import { groupBy, capitalize } from 'lodash'; import React, { useRef, useContext, useMemo } from 'react'; import useClickAway from 'react-use/lib/useClickAway'; import { List } from '../index'; @@ -70,7 +70,7 @@ export const DataLinkSuggestions: React.FC = ({ sugges }); const groupedSuggestions = useMemo(() => { - return _.groupBy(suggestions, (s) => s.origin); + return groupBy(suggestions, (s) => s.origin); }, [suggestions]); const styles = getStyles(theme); @@ -91,7 +91,7 @@ export const DataLinkSuggestions: React.FC = ({ sugges ) => void; diff --git a/packages/grafana-ui/src/components/GraphNG/utils.ts b/packages/grafana-ui/src/components/GraphNG/utils.ts index 498fd69b5f6..bee32e510fa 100644 --- a/packages/grafana-ui/src/components/GraphNG/utils.ts +++ b/packages/grafana-ui/src/components/GraphNG/utils.ts @@ -1,5 +1,5 @@ import React from 'react'; -import isNumber from 'lodash/isNumber'; +import { isNumber } from 'lodash'; import { GraphNGLegendEventMode, XYFieldMatchers } from './types'; import { ArrayVector, diff --git a/packages/grafana-ui/src/components/JSONFormatter/json_explorer/json_explorer.ts b/packages/grafana-ui/src/components/JSONFormatter/json_explorer/json_explorer.ts index bb3f1658e29..0f704925699 100644 --- a/packages/grafana-ui/src/components/JSONFormatter/json_explorer/json_explorer.ts +++ b/packages/grafana-ui/src/components/JSONFormatter/json_explorer/json_explorer.ts @@ -3,7 +3,7 @@ import { isObject, getObjectName, getType, getValuePreview, cssClass, createElement } from './helpers'; -import _ from 'lodash'; +import { isNumber } from 'lodash'; const DATE_STRING_REGEX = /(^\d{1,4}[\.|\\/|-]\d{1,2}[\.|\\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/; const PARTIAL_DATE_REGEX = /\d{2}:\d{2}:\d{2} GMT-\d{4}/; @@ -222,7 +222,7 @@ export class JsonExplorer { } isNumberArray() { - return this.json.length > 0 && this.json.length < 4 && (_.isNumber(this.json[0]) || _.isNumber(this.json[1])); + return this.json.length > 0 && this.json.length < 4 && (isNumber(this.json[0]) || isNumber(this.json[1])); } renderArray() { diff --git a/packages/grafana-ui/src/components/Logs/LogRowMessage.tsx b/packages/grafana-ui/src/components/Logs/LogRowMessage.tsx index 4c95f0404a4..134cc7a6688 100644 --- a/packages/grafana-ui/src/components/Logs/LogRowMessage.tsx +++ b/packages/grafana-ui/src/components/Logs/LogRowMessage.tsx @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import _ from 'lodash'; +import { isEqual } from 'lodash'; import tinycolor from 'tinycolor2'; import { css, cx } from '@emotion/css'; import { LogRowModel, findHighlightChunksInText, GrafanaTheme } from '@grafana/data'; @@ -76,7 +76,7 @@ class UnThemedLogRowMessage extends PureComponent { const style = getLogRowStyles(theme, row.logLevel); const { entry, hasAnsi, raw } = row; - const previewHighlights = highlighterExpressions?.length && !_.isEqual(highlighterExpressions, row.searchWords); + const previewHighlights = highlighterExpressions?.length && !isEqual(highlighterExpressions, row.searchWords); const highlights = previewHighlights ? highlighterExpressions : row.searchWords; const needsHighlighter = highlights && highlights.length > 0 && highlights[0] && highlights[0].length > 0 && entry.length < MAX_CHARACTERS; diff --git a/packages/grafana-ui/src/components/QueryField/QueryField.tsx b/packages/grafana-ui/src/components/QueryField/QueryField.tsx index b4c5810b33a..7f0ea9e2f6f 100644 --- a/packages/grafana-ui/src/components/QueryField/QueryField.tsx +++ b/packages/grafana-ui/src/components/QueryField/QueryField.tsx @@ -1,4 +1,4 @@ -import _ from 'lodash'; +import { debounce } from 'lodash'; import React, { Context } from 'react'; import { Value, Editor as CoreEditor } from 'slate'; @@ -64,7 +64,7 @@ export class QueryField extends React.PureComponent) { super(props, context); - this.runOnChangeDebounced = _.debounce(this.runOnChange, 500); + this.runOnChangeDebounced = debounce(this.runOnChange, 500); const { onTypeahead, cleanText, portalOrigin, onWillApplySuggestion } = props; diff --git a/packages/grafana-ui/src/components/SecretFormField/SecretFormField.tsx b/packages/grafana-ui/src/components/SecretFormField/SecretFormField.tsx index b3c06b2cfe1..d8aa40fd13b 100644 --- a/packages/grafana-ui/src/components/SecretFormField/SecretFormField.tsx +++ b/packages/grafana-ui/src/components/SecretFormField/SecretFormField.tsx @@ -1,4 +1,4 @@ -import omit from 'lodash/omit'; +import { omit } from 'lodash'; import React, { InputHTMLAttributes, FunctionComponent } from 'react'; import { FormField } from '../FormField/FormField'; import { Button } from '../Button/Button'; diff --git a/packages/grafana-ui/src/components/Segment/Segment.tsx b/packages/grafana-ui/src/components/Segment/Segment.tsx index a81f28bd4b8..c76054792e0 100644 --- a/packages/grafana-ui/src/components/Segment/Segment.tsx +++ b/packages/grafana-ui/src/components/Segment/Segment.tsx @@ -1,6 +1,6 @@ import React, { HTMLProps } from 'react'; import { cx } from '@emotion/css'; -import _ from 'lodash'; +import { isObject } from 'lodash'; import { SelectableValue } from '@grafana/data'; import { SegmentSelect, useExpandableLabel, SegmentProps } from './'; import { getSegmentStyles } from './styles'; @@ -28,7 +28,7 @@ export function Segment({ const styles = useStyles(getSegmentStyles); if (!expanded) { - const label = _.isObject(value) ? value.label : value; + const label = isObject(value) ? value.label : value; return (