From bad048b7ba1fecd28e76509c545a67fc8b70fdeb Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Wed, 21 Apr 2021 08:38:00 +0100 Subject: [PATCH] Performance: Standardize lodash imports to use destructured members (#33040) * Performance: Standardize lodash imports to use destructured members Changes lodash imports of the form `import x from 'lodash/x'` to `import { x } from 'lodash'` to reduce bundle size. * Remove unnecessary _ import from Graph component * Enforce lodash import style * Fix remaining lodash imports --- .eslintrc | 5 +- package.json | 1 + .../src/dataframe/MutableDataFrame.ts | 2 +- .../src/datetime/datemath.test.ts | 2 +- .../grafana-data/src/datetime/datemath.ts | 3 +- .../grafana-data/src/datetime/rangeutil.ts | 4 +- .../src/field/displayProcessor.ts | 12 ++-- .../grafana-data/src/field/fieldComparers.ts | 2 +- .../src/field/fieldDisplay.test.ts | 2 +- .../grafana-data/src/field/fieldDisplay.ts | 3 +- .../grafana-data/src/field/fieldOverrides.ts | 5 +- .../src/field/getFieldDisplayValuesProxy.ts | 2 +- .../grafana-data/src/panel/PanelPlugin.ts | 2 +- .../src/transformations/fieldReducer.test.ts | 2 +- .../src/transformations/fieldReducer.ts | 2 +- .../transformers/calculateField.ts | 2 +- packages/grafana-data/src/utils/csv.ts | 2 +- .../src/utils/namedColorsPalette.ts | 2 +- packages/grafana-data/src/utils/url.ts | 4 +- packages/grafana-runtime/src/config.ts | 2 +- .../src/cli/tasks/changelog.ts | 10 ++- .../src/cli/tasks/component.create.ts | 4 +- .../src/cli/tasks/plugin/create.ts | 2 +- .../src/cli/utils/pascalCase.ts | 4 +- .../src/components/ColorPicker/ColorInput.tsx | 2 +- .../components/ColorPicker/ColorPicker.tsx | 3 +- .../ColorPicker/ColorPickerPopover.test.tsx | 2 +- .../ColorPicker/NamedColorsGroup.tsx | 3 +- .../CustomScrollbar/CustomScrollbar.tsx | 2 +- .../DataLinks/DataLinkSuggestions.tsx | 6 +- .../DataLinksInlineEditor.tsx | 2 +- .../CustomHeadersSettings.tsx | 2 +- .../components/Forms/Legacy/Switch/Switch.tsx | 2 +- .../RadioButtonGroup/RadioButtonGroup.tsx | 2 +- .../grafana-ui/src/components/Graph/Graph.tsx | 3 +- .../components/Graph/GraphSeriesToggler.tsx | 3 +- .../src/components/GraphNG/utils.ts | 2 +- .../json_explorer/json_explorer.ts | 4 +- .../src/components/Logs/LogRowMessage.tsx | 4 +- .../src/components/QueryField/QueryField.tsx | 4 +- .../SecretFormField/SecretFormField.tsx | 2 +- .../src/components/Segment/Segment.tsx | 6 +- .../src/components/Segment/SegmentAsync.tsx | 6 +- .../src/components/Select/Select.story.tsx | 2 +- .../components/SetInterval/SetInterval.tsx | 4 +- .../SingleStatShared/SingleStatBaseOptions.ts | 3 +- .../components/StatsPicker/StatsPicker.tsx | 2 +- .../src/components/Switch/Switch.tsx | 2 +- .../TableInputCSV/TableInputCSV.tsx | 2 +- .../TimeRangePicker/TimePickerFooter.tsx | 2 +- .../TimeZonePicker/TimeZoneOffset.tsx | 2 +- .../TimeZonePicker/TimeZoneOption.tsx | 2 +- .../src/components/Typeahead/Typeahead.tsx | 4 +- .../VizLegend/VizLegendStatsList.tsx | 2 +- .../components/VizLegend/VizLegendTable.tsx | 3 +- .../src/slate-plugins/suggestions.test.tsx | 10 +-- .../src/slate-plugins/suggestions.tsx | 3 +- packages/grafana-ui/src/utils/colors.ts | 6 +- packages/grafana-ui/src/utils/logger.ts | 2 +- .../SpanGraph/render-into-canvas.test.js | 2 +- .../src/TracePageHeader/TracePageHeader.tsx | 4 +- .../src/TraceTimelineViewer/SpanBar.tsx | 2 +- .../SpanDetail/AccordianLogs.tsx | 2 +- .../TraceTimelineViewer/SpanTreeOffset.tsx | 2 +- .../src/common/UiFindInput.test.js | 7 +- .../src/model/link-patterns.tsx | 2 +- .../src/model/transform-trace-data.tsx | 2 +- .../src/selectors/trace.test.js | 2 +- .../DraggableManager/DraggableManager.tsx | 2 +- .../src/utils/config/get-config.tsx | 2 +- .../jaeger-ui-components/src/utils/date.tsx | 2 +- .../src/utils/span-ancestor-ids.tsx | 3 +- public/app/app.ts | 1 + .../core/components/Select/MetricSelect.tsx | 4 +- .../app/core/components/Select/TeamPicker.tsx | 4 +- .../app/core/components/Select/UserPicker.tsx | 4 +- .../CalculateFieldTransformerEditor.tsx | 2 +- .../FilterByValueTransformerEditor.tsx | 2 +- .../components/form_dropdown/form_dropdown.ts | 22 +++--- public/app/core/components/info_popover.ts | 4 +- .../core/components/query_part/query_part.ts | 8 +-- .../query_part/query_part_editor.ts | 20 +++--- .../components/sidemenu/BottomSection.tsx | 6 +- .../components/sidemenu/SideMenuDropDown.tsx | 4 +- .../core/components/sidemenu/TopSection.tsx | 6 +- .../app/core/components/sql_part/sql_part.ts | 4 +- .../components/sql_part/sql_part_editor.ts | 24 +++---- public/app/core/directives/array_join.ts | 4 +- .../app/core/directives/dropdown_typeahead.ts | 26 +++---- public/app/core/directives/metric_segment.ts | 24 +++---- public/app/core/filters/filters.ts | 8 +-- public/app/core/jquery_extended.ts | 4 +- public/app/core/lodash_extended.ts | 1 + public/app/core/logs_model.ts | 4 +- public/app/core/nav_model_srv.ts | 8 +-- public/app/core/services/AngularLoader.ts | 4 +- public/app/core/services/context_srv.ts | 4 +- public/app/core/services/impression_srv.ts | 8 +-- public/app/core/services/popover_srv.ts | 4 +- public/app/core/services/search_srv.ts | 14 ++-- public/app/core/services/segment_srv.ts | 10 +-- public/app/core/services/timer.ts | 6 +- public/app/core/specs/rangeutil.test.ts | 4 +- public/app/core/table_model.ts | 4 +- public/app/core/time_series2.ts | 12 ++-- public/app/core/utils/errors.ts | 4 +- public/app/core/utils/explore.ts | 6 +- public/app/core/utils/fetch.ts | 2 +- public/app/core/utils/query.ts | 6 +- public/app/core/utils/richHistory.ts | 14 ++-- public/app/core/utils/sort_by_keys.ts | 8 +-- public/app/core/utils/version.ts | 4 +- public/app/features/alerting/AlertTabCtrl.ts | 18 ++--- .../app/features/alerting/state/alertDef.ts | 8 +-- .../annotations/annotation_tooltip.ts | 6 +- .../features/annotations/annotations_srv.ts | 3 +- .../app/features/annotations/event_editor.ts | 6 +- .../app/features/annotations/event_manager.ts | 8 +-- .../features/annotations/events_processing.ts | 16 ++--- .../annotations/standardAnnotationSupport.ts | 2 +- .../AddPanelWidget/AddPanelWidget.tsx | 12 ++-- .../DashExportModal/DashboardExporter.test.ts | 22 +++--- .../DashExportModal/DashboardExporter.ts | 8 +-- .../DashboardSettings/TimePickerSettings.tsx | 2 +- .../DeleteDashboard/DeleteDashboardModal.tsx | 2 +- .../FolderPicker/FolderPickerCtrl.ts | 6 +- .../PanelEditor/OptionsPaneCategory.tsx | 1 - .../components/PanelEditor/state/actions.ts | 2 +- .../components/VersionHistory/DiffGroup.tsx | 4 +- .../components/VersionHistory/DiffValues.tsx | 6 +- .../components/VersionHistory/HistorySrv.ts | 4 +- .../VersionHistory/VersionHistoryHeader.tsx | 2 +- .../components/VersionHistory/utils.ts | 18 ++--- .../dashboard/dashgrid/PanelPluginError.tsx | 1 - .../dashboard/services/ChangeTracker.ts | 10 +-- .../dashboard/services/DashboardLoaderSrv.ts | 5 +- .../features/dashboard/services/TimeSrv.ts | 10 +-- .../dashboard/state/DashboardMigrator.test.ts | 6 +- .../dashboard/state/DashboardMigrator.ts | 65 ++++++++++------- .../state/DashboardModel.repeat.test.ts | 30 ++++---- .../dashboard/state/DashboardModel.test.ts | 4 +- .../dashboard/state/DashboardModel.ts | 71 +++++++++++-------- .../features/dashboard/state/PanelModel.ts | 12 ++-- .../settings/DataSourceSettingsPage.tsx | 2 +- .../datasources/settings/PluginSettings.tsx | 6 +- .../app/features/explore/AdHocFilterField.tsx | 4 +- public/app/features/explore/QueryRow.tsx | 3 +- .../app/features/explore/state/explorePane.ts | 2 +- .../app/features/panel/metrics_panel_ctrl.ts | 4 +- public/app/features/panel/panel_ctrl.ts | 4 +- .../app/features/panel/panellinks/link_srv.ts | 4 +- .../app/features/panel/panellinks/module.ts | 8 +-- public/app/features/panel/query_ctrl.ts | 4 +- public/app/features/playlist/PlaylistSrv.ts | 4 +- .../app/features/plugins/PluginDashboards.tsx | 2 +- public/app/features/plugins/PluginPage.tsx | 2 +- .../app/features/plugins/plugin_component.ts | 4 +- public/app/features/plugins/plugin_loader.ts | 1 + .../app/features/plugins/plugin_page_ctrl.ts | 4 +- .../plugins/wrappers/AppConfigWrapper.tsx | 3 +- public/app/features/profile/state/reducers.ts | 6 +- .../query/components/QueryEditorRow.tsx | 6 +- public/app/features/teams/TeamPages.tsx | 4 +- .../app/features/templating/template_srv.ts | 8 +-- .../app/features/variables/adhoc/adapter.ts | 2 +- .../features/variables/adhoc/reducer.test.ts | 2 +- .../features/variables/constant/adapter.ts | 2 +- .../variables/constant/reducer.test.ts | 2 +- .../app/features/variables/custom/adapter.ts | 2 +- .../features/variables/custom/reducer.test.ts | 2 +- .../features/variables/datasource/actions.ts | 4 +- .../features/variables/datasource/adapter.ts | 2 +- .../variables/datasource/reducer.test.ts | 2 +- .../variables/editor/VariableEditorEditor.tsx | 2 +- .../app/features/variables/editor/actions.ts | 2 +- .../features/variables/interval/adapter.ts | 2 +- .../variables/interval/reducer.test.ts | 2 +- .../features/variables/interval/reducer.ts | 4 +- .../pickers/OptionsPicker/actions.ts | 3 +- .../app/features/variables/query/adapter.ts | 2 +- .../features/variables/query/reducer.test.ts | 2 +- .../app/features/variables/query/reducer.ts | 16 ++--- .../shared/testing/variableBuilder.ts | 2 +- .../app/features/variables/state/actions.ts | 3 +- .../variables/state/sharedReducer.test.ts | 2 +- .../features/variables/state/sharedReducer.ts | 3 +- .../app/features/variables/textbox/adapter.ts | 2 +- .../variables/textbox/reducer.test.ts | 2 +- public/app/features/variables/utils.ts | 4 +- .../CloudMonitoringMetricFindQuery.ts | 2 +- .../components/Aggregations.tsx | 1 - .../components/AlignmentPeriods.tsx | 1 - .../components/LabelFilter.tsx | 1 - .../cloud-monitoring/components/Metrics.tsx | 6 +- .../cloud-monitoring/components/QueryType.tsx | 1 - .../datasource/cloud-monitoring/datasource.ts | 10 +-- .../datasource/cloud-monitoring/functions.ts | 12 ++-- .../cloudwatch/annotations_query_ctrl.ts | 4 +- .../cloudwatch/components/CloudWatchLink.tsx | 1 - .../cloudwatch/components/Dimensions.tsx | 2 +- .../components/LogsQueryField.test.tsx | 7 +- .../cloudwatch/components/LogsQueryField.tsx | 4 +- .../components/MetricsQueryEditor.tsx | 2 +- .../components/PanelQueryEditor.tsx | 2 +- .../datasource/cloudwatch/datasource.ts | 18 ++--- .../cloudwatch/language_provider.ts | 4 +- .../cloudwatch/query_parameter_ctrl.ts | 18 ++--- .../elasticsearch/datasource.test.ts | 16 ++--- .../datasource/elasticsearch/datasource.ts | 20 +++--- .../elasticsearch/elastic_response.ts | 30 ++++---- .../app_insights/app_insights_datasource.ts | 2 +- .../app_insights/response_parser.ts | 37 +++++----- .../azure_log_analytics_datasource.ts | 8 +-- .../azure_log_analytics/response_parser.ts | 20 +++--- .../azure_monitor/response_parser.ts | 26 +++---- .../datasource.ts | 6 +- .../editor/KustoQueryField.tsx | 9 ++- .../editor/query_field.tsx | 1 - .../query_ctrl.ts | 12 ++-- .../time_grain_converter.ts | 6 +- .../grafana/components/QueryEditor.tsx | 2 +- .../plugins/datasource/grafana/datasource.ts | 1 - .../datasource/graphite/add_graphite_func.ts | 14 ++-- .../datasource/graphite/datasource.test.ts | 6 +- .../plugins/datasource/graphite/datasource.ts | 26 +++---- .../datasource/graphite/func_editor.ts | 22 +++--- .../app/plugins/datasource/graphite/gfunc.ts | 42 +++++------ .../datasource/graphite/graphite_query.ts | 30 ++++---- .../app/plugins/datasource/graphite/lexer.ts | 8 +-- .../plugins/datasource/graphite/query_ctrl.ts | 30 ++++---- .../app/plugins/datasource/graphite/utils.ts | 4 +- .../plugins/datasource/influxdb/datasource.ts | 20 +++--- .../datasource/influxdb/influx_query_model.ts | 32 ++++----- .../datasource/influxdb/influx_series.ts | 20 +++--- .../datasource/influxdb/query_builder.ts | 4 +- .../plugins/datasource/influxdb/query_ctrl.ts | 8 +-- .../plugins/datasource/influxdb/query_part.ts | 6 +- .../datasource/influxdb/response_parser.ts | 12 ++-- .../influxdb/specs/response_parser.test.ts | 14 ++-- .../components/LokiExploreQueryEditor.tsx | 1 - .../datasource/loki/language_provider.ts | 6 +- .../plugins/datasource/loki/query_utils.ts | 2 +- .../datasource/loki/result_transformer.ts | 8 +-- .../datasource/mixed/MixedDataSource.ts | 3 +- .../plugins/datasource/mssql/datasource.ts | 6 +- .../plugins/datasource/mssql/query_ctrl.ts | 1 - .../datasource/mssql/response_parser.ts | 4 +- .../plugins/datasource/mysql/datasource.ts | 6 +- .../plugins/datasource/mysql/mysql_query.ts | 14 ++-- .../plugins/datasource/mysql/query_ctrl.ts | 42 +++++------ .../datasource/mysql/response_parser.ts | 4 +- .../plugins/datasource/opentsdb/datasource.ts | 71 +++++++++++-------- .../plugins/datasource/opentsdb/query_ctrl.ts | 8 +-- .../datasource/postgres/config_ctrl.ts | 4 +- .../plugins/datasource/postgres/datasource.ts | 6 +- .../datasource/postgres/postgres_query.ts | 16 ++--- .../plugins/datasource/postgres/query_ctrl.ts | 42 +++++------ .../datasource/postgres/response_parser.ts | 4 +- .../prometheus/add_label_to_query.ts | 6 +- .../prometheus/components/PromLink.tsx | 4 +- .../prometheus/components/PromQueryEditor.tsx | 4 +- .../prometheus/components/PromQueryField.tsx | 4 +- .../datasource/prometheus/datasource.test.ts | 8 +-- .../datasource/prometheus/datasource.ts | 3 +- .../prometheus/language_provider.ts | 8 +-- .../prometheus/metric_find_query.ts | 18 ++--- .../datasource/prometheus/query_hints.ts | 4 +- .../app/plugins/panel/alertlist/AlertList.tsx | 2 +- .../app/plugins/panel/dashlist/DashList.tsx | 2 +- .../app/plugins/panel/graph/Legend/Legend.tsx | 4 +- public/app/plugins/panel/graph/align_yaxes.ts | 2 - .../app/plugins/panel/graph/data_processor.ts | 4 +- public/app/plugins/panel/graph/graph.ts | 34 ++++----- public/app/plugins/panel/graph/histogram.ts | 1 - .../plugins/panel/graph/jquery.flot.events.ts | 6 +- public/app/plugins/panel/graph/module.ts | 16 ++--- .../panel/graph/series_overrides_ctrl.ts | 10 +-- .../plugins/panel/graph/threshold_manager.ts | 6 +- .../panel/graph/time_region_manager.ts | 4 +- .../app/plugins/panel/heatmap/color_legend.ts | 14 ++-- .../app/plugins/panel/heatmap/heatmap_ctrl.ts | 26 +++---- .../panel/heatmap/heatmap_data_converter.ts | 30 ++++---- .../plugins/panel/heatmap/heatmap_tooltip.ts | 16 ++--- public/app/plugins/panel/heatmap/rendering.ts | 32 ++++----- .../specs/heatmap_data_converter.test.ts | 22 +++--- .../plugins/panel/table-old/column_options.ts | 6 +- public/app/plugins/panel/table-old/editor.ts | 8 +-- public/app/plugins/panel/table-old/module.ts | 4 +- .../app/plugins/panel/table-old/renderer.ts | 22 +++--- .../panel/table-old/specs/renderer.test.ts | 4 +- .../plugins/panel/table-old/transformers.ts | 8 +-- public/app/plugins/panel/table/migrations.ts | 5 +- .../timeseries/HideSeriesConfigEditor.tsx | 4 +- .../plugins/panel/timeseries/migrations.ts | 4 +- public/app/routes/GrafanaCtrl.ts | 1 + public/test/matchers/toEmitValues.ts | 2 +- public/test/specs/helpers.ts | 3 +- scripts/webpack/dependencies.js | 2 +- yarn.lock | 9 ++- 299 files changed, 1135 insertions(+), 1137 deletions(-) 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 (