diff --git a/public/app/core/components/PermissionList/AddPermission.tsx b/public/app/core/components/PermissionList/AddPermission.tsx index 2ba2cea1e61..8e23d9849af 100644 --- a/public/app/core/components/PermissionList/AddPermission.tsx +++ b/public/app/core/components/PermissionList/AddPermission.tsx @@ -5,7 +5,7 @@ import { UserPicker } from 'app/core/components/Select/UserPicker'; import { TeamPicker } from 'app/core/components/Select/TeamPicker'; import { Button, Form, HorizontalGroup, Select, stylesFactory } from '@grafana/ui'; import { GrafanaTheme, SelectableValue } from '@grafana/data'; -import { Team, User } from 'app/types'; +import { OrgUser, Team } from 'app/types'; import { dashboardPermissionLevels, dashboardAclTargets, @@ -58,7 +58,7 @@ class AddPermissions extends Component { } }; - onUserSelected = (user: User) => { + onUserSelected = (user: SelectableValue) => { this.setState({ userId: user && !Array.isArray(user) ? user.id : 0 }); }; diff --git a/public/app/core/components/Select/UserPicker.tsx b/public/app/core/components/Select/UserPicker.tsx index 115c9e720f7..b001eb7fafb 100644 --- a/public/app/core/components/Select/UserPicker.tsx +++ b/public/app/core/components/Select/UserPicker.tsx @@ -9,10 +9,11 @@ import { AsyncSelect } from '@grafana/ui'; import { getBackendSrv } from '@grafana/runtime'; // Types -import { User } from 'app/types'; +import { OrgUser } from 'app/types'; +import { SelectableValue } from '@grafana/data'; export interface Props { - onSelected: (user: User) => void; + onSelected: (user: SelectableValue) => void; className?: string; } @@ -43,8 +44,8 @@ export class UserPicker extends Component { return getBackendSrv() .get(`/api/org/users/lookup?query=${query}&limit=100`) - .then((result: any) => { - return result.map((user: any) => ({ + .then((result: OrgUser[]) => { + return result.map((user) => ({ id: user.userId, value: user.userId, label: user.login, diff --git a/public/app/features/dashboard/state/reducers.ts b/public/app/features/dashboard/state/reducers.ts index 32f6e7f7510..71b394b4b2e 100644 --- a/public/app/features/dashboard/state/reducers.ts +++ b/public/app/features/dashboard/state/reducers.ts @@ -1,4 +1,4 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { createSlice, PayloadAction, Draft } from '@reduxjs/toolkit'; import { DashboardAclDTO, DashboardInitError, @@ -32,13 +32,13 @@ const dashbardSlice = createSlice({ loadDashboardPermissions: (state, action: PayloadAction) => { state.permissions = processAclItems(action.payload); }, - dashboardInitFetching: (state, action: PayloadAction) => { + dashboardInitFetching: (state) => { state.initPhase = DashboardInitPhase.Fetching; }, - dashboardInitServices: (state, action: PayloadAction) => { + dashboardInitServices: (state) => { state.initPhase = DashboardInitPhase.Services; }, - dashboardInitSlow: (state, action: PayloadAction) => { + dashboardInitSlow: (state) => { state.isInitSlow = true; }, dashboardInitCompleted: (state, action: PayloadAction) => { @@ -59,7 +59,7 @@ const dashbardSlice = createSlice({ return new DashboardModel({ title: 'Dashboard init failed' }, { canSave: false, canEdit: false }); }; }, - cleanUpDashboard: (state, action: PayloadAction) => { + cleanUpDashboard: (state) => { state.panels = {}; state.initPhase = DashboardInitPhase.NotStarted; state.isInitSlow = false; @@ -69,17 +69,17 @@ const dashbardSlice = createSlice({ setDashboardQueriesToUpdateOnLoad: (state, action: PayloadAction) => { state.modifiedQueries = action.payload; }, - clearDashboardQueriesToUpdateOnLoad: (state, action: PayloadAction) => { + clearDashboardQueriesToUpdateOnLoad: (state) => { state.modifiedQueries = null; }, - panelModelAndPluginReady: (state: DashboardState, action: PayloadAction) => { + panelModelAndPluginReady: (state, action: PayloadAction) => { updatePanelState(state, action.payload.panelId, { plugin: action.payload.plugin }); }, - cleanUpEditPanel: (state, action: PayloadAction) => { + cleanUpEditPanel: (state) => { // TODO: refactor, since the state should be mutated by copying only delete state.panels[EDIT_PANEL_ID]; }, - setPanelAngularComponent: (state: DashboardState, action: PayloadAction) => { + setPanelAngularComponent: (state, action: PayloadAction) => { updatePanelState(state, action.payload.panelId, { angularComponent: action.payload.angularComponent }); }, addPanel: (state, action: PayloadAction) => { @@ -89,7 +89,7 @@ const dashbardSlice = createSlice({ }, }); -export function updatePanelState(state: DashboardState, panelId: number, ps: Partial) { +export function updatePanelState(state: Draft, panelId: number, ps: Partial) { if (!state.panels[panelId]) { state.panels[panelId] = ps as PanelState; } else { diff --git a/public/app/features/panel/panel_ctrl.ts b/public/app/features/panel/panel_ctrl.ts index 704ee886e24..0673742995b 100644 --- a/public/app/features/panel/panel_ctrl.ts +++ b/public/app/features/panel/panel_ctrl.ts @@ -24,8 +24,8 @@ export class PanelCtrl { $injector: auto.IInjectorService; $timeout: any; editModeInitiated = false; - height: number; - width: number; + declare height: number; + declare width: number; containerHeight: any; events: EventBusExtended; loading = false; diff --git a/public/app/features/playlist/PlaylistSrv.ts b/public/app/features/playlist/PlaylistSrv.ts index 54910f8958b..b959d5eed17 100644 --- a/public/app/features/playlist/PlaylistSrv.ts +++ b/public/app/features/playlist/PlaylistSrv.ts @@ -14,15 +14,15 @@ export const queryParamsToPreserve: { [key: string]: boolean } = { export class PlaylistSrv { private nextTimeoutId: any; - private dashboards: Array<{ url: string }>; - private index: number; - private interval: number; - private startUrl: string; + private declare dashboards: Array<{ url: string }>; + private index = 0; + private declare interval: number; + private declare startUrl: string; private numberOfLoops = 0; - private validPlaylistUrl: string; + private declare validPlaylistUrl: string; private locationListenerUnsub?: () => void; - isPlaying: boolean; + isPlaying = false; constructor() { this.locationUpdated = this.locationUpdated.bind(this); diff --git a/public/app/features/teams/TeamMembers.tsx b/public/app/features/teams/TeamMembers.tsx index 35769505fdb..af1d812fc69 100644 --- a/public/app/features/teams/TeamMembers.tsx +++ b/public/app/features/teams/TeamMembers.tsx @@ -3,7 +3,7 @@ import { connect } from 'react-redux'; import { SlideDown } from 'app/core/components/Animations/SlideDown'; import { UserPicker } from 'app/core/components/Select/UserPicker'; import { TagBadge } from 'app/core/components/TagFilter/TagBadge'; -import { TeamMember, User } from 'app/types'; +import { TeamMember, OrgUser } from 'app/types'; import { addTeamMember } from './state/actions'; import { getSearchMemberQuery, isSignedInUserTeamAdmin } from './state/selectors'; import { FilterInput } from 'app/core/components/FilterInput/FilterInput'; @@ -14,6 +14,7 @@ import TeamMemberRow from './TeamMemberRow'; import { setSearchMemberQuery } from './state/reducers'; import { CloseButton } from 'app/core/components/CloseButton/CloseButton'; import { Button } from '@grafana/ui'; +import { SelectableValue } from '@grafana/data'; export interface Props { members: TeamMember[]; @@ -27,7 +28,7 @@ export interface Props { export interface State { isAdding: boolean; - newTeamMember?: User | null; + newTeamMember?: SelectableValue | null; } export class TeamMembers extends PureComponent { @@ -44,7 +45,7 @@ export class TeamMembers extends PureComponent { this.setState({ isAdding: !this.state.isAdding }); }; - onUserSelected = (user: User) => { + onUserSelected = (user: SelectableValue) => { this.setState({ newTeamMember: user }); }; diff --git a/public/app/features/users/UsersListPage.tsx b/public/app/features/users/UsersListPage.tsx index 8c588a378ea..37ef5a2b901 100644 --- a/public/app/features/users/UsersListPage.tsx +++ b/public/app/features/users/UsersListPage.tsx @@ -37,7 +37,7 @@ export interface State { const pageLimit = 30; export class UsersListPage extends PureComponent { - externalUserMngInfoHtml: string; + declare externalUserMngInfoHtml: string; constructor(props: Props) { super(props); diff --git a/public/app/plugins/datasource/cloudwatch/language_provider.ts b/public/app/plugins/datasource/cloudwatch/language_provider.ts index f2f22bcb8b9..a64357aa4ab 100644 --- a/public/app/plugins/datasource/cloudwatch/language_provider.ts +++ b/public/app/plugins/datasource/cloudwatch/language_provider.ts @@ -30,8 +30,8 @@ type TypeaheadContext = { }; export class CloudWatchLanguageProvider extends LanguageProvider { - started: boolean; - initialRange: AbsoluteTimeRange; + started = false; + declare initialRange: AbsoluteTimeRange; datasource: CloudWatchDatasource; constructor(datasource: CloudWatchDatasource, initialValues?: any) { diff --git a/public/app/plugins/datasource/elasticsearch/language_provider.ts b/public/app/plugins/datasource/elasticsearch/language_provider.ts index 472cdbd5c54..a5f0eaf6306 100644 --- a/public/app/plugins/datasource/elasticsearch/language_provider.ts +++ b/public/app/plugins/datasource/elasticsearch/language_provider.ts @@ -93,8 +93,8 @@ function getElasticsearchQuery(prometheusLabels: string[][]): string { } export default class ElasticsearchLanguageProvider extends LanguageProvider { - request: (url: string, params?: any) => Promise; - start: () => Promise; + declare request: (url: string, params?: any) => Promise; + declare start: () => Promise; datasource: ElasticDatasource; constructor(datasource: ElasticDatasource, initialValues?: any) { diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/annotations_query_ctrl.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/annotations_query_ctrl.ts index 8b68db49d07..0995f69ff20 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/annotations_query_ctrl.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/annotations_query_ctrl.ts @@ -4,8 +4,8 @@ export class AzureMonitorAnnotationsQueryCtrl { static templateUrl = 'partials/annotations.editor.html'; datasource: any; annotation: any; - workspaces: any[]; - subscriptions: Array<{ text: string; value: string }>; + declare workspaces: any[]; + declare subscriptions: Array<{ text: string; value: string }>; defaultQuery = '\n| where $__timeFilter() \n| project TimeGenerated, Text=YourTitleColumn, Tags="tag1,tag2"'; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts index 7273429e724..91e31c7614f 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts @@ -34,7 +34,7 @@ export default class AzureLogAnalyticsDatasource extends DataSourceWithBackend< > { resourcePath: string; azurePortalUrl: string; - applicationId: string; + declare applicationId: string; defaultSubscriptionId?: string; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/response_parser.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/response_parser.ts index e25159d9efe..cdf82360a01 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/response_parser.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/response_parser.ts @@ -4,7 +4,7 @@ import { AzureLogsTableData, AzureLogsVariable } from '../types'; import { AzureLogAnalyticsMetadata } from '../types/logAnalyticsMetadata'; export default class ResponseParser { - columns: string[]; + declare columns: string[]; constructor(private results: any) {} parseQueryResult(): any { diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts index 2f0f3a53efb..ee5d589dc47 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts @@ -47,8 +47,8 @@ export default class AzureMonitorDatasource extends DataSourceWithBackend; + declare optionsKey: Record; constructor( instanceSettings: DataSourceInstanceSettings, diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/query_ctrl.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/query_ctrl.ts index 29eb1856a0d..3c98c8b338e 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/query_ctrl.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/query_ctrl.ts @@ -132,7 +132,7 @@ export class AzureMonitorQueryCtrl extends QueryCtrl { showLastQuery = false; lastQuery = ''; lastQueryError?: string; - subscriptions: Array<{ text: string; value: string }>; + subscriptions: Array<{ text: string; value: string }> = []; /** @ngInject */ constructor($scope: any, $injector: auto.IInjectorService, private templateSrv: TemplateSrv) { diff --git a/public/app/plugins/datasource/graphite/gfunc.ts b/public/app/plugins/datasource/graphite/gfunc.ts index 4c27d68a50f..7e3ec63ba24 100644 --- a/public/app/plugins/datasource/graphite/gfunc.ts +++ b/public/app/plugins/datasource/graphite/gfunc.ts @@ -990,7 +990,7 @@ export class FuncInstance { def: FuncDef; params: Array; text: any; - added: boolean; + declare added: boolean; /** * Hidden functions are not displayed in UI but available in text editor * This is used for seriesByTagUsed function which when used switches diff --git a/public/app/plugins/datasource/graphite/query_ctrl.ts b/public/app/plugins/datasource/graphite/query_ctrl.ts index 1b211d1b5c7..a5f935b3dd7 100644 --- a/public/app/plugins/datasource/graphite/query_ctrl.ts +++ b/public/app/plugins/datasource/graphite/query_ctrl.ts @@ -25,10 +25,10 @@ import { ChangeEvent } from 'react'; export class GraphiteQueryCtrl extends QueryCtrl { static templateUrl = 'partials/query.editor.html'; - queryModel: GraphiteQuery; + declare queryModel: GraphiteQuery; segments: any[] = []; addTagSegments: any[] = []; - removeTagValue: string; + declare removeTagValue: string; supportsTags = false; paused = false; diff --git a/public/app/plugins/datasource/influxdb/influx_query_model.ts b/public/app/plugins/datasource/influxdb/influx_query_model.ts index 11553130a74..903bae11e64 100644 --- a/public/app/plugins/datasource/influxdb/influx_query_model.ts +++ b/public/app/plugins/datasource/influxdb/influx_query_model.ts @@ -7,7 +7,7 @@ import { TemplateSrv } from '@grafana/runtime'; export default class InfluxQueryModel { target: InfluxQuery; - selectModels: any[]; + selectModels: any[] = []; queryBuilder: any; groupByParts: any; templateSrv: any; diff --git a/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx index 6cc2a9d0ac5..aaaf45a95b3 100644 --- a/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx +++ b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx @@ -34,7 +34,7 @@ const LOGQL_EXAMPLES = [ ]; export default class LokiCheatSheet extends PureComponent, { userExamples: string[] }> { - userLabelTimer: NodeJS.Timeout; + declare userLabelTimer: NodeJS.Timeout; state = { userExamples: DEFAULT_EXAMPLES, }; diff --git a/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx b/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx index a06a22f2847..f3acc28b59e 100644 --- a/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx +++ b/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx @@ -89,7 +89,7 @@ interface PromQueryFieldState { class PromQueryField extends React.PureComponent { plugins: Plugin[]; - languageProviderInitializationPromise: CancelablePromise; + declare languageProviderInitializationPromise: CancelablePromise; constructor(props: PromQueryFieldProps, context: React.Context) { super(props, context); diff --git a/public/app/plugins/datasource/prometheus/language_provider.ts b/public/app/plugins/datasource/prometheus/language_provider.ts index 4dcf74cabfa..120ca45825b 100644 --- a/public/app/plugins/datasource/prometheus/language_provider.ts +++ b/public/app/plugins/datasource/prometheus/language_provider.ts @@ -67,10 +67,10 @@ export default class PromQlLanguageProvider extends LanguageProvider { timeRange?: { start: number; end: number }; metrics: string[]; metricsMetadata?: PromMetricsMetadata; - startTask: Promise; + declare startTask: Promise; datasource: PrometheusDatasource; - labelKeys: string[]; - labelFetchTs: number; + labelKeys: string[] = []; + declare labelFetchTs: number; /** * Cache for labels of series. This is bit simplistic in the sense that it just counts responses each as a 1 and does diff --git a/public/app/plugins/panel/graph/graph.ts b/public/app/plugins/panel/graph/graph.ts index 148cf3a801e..aac96a91f6e 100644 --- a/public/app/plugins/panel/graph/graph.ts +++ b/public/app/plugins/panel/graph/graph.ts @@ -65,7 +65,7 @@ class GraphElement { eventManager: EventManager; thresholdManager?: ThresholdManager; timeRegionManager: TimeRegionManager; - legendElem: HTMLElement; + declare legendElem: HTMLElement; constructor(private scope: any, private elem: JQuery, private timeSrv: TimeSrv) { this.ctrl = scope.ctrl; diff --git a/scripts/ci-check-strict.sh b/scripts/ci-check-strict.sh index ea5c3fef850..1ee94a831f4 100755 --- a/scripts/ci-check-strict.sh +++ b/scripts/ci-check-strict.sh @@ -3,7 +3,7 @@ set -e echo -e "Collecting code stats (typescript errors & more)" -ERROR_COUNT_LIMIT=198 +ERROR_COUNT_LIMIT=157 ERROR_COUNT="$(./node_modules/.bin/tsc --project tsconfig.json --noEmit --strict true | grep -oP 'Found \K(\d+)')" if [ "$ERROR_COUNT" -gt $ERROR_COUNT_LIMIT ]; then