Refactor: move some files to @grafana/data (#17952)

* moving to data WIP

* more refactoring

* add missing test

* mock full path

* remove sinon from grafana-ui
This commit is contained in:
Ryan McKinley
2019-07-05 23:05:53 -07:00
committed by Torkel Ödegaard
parent baed5d7bd9
commit 3f15170914
249 changed files with 381 additions and 427 deletions

View File

@@ -34,7 +34,7 @@ import { setupAngularRoutes } from 'app/routes/routes';
import 'app/routes/GrafanaCtrl';
import 'app/features/all';
import { setLocale } from '@grafana/ui/src/utils/moment_wrapper';
import { setLocale } from '@grafana/data';
import { setMarkdownOptions } from '@grafana/data';
// import symlinked extensions

View File

@@ -5,7 +5,7 @@ import React, { PureComponent } from 'react';
import { Select, SelectOptionItem } from '@grafana/ui';
// Types
import { DataSourceSelectItem } from '@grafana/ui/src/types';
import { DataSourceSelectItem } from '@grafana/ui';
export interface Props {
onChange: (ds: DataSourceSelectItem) => void;

View File

@@ -1,5 +1,5 @@
import coreModule from '../core_module';
import * as rangeUtil from '@grafana/ui/src/utils/rangeutil';
import * as rangeUtil from '@grafana/data/src/utils/rangeutil';
function ngModelOnBlur() {
return {

View File

@@ -2,7 +2,7 @@ import _ from 'lodash';
import angular from 'angular';
import coreModule from '../core_module';
import { TemplateSrv } from 'app/features/templating/template_srv';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime } from '@grafana/data';
coreModule.filter('stringSort', () => {
return (input: any) => {

View File

@@ -1,8 +1,9 @@
import _ from 'lodash';
import ansicolor from 'vendor/ansicolor/ansicolor';
import { colors } from '@grafana/ui';
import {
colors,
TimeSeries,
Labels,
LogLevel,
@@ -21,10 +22,10 @@ import {
LogsParser,
LogLabelStatsModel,
LogsDedupStrategy,
} from '@grafana/ui';
} from '@grafana/data';
import { getThemeColor } from 'app/core/utils/colors';
import { hasAnsiCodes } from 'app/core/utils/text';
import { dateTime, toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime, toUtc } from '@grafana/data';
export const LogLevelColor = {
[LogLevel.critical]: colors[7],

View File

@@ -1,4 +1,4 @@
import { DataFrame, FieldType, LogsModel, LogsMetaKind, LogsDedupStrategy, LogLevel } from '@grafana/ui';
import { DataFrame, FieldType, LogsModel, LogsMetaKind, LogsDedupStrategy, LogLevel } from '@grafana/data';
import {
dedupLogRows,
calculateFieldStats,

View File

@@ -1,6 +1,6 @@
import * as rangeUtil from '@grafana/ui/src/utils/rangeutil';
import * as rangeUtil from '@grafana/data/src/utils/rangeutil';
import _ from 'lodash';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime } from '@grafana/data';
describe('rangeUtil', () => {
describe('Can get range grouped list of ranges', () => {

View File

@@ -1,5 +1,5 @@
import _ from 'lodash';
import { Column, TableData } from '@grafana/ui';
import { Column, TableData } from '@grafana/data';
/**
* Extends the standard Column class with variables that get

View File

@@ -12,7 +12,8 @@ import {
} from './explore';
import { ExploreUrlState, ExploreMode } from 'app/types/explore';
import store from 'app/core/store';
import { DataQueryError, LogsDedupStrategy } from '@grafana/ui';
import { LogsDedupStrategy } from '@grafana/data';
import { DataQueryError } from '@grafana/ui';
const DEFAULT_EXPLORE_STATE: ExploreUrlState = {
datasource: null,

View File

@@ -1,11 +1,10 @@
// Libraries
import _ from 'lodash';
import { from } from 'rxjs';
import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { isLive } from '@grafana/ui/src/components/RefreshPicker/RefreshPicker';
// Services & Utils
import * as dateMath from '@grafana/ui/src/utils/datemath';
import * as dateMath from '@grafana/data/src/utils/datemath';
import { renderUrl } from 'app/core/utils/url';
import kbn from 'app/core/utils/kbn';
import store from 'app/core/store';
@@ -13,21 +12,24 @@ import { getNextRefIdChar } from './query';
// Types
import {
TimeRange,
RawTimeRange,
TimeZone,
IntervalValues,
DataQuery,
DataSourceApi,
TimeFragment,
DataQueryError,
LogRowModel,
LogsModel,
LogsDedupStrategy,
DataSourceJsonData,
DataQueryRequest,
DataStreamObserver,
} from '@grafana/ui';
import {
toUtc,
TimeRange,
RawTimeRange,
TimeZone,
IntervalValues,
TimeFragment,
LogRowModel,
LogsModel,
LogsDedupStrategy,
} from '@grafana/data';
import {
ExploreUrlState,
HistoryItem,

View File

@@ -1,7 +1,7 @@
import { isBoolean, isNumber, sortedUniq, sortedIndexOf, unescape as htmlUnescaped } from 'lodash';
import { saveAs } from 'file-saver';
import { isNullOrUndefined } from 'util';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime } from '@grafana/data';
const DEFAULT_DATETIME_FORMAT = 'YYYY-MM-DDTHH:mm:ssZ';
const POINT_TIME_INDEX = 1;

View File

@@ -1,4 +1,4 @@
import { toUtc, AbsoluteTimeRange } from '@grafana/ui';
import { toUtc, AbsoluteTimeRange } from '@grafana/data';
import { getShiftedTimeRange, getZoomedTimeRange } from './timePicker';

View File

@@ -1,4 +1,4 @@
import { TimeRange, toUtc, AbsoluteTimeRange } from '@grafana/ui';
import { TimeRange, toUtc, AbsoluteTimeRange } from '@grafana/data';
export const getShiftedTimeRange = (direction: number, origRange: TimeRange): AbsoluteTimeRange => {
const range = {

View File

@@ -1,5 +1,5 @@
import _ from 'lodash';
import { dateTime } from '@grafana/ui';
import { dateTime } from '@grafana/data';
import { BackendSrv } from 'app/core/services/backend_srv';
import { NavModelSrv } from 'app/core/core';
import { User } from 'app/core/services/context_srv';

View File

@@ -4,7 +4,7 @@ import appEvents from 'app/core/app_events';
import { CopyToClipboard } from 'app/core/components/CopyToClipboard/CopyToClipboard';
import { getBackendSrv } from '@grafana/runtime';
import { DashboardModel } from '../dashboard/state/DashboardModel';
import { LoadingPlaceholder } from '@grafana/ui/src';
import { LoadingPlaceholder } from '@grafana/ui';
export interface Props {
panelId: number;

View File

@@ -1,7 +1,7 @@
import { AlertRuleDTO, AlertRule, AlertRulesState } from 'app/types';
import { Action, ActionTypes } from './actions';
import alertDef from './alertDef';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime } from '@grafana/data';
export const initialState: AlertRulesState = { items: [], searchQuery: '', isLoading: false };

View File

@@ -1,8 +1,8 @@
import _ from 'lodash';
import { coreModule } from 'app/core/core';
import { MetricsPanelCtrl } from 'app/plugins/sdk';
import { AnnotationEvent } from '@grafana/ui';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { AnnotationEvent } from '@grafana/data';
import { dateTime } from '@grafana/data';
export class EventEditorCtrl {
panelCtrl: MetricsPanelCtrl;

View File

@@ -10,7 +10,7 @@ import {
} from '@grafana/ui';
import { MetricsPanelCtrl } from 'app/plugins/sdk';
import { AnnotationEvent } from '@grafana/ui';
import { AnnotationEvent } from '@grafana/data';
export class EventManager {
event: AnnotationEvent;

View File

@@ -19,7 +19,7 @@ import { store } from 'app/store/store';
import kbn from 'app/core/utils/kbn';
// Utils
import { dateTime, isDateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime, isDateTime } from '@grafana/data';
import { getTimeZone } from 'app/features/profile/state/selectors';
const timeRangeValidationEvents: ValidationEvents = {

View File

@@ -1,17 +1,17 @@
// Libaries
import React, { Component } from 'react';
import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc } from '@grafana/data';
// Types
import { DashboardModel } from '../../state';
import { LocationState } from 'app/types';
import { TimeRange, TimeOption } from '@grafana/ui';
import { TimeRange, TimeOption, RawTimeRange } from '@grafana/data';
// State
import { updateLocation } from 'app/core/actions';
// Components
import { TimePicker, RefreshPicker, RawTimeRange } from '@grafana/ui';
import { TimePicker, RefreshPicker } from '@grafana/ui';
// Utils & Services
import { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';

View File

@@ -1,6 +1,6 @@
import angular from 'angular';
import config from 'app/core/config';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime } from '@grafana/data';
import { appendQueryToUrl, toUrlParams } from 'app/core/utils/url';
/** @ngInject */

View File

@@ -4,7 +4,7 @@ import angular from 'angular';
import locationUtil from 'app/core/utils/location_util';
import { DashboardModel } from '../../state/DashboardModel';
import { HistoryListOpts, RevisionsModel, CalculateDiffOptions, HistorySrv } from './HistorySrv';
import { dateTime, toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime, toUtc } from '@grafana/data';
export class HistoryListCtrl {
appending: boolean;

View File

@@ -17,8 +17,8 @@ import config from 'app/core/config';
// Types
import { DashboardModel, PanelModel } from '../state';
import { LoadingState, PanelData, PanelPlugin } from '@grafana/ui';
import { ScopedVars } from '@grafana/ui';
import { ScopedVars, PanelData, PanelPlugin } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
const DEFAULT_PLUGIN_ERROR = 'Error in plugin';

View File

@@ -18,7 +18,8 @@ import config from 'app/core/config';
// Types
import { PanelModel } from '../state/PanelModel';
import { DashboardModel } from '../state/DashboardModel';
import { DataQuery, DataSourceSelectItem, PanelData, LoadingState } from '@grafana/ui/src/types';
import { DataQuery, DataSourceSelectItem, PanelData } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
import { PluginHelp } from 'app/core/components/PluginHelp/PluginHelp';
import { PanelQueryRunnerFormat } from '../state/PanelQueryRunner';
import { Unsubscribable } from 'rxjs';

View File

@@ -1,4 +1,5 @@
import { PanelData, LoadingState, DataQueryRequest } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
import { PanelData, DataQueryRequest } from '@grafana/ui';
import { filterPanelDataToQuery } from './QueryEditorRow';
function makePretendRequest(requestId: string, subRequests?: DataQueryRequest[]): DataQueryRequest {

View File

@@ -11,7 +11,8 @@ import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';
// Types
import { PanelModel } from '../state/PanelModel';
import { DataQuery, DataSourceApi, TimeRange, PanelData, LoadingState, DataQueryRequest } from '@grafana/ui';
import { DataQuery, DataSourceApi, PanelData, DataQueryRequest } from '@grafana/ui';
import { TimeRange, LoadingState } from '@grafana/data';
import { DashboardModel } from '../state/DashboardModel';
interface Props {

View File

@@ -2,7 +2,7 @@
import React, { PureComponent, ChangeEvent, FocusEvent } from 'react';
// Utils
import { isValidTimeSpan } from '@grafana/ui/src/utils/rangeutil';
import { isValidTimeSpan } from '@grafana/data/src/utils/rangeutil';
// Components
import { DataSourceSelectItem, EventsWithValidation, Input, InputStatus, Switch, ValidationEvents } from '@grafana/ui';

View File

@@ -4,7 +4,7 @@ import moment from 'moment';
import _ from 'lodash';
import $ from 'jquery';
import kbn from 'app/core/utils/kbn';
import * as dateMath from '@grafana/ui/src/utils/datemath';
import * as dateMath from '@grafana/data/src/utils/datemath';
import impressionSrv from 'app/core/services/impression_srv';
export class DashboardLoaderSrv {

View File

@@ -1,6 +1,6 @@
import { TimeSrv } from './TimeSrv';
import { ContextSrvStub } from 'test/specs/helpers';
import { isDateTime, dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { isDateTime, dateTime } from '@grafana/data';
describe('timeSrv', () => {
const rootScope = {

View File

@@ -4,14 +4,14 @@ import _ from 'lodash';
// Utils
import kbn from 'app/core/utils/kbn';
import coreModule from 'app/core/core_module';
import * as dateMath from '@grafana/ui/src/utils/datemath';
import * as dateMath from '@grafana/data/src/utils/datemath';
// Types
import { TimeRange, RawTimeRange, TimeZone } from '@grafana/ui';
import { TimeRange, RawTimeRange, TimeZone } from '@grafana/data';
import { ITimeoutService, ILocationService } from 'angular';
import { ContextSrv } from 'app/core/services/context_srv';
import { DashboardModel } from '../state/DashboardModel';
import { toUtc, dateTime, isDateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc, dateTime, isDateTime } from '@grafana/data';
import { getZoomedTimeRange } from 'app/core/utils/timePicker';
export class TimeSrv {

View File

@@ -13,10 +13,10 @@ import sortByKeys from 'app/core/utils/sort_by_keys';
// Types
import { PanelModel, GridPos } from './PanelModel';
import { DashboardMigrator } from './DashboardMigrator';
import { TimeRange, TimeZone } from '@grafana/ui';
import { TimeRange, TimeZone } from '@grafana/data';
import { UrlQueryValue } from '@grafana/runtime';
import { KIOSK_MODE_TV, DashboardMeta } from 'app/types';
import { toUtc, DateTimeInput, dateTime, isDateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc, DateTimeInput, dateTime, isDateTime } from '@grafana/data';
export interface CloneOptions {
saveVariables?: boolean;

View File

@@ -1,13 +1,8 @@
import { PanelQueryRunner } from './PanelQueryRunner';
import {
PanelData,
DataQueryRequest,
DataStreamObserver,
DataStreamState,
LoadingState,
ScopedVars,
} from '@grafana/ui/src/types';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { PanelData, DataQueryRequest, DataStreamObserver, DataStreamState, ScopedVars } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
import { dateTime } from '@grafana/data';
jest.mock('app/core/services/backend_srv');

View File

@@ -10,15 +10,9 @@ import templateSrv from 'app/features/templating/template_srv';
import { PanelQueryState } from './PanelQueryState';
// Types
import {
PanelData,
DataQuery,
TimeRange,
ScopedVars,
DataQueryRequest,
DataSourceApi,
DataSourceJsonData,
} from '@grafana/ui';
import { PanelData, DataQuery, ScopedVars, DataQueryRequest, DataSourceApi, DataSourceJsonData } from '@grafana/ui';
import { TimeRange } from '@grafana/data';
export interface QueryRunnerOptions<
TQuery extends DataQuery = DataQuery,

View File

@@ -1,6 +1,7 @@
import { toDataQueryError, PanelQueryState, getProcessedDataFrame } from './PanelQueryState';
import { MockDataSourceApi } from 'test/mocks/datasource_srv';
import { DataQueryResponse, LoadingState } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
import { DataQueryResponse } from '@grafana/ui';
import { getQueryOptions } from 'test/helpers/getQueryOptions';
describe('PanelQueryState', () => {

View File

@@ -4,20 +4,24 @@ import isEqual from 'lodash/isEqual';
// Utils & Services
import { getBackendSrv } from 'app/core/services/backend_srv';
import * as dateMath from '@grafana/ui/src/utils/datemath';
import { guessFieldTypes, toDataFrame, isDataFrame } from '@grafana/ui/src/utils';
import * as dateMath from '@grafana/data/src/utils/datemath';
import {
guessFieldTypes,
LoadingState,
toLegacyResponseData,
DataFrame,
toDataFrame,
isDataFrame,
} from '@grafana/data';
// Types
import {
DataSourceApi,
DataQueryRequest,
PanelData,
LoadingState,
toLegacyResponseData,
DataQueryError,
DataStreamObserver,
DataStreamState,
DataFrame,
DataQueryResponseData,
} from '@grafana/ui';

View File

@@ -1,7 +1,7 @@
import { TimeRange } from '@grafana/ui';
import { TimeRange } from '@grafana/data';
import { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';
import { advanceTo, clear } from 'jest-date-mock';
import { dateTime, DateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime, DateTime } from '@grafana/data';
const dashboardTimeRange: TimeRange = {
from: dateTime([2019, 1, 11, 12, 0]),

View File

@@ -4,12 +4,12 @@ import store from 'app/core/store';
// Models
import { DashboardModel } from 'app/features/dashboard/state/DashboardModel';
import { PanelModel } from 'app/features/dashboard/state/PanelModel';
import { TimeRange } from '@grafana/ui';
import { TimeRange } from '@grafana/data';
// Utils
import { isString as _isString } from 'lodash';
import * as rangeUtil from '@grafana/ui/src/utils/rangeutil';
import * as dateMath from '@grafana/ui/src/utils/datemath';
import * as rangeUtil from '@grafana/data/src/utils/rangeutil';
import * as dateMath from '@grafana/data/src/utils/datemath';
import appEvents from 'app/core/app_events';
import config from 'app/core/config';

View File

@@ -6,7 +6,7 @@ import classNames from 'classnames';
import DataSourcesListItem from './DataSourcesListItem';
// Types
import { DataSourceSettings } from '@grafana/ui/src/types';
import { DataSourceSettings } from '@grafana/ui';
import { LayoutMode, LayoutModes } from '../../core/components/LayoutSelector/LayoutSelector';
export interface Props {

View File

@@ -1,5 +1,5 @@
import React, { PureComponent } from 'react';
import { DataSourceSettings } from '@grafana/ui/src/types';
import { DataSourceSettings } from '@grafana/ui';
export interface Props {
dataSource: DataSourceSettings;

View File

@@ -1,4 +1,4 @@
import { DataSourceSettings } from '@grafana/ui/src/types';
import { DataSourceSettings } from '@grafana/ui';
export const getMockDataSources = (amount: number): DataSourceSettings[] => {
const dataSources = [];

View File

@@ -1,4 +1,4 @@
import { DataSourceSettings, DataSourcePluginMeta } from '@grafana/ui/src/types';
import { DataSourceSettings, DataSourcePluginMeta } from '@grafana/ui';
export const getDataSources = state => {
const regex = new RegExp(state.searchQuery, 'i');

View File

@@ -1,5 +1,5 @@
import React, { PureComponent } from 'react';
import { toDuration } from '@grafana/ui/src/utils/moment_wrapper';
import { toDuration } from '@grafana/data';
const INTERVAL = 150;

View File

@@ -30,7 +30,9 @@ import {
} from './state/actions';
// Types
import { RawTimeRange, DataQuery, ExploreStartPageProps, DataSourceApi, DataQueryError } from '@grafana/ui';
import { RawTimeRange } from '@grafana/data';
import { DataQuery, ExploreStartPageProps, DataSourceApi, DataQueryError } from '@grafana/ui';
import {
ExploreItemState,
ExploreUrlState,

View File

@@ -3,12 +3,12 @@ import React, { Component } from 'react';
// Types
import { ExploreId } from 'app/types';
import { TimeRange, TimeOption, TimeZone, SetInterval, toUtc, dateTime } from '@grafana/ui';
import { TimeRange, TimeOption, TimeZone, toUtc, dateTime, RawTimeRange } from '@grafana/data';
// State
// Components
import { TimePicker, RefreshPicker, RawTimeRange } from '@grafana/ui';
import { TimePicker, RefreshPicker, SetInterval } from '@grafana/ui';
// Utils & Services
import { defaultSelectOptions } from '@grafana/ui/src/components/TimePicker/TimePicker';

View File

@@ -3,7 +3,8 @@ import { connect } from 'react-redux';
import { hot } from 'react-hot-loader';
import { ExploreId, ExploreMode } from 'app/types/explore';
import { DataSourceSelectItem, RawTimeRange, TimeZone, TimeRange, SelectOptionItem, LoadingState } from '@grafana/ui';
import { DataSourceSelectItem, SelectOptionItem } from '@grafana/ui';
import { RawTimeRange, TimeZone, TimeRange, LoadingState } from '@grafana/data';
import { DataSourcePicker } from 'app/core/components/Select/DataSourcePicker';
import { StoreState } from 'app/types/store';
import {

View File

@@ -2,7 +2,7 @@ import React from 'react';
import { shallow } from 'enzyme';
import { Graph } from './Graph';
import { mockData } from './__mocks__/mockData';
import { DefaultTimeZone } from '@grafana/ui';
import { DefaultTimeZone } from '@grafana/data';
const setup = (propOverrides?: object) => {
const props = {

View File

@@ -7,7 +7,8 @@ import 'vendor/flot/jquery.flot.time';
import 'vendor/flot/jquery.flot.selection';
import 'vendor/flot/jquery.flot.stack';
import { TimeZone, AbsoluteTimeRange, GraphLegend, LegendItem, LegendDisplayMode } from '@grafana/ui';
import { GraphLegend, LegendItem, LegendDisplayMode } from '@grafana/ui';
import { TimeZone, AbsoluteTimeRange } from '@grafana/data';
import TimeSeries from 'app/core/time_series2';
const MAX_NUMBER_OF_TIME_SERIES = 20;

View File

@@ -1,7 +1,7 @@
import React, { PureComponent } from 'react';
import { hot } from 'react-hot-loader';
import { connect } from 'react-redux';
import { TimeZone, AbsoluteTimeRange, LoadingState } from '@grafana/ui';
import { TimeZone, AbsoluteTimeRange, LoadingState } from '@grafana/data';
import { ExploreId, ExploreItemState } from 'app/types/explore';
import { StoreState } from 'app/types';

View File

@@ -1,15 +1,8 @@
import React, { PureComponent } from 'react';
import { css, cx } from 'emotion';
import {
Themeable,
withTheme,
GrafanaTheme,
selectThemeVariant,
LinkButton,
LogsModel,
LogRowModel,
TimeZone,
} from '@grafana/ui';
import { Themeable, withTheme, GrafanaTheme, selectThemeVariant, LinkButton } from '@grafana/ui';
import { LogsModel, LogRowModel, TimeZone } from '@grafana/data';
import ElapsedTime from './ElapsedTime';

View File

@@ -1,7 +1,7 @@
import React, { PureComponent } from 'react';
import { LogLabelStats } from './LogLabelStats';
import { LogRowModel, LogLabelStatsModel } from '@grafana/ui';
import { LogRowModel, LogLabelStatsModel } from '@grafana/data';
import { calculateLogsLabelStats } from 'app/core/logs_model';
interface Props {

View File

@@ -1,6 +1,6 @@
import React, { PureComponent } from 'react';
import classnames from 'classnames';
import { LogLabelStatsModel } from '@grafana/ui';
import { LogLabelStatsModel } from '@grafana/data';
function LogLabelStatsRow(logLabelStatsModel: LogLabelStatsModel) {
const { active, count, proportion, value } = logLabelStatsModel;

View File

@@ -1,7 +1,7 @@
import React, { PureComponent } from 'react';
import { LogLabel } from './LogLabel';
import { Labels, LogRowModel } from '@grafana/ui';
import { Labels, LogRowModel } from '@grafana/data';
interface Props {
getRows?: () => LogRowModel[];

View File

@@ -16,16 +16,9 @@ import {
HasMoreContextRows,
LogRowContextQueryErrors,
} from './LogRowContextProvider';
import {
ThemeContext,
selectThemeVariant,
GrafanaTheme,
DataQueryResponse,
LogRowModel,
LogLabelStatsModel,
LogsParser,
TimeZone,
} from '@grafana/ui';
import { ThemeContext, selectThemeVariant, GrafanaTheme, DataQueryResponse } from '@grafana/ui';
import { LogRowModel, LogLabelStatsModel, LogsParser, TimeZone } from '@grafana/data';
import { LogRowContext } from './LogRowContext';
import tinycolor from 'tinycolor2';

View File

@@ -7,8 +7,9 @@ import {
ClickOutsideWrapper,
CustomScrollbar,
DataQueryError,
LogRowModel,
} from '@grafana/ui';
import { LogRowModel } from '@grafana/data';
import { css, cx } from 'emotion';
import { LogRowContextRows, HasMoreContextRows, LogRowContextQueryErrors } from './LogRowContextProvider';
import { Alert } from './Error';

View File

@@ -1,4 +1,5 @@
import { DataQueryResponse, DataQueryError, LogRowModel } from '@grafana/ui';
import { DataQueryResponse, DataQueryError } from '@grafana/ui';
import { LogRowModel } from '@grafana/data';
import { useState, useEffect } from 'react';
import flatten from 'lodash/flatten';
import useAsync from 'react-use/lib/useAsync';

View File

@@ -1,10 +1,10 @@
import _ from 'lodash';
import React, { PureComponent } from 'react';
import * as rangeUtil from '@grafana/ui/src/utils/rangeutil';
import * as rangeUtil from '@grafana/data/src/utils/rangeutil';
import { Switch } from '@grafana/ui';
import {
RawTimeRange,
Switch,
LogLevel,
TimeZone,
AbsoluteTimeRange,
@@ -12,7 +12,7 @@ import {
LogsModel,
LogsDedupStrategy,
LogRowModel,
} from '@grafana/ui';
} from '@grafana/data';
import TimeSeries from 'app/core/time_series2';
import ToggleButtonGroup, { ToggleButton } from 'app/core/components/ToggleButtonGroup/ToggleButtonGroup';

View File

@@ -1,18 +1,19 @@
import React, { PureComponent } from 'react';
import { hot } from 'react-hot-loader';
import { connect } from 'react-redux';
import { DataSourceApi } from '@grafana/ui';
import {
RawTimeRange,
LogLevel,
TimeZone,
AbsoluteTimeRange,
DataSourceApi,
LogsModel,
LogRowModel,
LogsDedupStrategy,
LoadingState,
TimeRange,
} from '@grafana/ui';
} from '@grafana/data';
import { ExploreId, ExploreItemState } from 'app/types/explore';
import { StoreState } from 'app/types';

View File

@@ -7,9 +7,10 @@ import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';
// Types
import { Emitter } from 'app/core/utils/emitter';
import { DataQuery, TimeRange } from '@grafana/ui';
import { DataQuery } from '@grafana/ui';
import { TimeRange } from '@grafana/data';
import 'app/features/plugins/plugin_loader';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime } from '@grafana/data';
interface QueryEditorProps {
error?: any;

View File

@@ -13,15 +13,8 @@ import { changeQuery, modifyQueries, runQueries, addQueryRow } from './state/act
// Types
import { StoreState } from 'app/types';
import {
TimeRange,
DataQuery,
DataSourceApi,
QueryFixAction,
DataSourceStatus,
PanelData,
DataQueryError,
} from '@grafana/ui';
import { TimeRange } from '@grafana/data';
import { DataQuery, DataSourceApi, QueryFixAction, DataSourceStatus, PanelData, DataQueryError } from '@grafana/ui';
import { HistoryItem, ExploreItemState, ExploreId, ExploreMode } from 'app/types/explore';
import { Emitter } from 'app/core/utils/emitter';
import { highlightLogsExpressionAction, removeQueryRowAction } from './state/actionTypes';

View File

@@ -1,7 +1,8 @@
import React, { PureComponent } from 'react';
import ElapsedTime from './ElapsedTime';
import { PanelData, LoadingState } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
import { PanelData } from '@grafana/ui';
function formatLatency(value) {
return `${(value / 1000).toFixed(1)}s`;

View File

@@ -9,7 +9,7 @@ import { toggleTable } from './state/actions';
import Table from './Table';
import Panel from './Panel';
import TableModel from 'app/core/table_model';
import { LoadingState } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
interface TableContainerProps {
exploreId: ExploreId;

View File

@@ -1,21 +1,24 @@
// Types
import { Emitter } from 'app/core/core';
import {
RawTimeRange,
DataQuery,
DataSourceSelectItem,
DataSourceApi,
QueryFixAction,
DataQueryError,
DataQueryResponseData,
} from '@grafana/ui';
import {
RawTimeRange,
LogLevel,
TimeRange,
DataQueryError,
DataFrame,
LogsModel,
TimeSeries,
DataQueryResponseData,
LoadingState,
AbsoluteTimeRange,
} from '@grafana/ui/src/types';
} from '@grafana/data';
import { ExploreId, ExploreItemState, HistoryItem, ExploreUIState, ExploreMode, QueryOptions } from 'app/types/explore';
import { actionCreatorFactory, noPayloadActionCreatorFactory, ActionOf } from 'app/core/redux/actionCreatorFactory';
import TableModel from 'app/core/table_model';

View File

@@ -17,8 +17,8 @@ import { Emitter } from 'app/core/core';
import { ActionOf } from 'app/core/redux/actionCreatorFactory';
import { makeInitialUpdateState } from './reducers';
import { DataQuery } from '@grafana/ui/src/types/datasource';
import { DefaultTimeZone, RawTimeRange, LogsDedupStrategy } from '@grafana/ui';
import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { DefaultTimeZone, RawTimeRange, LogsDedupStrategy } from '@grafana/data';
import { toUtc } from '@grafana/data';
jest.mock('app/features/plugins/datasource_srv', () => ({
getDatasourceSrv: () => ({

View File

@@ -17,15 +17,9 @@ import {
// Types
import { ThunkResult } from 'app/types';
import {
RawTimeRange,
DataSourceApi,
DataQuery,
DataSourceSelectItem,
QueryFixAction,
LogsDedupStrategy,
AbsoluteTimeRange,
} from '@grafana/ui';
import { DataSourceApi, DataQuery, DataSourceSelectItem, QueryFixAction } from '@grafana/ui';
import { RawTimeRange, LogsDedupStrategy, AbsoluteTimeRange } from '@grafana/data';
import { ExploreId, ExploreUIState, QueryTransaction, ExploreMode } from 'app/types/explore';
import {
updateDatasourceInstanceAction,

View File

@@ -1,6 +1,6 @@
import { Epic } from 'redux-observable';
import { map, throttleTime } from 'rxjs/operators';
import { LoadingState } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
import { StoreState } from 'app/types';
import { ActionOf } from '../../../../core/redux/actionCreatorFactory';

View File

@@ -8,7 +8,7 @@ import {
updateTimeRangeAction,
runQueriesAction,
} from '../actionTypes';
import { DataFrame, LoadingState } from '@grafana/ui';
import { DataFrame, LoadingState } from '@grafana/data';
import { processQueryResultsEpic } from './processQueryResultsEpic';
import TableModel from 'app/core/table_model';

View File

@@ -2,7 +2,7 @@ import _ from 'lodash';
import { Epic } from 'redux-observable';
import { mergeMap } from 'rxjs/operators';
import { NEVER } from 'rxjs';
import { LoadingState } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
import { ActionOf } from 'app/core/redux/actionCreatorFactory';
import { StoreState } from 'app/types/store';

View File

@@ -14,7 +14,8 @@ import {
clearQueriesAction,
stateSaveAction,
} from '../actionTypes';
import { LoadingState, DataQueryRequest, DataFrame, FieldType } from '@grafana/ui';
import { LoadingState, DataFrame, FieldType } from '@grafana/data';
import { DataQueryRequest } from '@grafana/ui';
const testContext = () => {
const series: DataFrame[] = [

View File

@@ -3,15 +3,10 @@ import { Observable, Subject } from 'rxjs';
import { mergeMap, catchError, takeUntil, filter } from 'rxjs/operators';
import _, { isString } from 'lodash';
import { isLive } from '@grafana/ui/src/components/RefreshPicker/RefreshPicker';
import {
DataStreamState,
LoadingState,
DataQueryResponse,
DataFrame,
DataQueryResponseData,
AbsoluteTimeRange,
} from '@grafana/ui';
import * as dateMath from '@grafana/ui/src/utils/datemath';
import { DataStreamState, DataQueryResponse, DataQueryResponseData } from '@grafana/ui';
import { LoadingState, DataFrame, AbsoluteTimeRange } from '@grafana/data';
import * as dateMath from '@grafana/data/src/utils/datemath';
import { ActionOf } from 'app/core/redux/actionCreatorFactory';
import { StoreState } from 'app/types/store';

View File

@@ -1,7 +1,7 @@
import { Epic } from 'redux-observable';
import { mergeMap } from 'rxjs/operators';
import { RawTimeRange, TimeRange } from '@grafana/ui/src/types/time';
import { isDateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { RawTimeRange, TimeRange } from '@grafana/data';
import { isDateTime } from '@grafana/data';
import { ActionOf } from 'app/core/redux/actionCreatorFactory';
import { StoreState } from 'app/types/store';

View File

@@ -1,4 +1,4 @@
import { dateTime, DefaultTimeZone } from '@grafana/ui';
import { dateTime, DefaultTimeZone } from '@grafana/data';
import { epicTester } from 'test/core/redux/epicTester';
import { mockExploreState } from 'test/mocks/mockExploreState';

View File

@@ -1,6 +1,6 @@
import { Epic } from 'redux-observable';
import { map } from 'rxjs/operators';
import { AbsoluteTimeRange, RawTimeRange } from '@grafana/ui';
import { AbsoluteTimeRange, RawTimeRange } from '@grafana/data';
import { ActionOf } from 'app/core/redux/actionCreatorFactory';
import { StoreState } from 'app/types/store';

View File

@@ -24,7 +24,8 @@ import { ActionOf } from 'app/core/redux/actionCreatorFactory';
import { updateLocation } from 'app/core/actions/location';
import { serializeStateToUrlParam } from 'app/core/utils/explore';
import TableModel from 'app/core/table_model';
import { DataSourceApi, DataQuery, LogsModel, LogsDedupStrategy, LoadingState } from '@grafana/ui';
import { DataSourceApi, DataQuery } from '@grafana/ui';
import { LogsModel, LogsDedupStrategy, LoadingState } from '@grafana/data';
describe('Explore item reducer', () => {
describe('scanning', () => {

View File

@@ -9,7 +9,8 @@ import {
sortLogsResult,
} from 'app/core/utils/explore';
import { ExploreItemState, ExploreState, ExploreId, ExploreUpdateState, ExploreMode } from 'app/types/explore';
import { DataQuery, LoadingState } from '@grafana/ui';
import { LoadingState } from '@grafana/data';
import { DataQuery } from '@grafana/ui';
import {
HigherOrderAction,
ActionTypes,

View File

@@ -1,5 +1,5 @@
import { deduplicatedLogsSelector } from './selectors';
import { LogsDedupStrategy } from '@grafana/ui';
import { LogsDedupStrategy } from '@grafana/data';
import { ExploreItemState } from 'app/types';
const state = {

View File

@@ -1,4 +1,4 @@
jest.mock('@grafana/ui/src/utils/moment_wrapper', () => ({
jest.mock('@grafana/data/src/utils/moment_wrapper', () => ({
dateTime: (ts: any) => {
return {
valueOf: () => ts,
@@ -16,7 +16,8 @@ jest.mock('@grafana/ui/src/utils/moment_wrapper', () => ({
import { ResultProcessor } from './ResultProcessor';
import { ExploreItemState, ExploreMode } from 'app/types/explore';
import TableModel from 'app/core/table_model';
import { toFixed, TimeSeries, LogRowModel, LogsMetaItem } from '@grafana/ui';
import { toFixed } from '@grafana/ui';
import { TimeSeries, LogRowModel, LogsMetaItem } from '@grafana/data';
const testContext = (options: any = {}) => {
const response = [

View File

@@ -1,13 +1,6 @@
import {
DataQueryResponse,
TableData,
isTableData,
LogsModel,
toDataFrame,
guessFieldTypes,
DataQueryResponseData,
TimeSeries,
} from '@grafana/ui';
import { DataQueryResponse, DataQueryResponseData } from '@grafana/ui';
import { TableData, isTableData, LogsModel, toDataFrame, guessFieldTypes, TimeSeries } from '@grafana/data';
import { ExploreItemState, ExploreMode } from 'app/types/explore';
import { getProcessedDataFrame } from 'app/features/dashboard/state/PanelQueryState';

View File

@@ -6,17 +6,9 @@ import { PanelCtrl } from 'app/features/panel/panel_ctrl';
import { getExploreUrl } from 'app/core/utils/explore';
import { applyPanelTimeOverrides, getResolution } from 'app/features/dashboard/utils/panel';
import { ContextSrv } from 'app/core/services/context_srv';
import {
toLegacyResponseData,
isDataFrame,
LegacyResponseData,
TimeRange,
DataSourceApi,
PanelData,
LoadingState,
DataQueryResponse,
DataFrame,
} from '@grafana/ui';
import { toLegacyResponseData, isDataFrame, TimeRange, LoadingState, DataFrame } from '@grafana/data';
import { LegacyResponseData, DataSourceApi, PanelData, DataQueryResponse } from '@grafana/ui';
import { Unsubscribable } from 'rxjs';
import { PanelModel } from 'app/features/dashboard/state';
import { PanelQueryRunnerFormat } from '../dashboard/state/PanelQueryRunner';

View File

@@ -3,8 +3,8 @@ import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
import templateSrv, { TemplateSrv } from 'app/features/templating/template_srv';
import coreModule from 'app/core/core_module';
import { appendQueryToUrl, toUrlParams } from 'app/core/utils/url';
import { DataLink, VariableSuggestion, KeyValue, ScopedVars, DateTime, dateTime } from '@grafana/ui';
import { TimeSeriesValue } from '@grafana/ui';
import { DataLink, VariableSuggestion, KeyValue, ScopedVars } from '@grafana/ui';
import { TimeSeriesValue, DateTime, dateTime } from '@grafana/data';
import { deprecationWarning, VariableOrigin } from '@grafana/ui';
export const DataLinkBuiltInVars = {

View File

@@ -8,7 +8,7 @@ import { importDataSourcePlugin } from './plugin_loader';
import { DataSourceSrv as DataSourceService, getDataSourceSrv as getDataSourceService } from '@grafana/runtime';
// Types
import { DataSourceApi, DataSourceSelectItem, ScopedVars } from '@grafana/ui/src/types';
import { DataSourceApi, DataSourceSelectItem, ScopedVars } from '@grafana/ui';
export class DatasourceSrv implements DataSourceService {
datasources: { [name: string]: DataSourceApi };

View File

@@ -4,7 +4,7 @@ import _ from 'lodash';
import config from 'app/core/config';
import coreModule from 'app/core/core_module';
import { DataSourceApi } from '@grafana/ui/src/types';
import { DataSourceApi } from '@grafana/ui';
import { importPanelPlugin, importDataSourcePlugin, importAppPlugin } from './plugin_loader';
/** @ngInject */

View File

@@ -18,8 +18,8 @@ import config from 'app/core/config';
import TimeSeries from 'app/core/time_series2';
import TableModel from 'app/core/table_model';
import { coreModule, appEvents, contextSrv } from 'app/core/core';
import { DataSourcePlugin, AppPlugin, PanelPlugin, PluginMeta, DataSourcePluginMeta } from '@grafana/ui/src/types';
import * as datemath from '@grafana/ui/src/utils/datemath';
import { DataSourcePlugin, AppPlugin, PanelPlugin, PluginMeta, DataSourcePluginMeta } from '@grafana/ui';
import * as dateMath from '@grafana/data/src/utils/datemath';
import * as fileExport from 'app/core/utils/file_export';
import * as flatten from 'app/core/utils/flatten';
import * as ticks from 'app/core/utils/ticks';
@@ -109,7 +109,7 @@ exposeToPlugin('app/core/services/backend_srv', {
});
exposeToPlugin('app/plugins/sdk', sdk);
exposeToPlugin('app/core/utils/datemath', datemath);
exposeToPlugin('app/core/utils/datemath', dateMath);
exposeToPlugin('app/core/utils/file_export', fileExport);
exposeToPlugin('app/core/utils/flatten', flatten);
exposeToPlugin('app/core/utils/kbn', kbn);

View File

@@ -1,7 +1,7 @@
import config from 'app/core/config';
import 'app/features/plugins/datasource_srv';
import { DatasourceSrv } from 'app/features/plugins/datasource_srv';
import { PluginMeta, DataSourcePluginMeta } from '@grafana/ui/src/types';
import { PluginMeta, DataSourcePluginMeta } from '@grafana/ui';
// Datasource variable $datasource with current value 'BBB'
const templateSrv = {

View File

@@ -1,6 +1,6 @@
import config from 'app/core/config';
import { coreModule } from 'app/core/core';
import { dateTime } from '@grafana/ui';
import { dateTime } from '@grafana/data';
import { UserSession } from 'app/types';
export class ProfileCtrl {

View File

@@ -2,7 +2,7 @@ import '../all';
import { VariableSrv } from '../variable_srv';
import { DashboardModel } from '../../dashboard/state/DashboardModel';
import $q from 'q';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime } from '@grafana/data';
import { CustomVariable } from '../custom_variable';
describe('VariableSrv', function(this: any) {

View File

@@ -1,7 +1,8 @@
import kbn from 'app/core/utils/kbn';
import _ from 'lodash';
import { variableRegex } from 'app/features/templating/variable';
import { TimeRange, ScopedVars } from '@grafana/ui/src';
import { ScopedVars } from '@grafana/ui';
import { TimeRange } from '@grafana/data';
function luceneEscape(value) {
return value.replace(/([\!\*\+\-\=<>\s\&\|\(\)\[\]\{\}\^\~\?\:\\/"])/g, '\\$1');

View File

@@ -11,7 +11,7 @@ import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
import { DashboardModel } from 'app/features/dashboard/state/DashboardModel';
// Types
import { TimeRange } from '@grafana/ui/src';
import { TimeRange } from '@grafana/data';
export class VariableSrv {
dashboard: DashboardModel;

View File

@@ -1,9 +1,9 @@
import angular from 'angular';
import _ from 'lodash';
import * as dateMath from '@grafana/ui/src/utils/datemath';
import * as dateMath from '@grafana/data/src/utils/datemath';
import kbn from 'app/core/utils/kbn';
import { CloudWatchQuery } from './types';
import { DataSourceApi, DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui/src/types';
import { DataSourceApi, DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui';
import { BackendSrv } from 'app/core/services/backend_srv';
import { TemplateSrv } from 'app/features/templating/template_srv';
import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';

View File

@@ -1,6 +1,6 @@
import '../datasource';
import CloudWatchDatasource from '../datasource';
import * as dateMath from '@grafana/ui/src/utils/datemath';
import * as dateMath from '@grafana/data/src/utils/datemath';
import { TemplateSrv } from 'app/features/templating/template_srv';
import { CustomVariable } from 'app/features/templating/all';
import _ from 'lodash';

View File

@@ -1,4 +1,4 @@
import { DataQuery } from '@grafana/ui/src/types';
import { DataQuery } from '@grafana/ui';
export interface CloudWatchQuery extends DataQuery {
id: string;

View File

@@ -4,7 +4,7 @@ import { DataSourceApi, DataSourceInstanceSettings, DataQueryRequest, DataQueryR
import { ElasticResponse } from './elastic_response';
import { IndexPattern } from './index_pattern';
import { ElasticQueryBuilder } from './query_builder';
import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc } from '@grafana/data';
import * as queryDef from './query_def';
import { BackendSrv } from 'app/core/services/backend_srv';
import { TemplateSrv } from 'app/features/templating/template_srv';

View File

@@ -2,7 +2,8 @@ import _ from 'lodash';
import flatten from 'app/core/utils/flatten';
import * as queryDef from './query_def';
import TableModel from 'app/core/table_model';
import { DataFrame, DataQueryResponse, toDataFrame, FieldType } from '@grafana/ui';
import { DataFrame, toDataFrame, FieldType } from '@grafana/data';
import { DataQueryResponse } from '@grafana/ui';
export class ElasticResponse {
constructor(private targets, private response) {

View File

@@ -1,4 +1,4 @@
import { toUtc, dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc, dateTime } from '@grafana/data';
const intervalMap = {
Hourly: { startOf: 'hour', amount: 'hours' },

View File

@@ -1,8 +1,8 @@
import angular, { IQService } from 'angular';
import * as dateMath from '@grafana/ui/src/utils/datemath';
import * as dateMath from '@grafana/data/src/utils/datemath';
import _ from 'lodash';
import { ElasticDatasource, getMaxConcurrenShardRequestOrDefault } from '../datasource';
import { toUtc, dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc, dateTime } from '@grafana/data';
import { BackendSrv } from 'app/core/services/backend_srv';
import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
import { TemplateSrv } from 'app/features/templating/template_srv';

View File

@@ -1,7 +1,7 @@
///<amd-dependency path="test/specs/helpers" name="helpers" />
import { IndexPattern } from '../index_pattern';
import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc } from '@grafana/data';
describe('IndexPattern', () => {
describe('when getting index for today', () => {

View File

@@ -1,7 +1,7 @@
import AzureMonitorDatasource from '../datasource';
import Q from 'q';
import { TemplateSrv } from 'app/features/templating/template_srv';
import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc } from '@grafana/data';
describe('AppInsightsDatasource', () => {
const ctx: any = {

View File

@@ -1,5 +1,5 @@
import AppInsightsQuerystringBuilder from './app_insights_querystring_builder';
import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc } from '@grafana/data';
describe('AppInsightsQuerystringBuilder', () => {
let builder: AppInsightsQuerystringBuilder;

View File

@@ -1,5 +1,5 @@
import _ from 'lodash';
import { dateTime } from '@grafana/ui/src/utils/moment_wrapper';
import { dateTime } from '@grafana/data';
export default class ResponseParser {
constructor(private results: any) {}

View File

@@ -4,7 +4,7 @@ import FakeSchemaData from './__mocks__/schema';
import Q from 'q';
import { TemplateSrv } from 'app/features/templating/template_srv';
import { KustoSchema } from '../types';
import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { toUtc } from '@grafana/data';
describe('AzureLogAnalyticsDatasource', () => {
const ctx: any = {

View File

@@ -2,7 +2,7 @@ import _ from 'lodash';
import LogAnalyticsQuerystringBuilder from '../log_analytics/querystring_builder';
import ResponseParser from './response_parser';
import { AzureMonitorQuery, AzureDataSourceJsonData } from '../types';
import { DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui/src/types';
import { DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui';
import { BackendSrv } from 'app/core/services/backend_srv';
import { TemplateSrv } from 'app/features/templating/template_srv';
import { IQService } from 'angular';

Some files were not shown because too many files have changed in this diff Show More