فهرست منبع

noImplicitAny: 1670 errors (#18035)

* Sub 2000 errors

* Down to 1670 errors

* Minor fixes
Tobias Skarhed 6 سال پیش
والد
کامیت
e1cec1069c
34فایلهای تغییر یافته به همراه300 افزوده شده و 271 حذف شده
  1. 22 22
      public/app/features/templating/template_srv.ts
  2. 6 6
      public/app/features/templating/variable.ts
  3. 16 15
      public/app/features/templating/variable_srv.ts
  4. 1 1
      public/app/features/users/UsersActionBar.tsx
  5. 4 4
      public/app/features/users/UsersListPage.tsx
  6. 6 4
      public/app/features/users/state/selectors.ts
  7. 7 5
      public/app/plugins/datasource/cloudwatch/config_ctrl.ts
  8. 38 32
      public/app/plugins/datasource/cloudwatch/datasource.ts
  9. 2 1
      public/app/plugins/datasource/cloudwatch/query_ctrl.ts
  10. 12 10
      public/app/plugins/datasource/cloudwatch/query_parameter_ctrl.ts
  11. 17 17
      public/app/plugins/datasource/cloudwatch/specs/datasource.test.ts
  12. 3 2
      public/app/plugins/datasource/elasticsearch/bucket_agg.ts
  13. 2 2
      public/app/plugins/datasource/elasticsearch/config_ctrl.ts
  14. 31 31
      public/app/plugins/datasource/elasticsearch/datasource.ts
  15. 19 18
      public/app/plugins/datasource/elasticsearch/elastic_response.ts
  16. 3 3
      public/app/plugins/datasource/elasticsearch/index_pattern.ts
  17. 2 1
      public/app/plugins/datasource/elasticsearch/metric_agg.ts
  18. 3 3
      public/app/plugins/datasource/elasticsearch/pipeline_variables.ts
  19. 17 16
      public/app/plugins/datasource/elasticsearch/query_builder.ts
  20. 4 4
      public/app/plugins/datasource/elasticsearch/query_ctrl.ts
  21. 15 15
      public/app/plugins/datasource/elasticsearch/query_def.ts
  22. 7 7
      public/app/plugins/datasource/elasticsearch/specs/datasource.test.ts
  23. 14 14
      public/app/plugins/datasource/elasticsearch/specs/elastic_response.test.ts
  24. 2 1
      public/app/plugins/datasource/elasticsearch/specs/query_builder.test.ts
  25. 3 1
      public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/query_ctrl.ts
  26. 6 4
      public/app/plugins/datasource/grafana-azure-monitor-datasource/annotations_query_ctrl.ts
  27. 12 11
      public/app/plugins/datasource/grafana-azure-monitor-datasource/app_insights/app_insights_datasource.test.ts
  28. 15 13
      public/app/plugins/datasource/grafana-azure-monitor-datasource/app_insights/app_insights_datasource.ts
  29. 1 1
      public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/__mocks__/schema.ts
  30. 1 1
      public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/supported_namespaces.ts
  31. 3 1
      public/app/plugins/datasource/grafana-azure-monitor-datasource/editor/KustoQueryField.tsx
  32. 1 0
      public/app/plugins/datasource/graphite/specs/graphite_query.test.ts
  33. 4 4
      public/app/plugins/datasource/loki/language_provider.test.ts
  34. 1 1
      scripts/ci-frontend-metrics.sh

+ 22 - 22
public/app/features/templating/template_srv.ts

@@ -4,7 +4,7 @@ import { variableRegex } from 'app/features/templating/variable';
 import { ScopedVars } from '@grafana/ui';
 import { TimeRange } from '@grafana/data';
 
-function luceneEscape(value) {
+function luceneEscape(value: string) {
   return value.replace(/([\!\*\+\-\=<>\s\&\|\(\)\[\]\{\}\^\~\?\:\\/"])/g, '\\$1');
 }
 
@@ -12,8 +12,8 @@ export class TemplateSrv {
   variables: any[];
 
   private regex = variableRegex;
-  private index = {};
-  private grafanaVariables = {};
+  private index: any = {};
+  private grafanaVariables: any = {};
   private builtIns: any = {};
   private timeRange: TimeRange = null;
 
@@ -23,7 +23,7 @@ export class TemplateSrv {
     this.variables = [];
   }
 
-  init(variables, timeRange?: TimeRange) {
+  init(variables: any, timeRange?: TimeRange) {
     this.variables = variables;
     this.timeRange = timeRange;
     this.updateIndex();
@@ -34,7 +34,7 @@ export class TemplateSrv {
   }
 
   updateIndex() {
-    const existsOrEmpty = value => value || value === '';
+    const existsOrEmpty = (value: any) => value || value === '';
 
     this.index = this.variables.reduce((acc, currentValue) => {
       if (currentValue.current && (currentValue.current.isNone || existsOrEmpty(currentValue.current.value))) {
@@ -64,12 +64,12 @@ export class TemplateSrv {
     this.updateIndex();
   }
 
-  variableInitialized(variable) {
+  variableInitialized(variable: any) {
     this.index[variable.name] = variable;
   }
 
-  getAdhocFilters(datasourceName) {
-    let filters = [];
+  getAdhocFilters(datasourceName: string) {
+    let filters: any = [];
 
     if (this.variables) {
       for (let i = 0; i < this.variables.length; i++) {
@@ -92,7 +92,7 @@ export class TemplateSrv {
     return filters;
   }
 
-  luceneFormat(value) {
+  luceneFormat(value: any) {
     if (typeof value === 'string') {
       return luceneEscape(value);
     }
@@ -108,7 +108,7 @@ export class TemplateSrv {
   // encode string according to RFC 3986; in contrast to encodeURIComponent()
   // also the sub-delims "!", "'", "(", ")" and "*" are encoded;
   // unicode handling uses UTF-8 as in ECMA-262.
-  encodeURIComponentStrict(str) {
+  encodeURIComponentStrict(str: string) {
     return encodeURIComponent(str).replace(/[!'()*]/g, c => {
       return (
         '%' +
@@ -120,7 +120,7 @@ export class TemplateSrv {
     });
   }
 
-  formatValue(value, format, variable) {
+  formatValue(value: any, format: any, variable: any) {
     // for some scopedVars there is no variable
     variable = variable || {};
 
@@ -180,11 +180,11 @@ export class TemplateSrv {
     }
   }
 
-  setGrafanaVariable(name, value) {
+  setGrafanaVariable(name: string, value: any) {
     this.grafanaVariables[name] = value;
   }
 
-  getVariableName(expression) {
+  getVariableName(expression: string) {
     this.regex.lastIndex = 0;
     const match = this.regex.exec(expression);
     if (!match) {
@@ -194,12 +194,12 @@ export class TemplateSrv {
     return variableName;
   }
 
-  variableExists(expression) {
+  variableExists(expression: string) {
     const name = this.getVariableName(expression);
     return name && this.index[name] !== void 0;
   }
 
-  highlightVariablesAsHtml(str) {
+  highlightVariablesAsHtml(str: string) {
     if (!str || !_.isString(str)) {
       return str;
     }
@@ -214,7 +214,7 @@ export class TemplateSrv {
     });
   }
 
-  getAllValue(variable) {
+  getAllValue(variable: any) {
     if (variable.allValue) {
       return variable.allValue;
     }
@@ -225,7 +225,7 @@ export class TemplateSrv {
     return values;
   }
 
-  replace(target: string, scopedVars?: ScopedVars, format?: string | Function) {
+  replace(target: string, scopedVars?: ScopedVars, format?: string | Function): any {
     if (!target) {
       return target;
     }
@@ -266,11 +266,11 @@ export class TemplateSrv {
     });
   }
 
-  isAllValue(value) {
+  isAllValue(value: any) {
     return value === '$__all' || (Array.isArray(value) && value[0] === '$__all');
   }
 
-  replaceWithText(target, scopedVars) {
+  replaceWithText(target: string, scopedVars: ScopedVars) {
     if (!target) {
       return target;
     }
@@ -278,7 +278,7 @@ export class TemplateSrv {
     let variable;
     this.regex.lastIndex = 0;
 
-    return target.replace(this.regex, (match, var1, var2, fmt2, var3) => {
+    return target.replace(this.regex, (match: any, var1: any, var2: any, fmt2: any, var3: any) => {
       if (scopedVars) {
         const option = scopedVars[var1 || var2 || var3];
         if (option) {
@@ -297,7 +297,7 @@ export class TemplateSrv {
     });
   }
 
-  fillVariableValuesForUrl(params, scopedVars?) {
+  fillVariableValuesForUrl(params: any, scopedVars?: ScopedVars) {
     _.each(this.variables, variable => {
       if (scopedVars && scopedVars[variable.name] !== void 0) {
         if (scopedVars[variable.name].skipUrlSync) {
@@ -313,7 +313,7 @@ export class TemplateSrv {
     });
   }
 
-  distributeVariable(value, variable) {
+  distributeVariable(value: any, variable: any) {
     value = _.map(value, (val: any, index: number) => {
       if (index !== 0) {
         return variable + '=' + val;

+ 6 - 6
public/app/features/templating/variable.ts

@@ -16,12 +16,12 @@ export const variableRegexExec = (variableString: string) => {
 };
 
 export interface Variable {
-  setValue(option);
-  updateOptions();
-  dependsOn(variable);
-  setValueFromUrl(urlValue);
-  getValueForUrl();
-  getSaveModel();
+  setValue(option: any): any;
+  updateOptions(): any;
+  dependsOn(variable: any): any;
+  setValueFromUrl(urlValue: any): any;
+  getValueForUrl(): any;
+  getSaveModel(): any;
 }
 
 export let variableTypes = {};

+ 16 - 15
public/app/features/templating/variable_srv.ts

@@ -1,5 +1,5 @@
 // Libaries
-import angular from 'angular';
+import angular, { IQService, ILocationService, auto, IPromise } from 'angular';
 import _ from 'lodash';
 
 // Utils & Services
@@ -19,9 +19,9 @@ export class VariableSrv {
 
   /** @ngInject */
   constructor(
-    private $q,
-    private $location,
-    private $injector,
+    private $q: IQService,
+    private $location: ILocationService,
+    private $injector: auto.IInjectorService,
     private templateSrv: TemplateSrv,
     private timeSrv: TimeSrv
   ) {}
@@ -71,7 +71,7 @@ export class VariableSrv {
     });
   }
 
-  processVariable(variable, queryParams) {
+  processVariable(variable: any, queryParams: any) {
     const dependencies = [];
 
     for (const otherVariable of this.variables) {
@@ -100,7 +100,8 @@ export class VariableSrv {
       });
   }
 
-  createVariableFromModel(model) {
+  createVariableFromModel(model: any) {
+    // @ts-ignore
     const ctor = variableTypes[model.type].ctor;
     if (!ctor) {
       throw {
@@ -112,24 +113,24 @@ export class VariableSrv {
     return variable;
   }
 
-  addVariable(variable) {
+  addVariable(variable: any) {
     this.variables.push(variable);
     this.templateSrv.updateIndex();
     this.dashboard.updateSubmenuVisibility();
   }
 
-  removeVariable(variable) {
+  removeVariable(variable: any) {
     const index = _.indexOf(this.variables, variable);
     this.variables.splice(index, 1);
     this.templateSrv.updateIndex();
     this.dashboard.updateSubmenuVisibility();
   }
 
-  updateOptions(variable) {
+  updateOptions(variable: any) {
     return variable.updateOptions();
   }
 
-  variableUpdated(variable, emitChangeEvents?) {
+  variableUpdated(variable: any, emitChangeEvents?: any) {
     // if there is a variable lock ignore cascading update because we are in a boot up scenario
     if (variable.initLock) {
       return this.$q.when();
@@ -152,7 +153,7 @@ export class VariableSrv {
     });
   }
 
-  selectOptionsForCurrentValue(variable) {
+  selectOptionsForCurrentValue(variable: any) {
     let i, y, value, option;
     const selected: any = [];
 
@@ -176,7 +177,7 @@ export class VariableSrv {
     return selected;
   }
 
-  validateVariableSelectionState(variable) {
+  validateVariableSelectionState(variable: any) {
     if (!variable.current) {
       variable.current = {};
     }
@@ -221,7 +222,7 @@ export class VariableSrv {
    * @param variable Instance of Variable
    * @param urlValue Value of the query parameter
    */
-  setOptionFromUrl(variable: any, urlValue: string | string[]): Promise<any> {
+  setOptionFromUrl(variable: any, urlValue: string | string[]): IPromise<any> {
     let promise = this.$q.when();
 
     if (variable.refresh) {
@@ -268,7 +269,7 @@ export class VariableSrv {
     });
   }
 
-  setOptionAsCurrent(variable, option) {
+  setOptionAsCurrent(variable: any, option: any) {
     variable.current = _.cloneDeep(option);
 
     if (_.isArray(variable.current.text) && variable.current.text.length > 0) {
@@ -298,7 +299,7 @@ export class VariableSrv {
     this.$location.search(params);
   }
 
-  setAdhocFilter(options) {
+  setAdhocFilter(options: any) {
     let variable: any = _.find(this.variables, {
       type: 'adhoc',
       datasource: options.datasource,

+ 1 - 1
public/app/features/users/UsersActionBar.tsx

@@ -78,7 +78,7 @@ export class UsersActionBar extends PureComponent<Props> {
   }
 }
 
-function mapStateToProps(state) {
+function mapStateToProps(state: any) {
   return {
     searchQuery: getUsersSearchQuery(state.users),
     pendingInvitesCount: getInviteesCount(state.users),

+ 4 - 4
public/app/features/users/UsersListPage.tsx

@@ -34,7 +34,7 @@ export interface State {
 export class UsersListPage extends PureComponent<Props, State> {
   externalUserMngInfoHtml: string;
 
-  constructor(props) {
+  constructor(props: Props) {
     super(props);
 
     if (this.props.externalUserMngInfo) {
@@ -59,13 +59,13 @@ export class UsersListPage extends PureComponent<Props, State> {
     return await this.props.loadInvitees();
   }
 
-  onRoleChange = (role, user) => {
+  onRoleChange = (role: string, user: OrgUser) => {
     const updatedUser = { ...user, role: role };
 
     this.props.updateUser(updatedUser);
   };
 
-  onRemoveUser = user => {
+  onRemoveUser = (user: OrgUser) => {
     appEvents.emit('confirm-modal', {
       title: 'Delete',
       text: 'Are you sure you want to delete user ' + user.login + '?',
@@ -119,7 +119,7 @@ export class UsersListPage extends PureComponent<Props, State> {
   }
 }
 
-function mapStateToProps(state) {
+function mapStateToProps(state: any) {
   return {
     navModel: getNavModel(state.navIndex, 'users'),
     users: getUsers(state.users),

+ 6 - 4
public/app/features/users/state/selectors.ts

@@ -1,4 +1,6 @@
-export const getUsers = state => {
+import { UsersState } from 'app/types';
+
+export const getUsers = (state: UsersState) => {
   const regex = new RegExp(state.searchQuery, 'i');
 
   return state.users.filter(user => {
@@ -6,7 +8,7 @@ export const getUsers = state => {
   });
 };
 
-export const getInvitees = state => {
+export const getInvitees = (state: UsersState) => {
   const regex = new RegExp(state.searchQuery, 'i');
 
   return state.invitees.filter(invitee => {
@@ -14,5 +16,5 @@ export const getInvitees = state => {
   });
 };
 
-export const getInviteesCount = state => state.invitees.length;
-export const getUsersSearchQuery = state => state.searchQuery;
+export const getInviteesCount = (state: UsersState) => state.invitees.length;
+export const getUsersSearchQuery = (state: UsersState) => state.searchQuery;

+ 7 - 5
public/app/plugins/datasource/cloudwatch/config_ctrl.ts

@@ -1,4 +1,6 @@
 import _ from 'lodash';
+import DatasourceSrv from 'app/features/plugins/datasource_srv';
+import CloudWatchDatasource from './datasource';
 export class CloudWatchConfigCtrl {
   static templateUrl = 'partials/config.html';
   current: any;
@@ -8,7 +10,7 @@ export class CloudWatchConfigCtrl {
   secretKeyExist = false;
 
   /** @ngInject */
-  constructor($scope, datasourceSrv) {
+  constructor($scope: any, datasourceSrv: DatasourceSrv) {
     this.current.jsonData.timeField = this.current.jsonData.timeField || '@timestamp';
     this.current.jsonData.authType = this.current.jsonData.authType || 'credentials';
 
@@ -32,7 +34,7 @@ export class CloudWatchConfigCtrl {
     { name: 'ARN', value: 'arn' },
   ];
 
-  indexPatternTypes = [
+  indexPatternTypes: any = [
     { name: 'No pattern', value: undefined },
     { name: 'Hourly', value: 'Hourly', example: '[logstash-]YYYY.MM.DD.HH' },
     { name: 'Daily', value: 'Daily', example: '[logstash-]YYYY.MM.DD' },
@@ -71,14 +73,14 @@ export class CloudWatchConfigCtrl {
   getRegions() {
     this.datasourceSrv
       .loadDatasource(this.current.name)
-      .then(ds => {
+      .then((ds: CloudWatchDatasource) => {
         return ds.getRegions();
       })
       .then(
-        regions => {
+        (regions: any) => {
           this.regions = _.map(regions, 'value');
         },
-        err => {
+        (err: any) => {
           console.error('failed to get latest regions');
         }
       );

+ 38 - 32
public/app/plugins/datasource/cloudwatch/datasource.ts

@@ -1,9 +1,9 @@
-import angular from 'angular';
+import angular, { IQService } from 'angular';
 import _ from 'lodash';
 import { dateMath } from '@grafana/data';
 import kbn from 'app/core/utils/kbn';
 import { CloudWatchQuery } from './types';
-import { DataSourceApi, DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui';
+import { DataSourceApi, DataQueryRequest, DataSourceInstanceSettings, ScopedVars } 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';
@@ -18,7 +18,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
   /** @ngInject */
   constructor(
     private instanceSettings: DataSourceInstanceSettings,
-    private $q,
+    private $q: IQService,
     private backendSrv: BackendSrv,
     private templateSrv: TemplateSrv,
     private timeSrv: TimeSrv
@@ -96,7 +96,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     return this.performTimeSeriesQuery(request);
   }
 
-  getPeriod(target, options, now?) {
+  getPeriod(target: any, options: any, now?: number) {
     const start = this.convertToCloudWatchTime(options.range.from, false);
     const end = this.convertToCloudWatchTime(options.range.to, true);
     now = Math.round((now || Date.now()) / 1000);
@@ -142,8 +142,8 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     return period;
   }
 
-  performTimeSeriesQuery(request) {
-    return this.awsRequest('/api/tsdb/query', request).then(res => {
+  performTimeSeriesQuery(request: any) {
+    return this.awsRequest('/api/tsdb/query', request).then((res: any) => {
       const data = [];
 
       if (res.results) {
@@ -165,7 +165,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     });
   }
 
-  transformSuggestDataFromTable(suggestData) {
+  transformSuggestDataFromTable(suggestData: any) {
     return _.map(suggestData.results['metricFindQuery'].tables[0].rows, v => {
       return {
         text: v[0],
@@ -174,7 +174,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     });
   }
 
-  doMetricQueryRequest(subtype, parameters) {
+  doMetricQueryRequest(subtype: any, parameters: any) {
     const range = this.timeSrv.timeRange();
     return this.awsRequest('/api/tsdb/query', {
       from: range.from.valueOf().toString(),
@@ -192,7 +192,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
           parameters
         ),
       ],
-    }).then(r => {
+    }).then((r: any) => {
       return this.transformSuggestDataFromTable(r);
     });
   }
@@ -205,21 +205,27 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     return this.doMetricQueryRequest('namespaces', null);
   }
 
-  getMetrics(namespace, region) {
+  getMetrics(namespace: string, region: string) {
     return this.doMetricQueryRequest('metrics', {
       region: this.templateSrv.replace(this.getActualRegion(region)),
       namespace: this.templateSrv.replace(namespace),
     });
   }
 
-  getDimensionKeys(namespace, region) {
+  getDimensionKeys(namespace: string, region: string) {
     return this.doMetricQueryRequest('dimension_keys', {
       region: this.templateSrv.replace(this.getActualRegion(region)),
       namespace: this.templateSrv.replace(namespace),
     });
   }
 
-  getDimensionValues(region, namespace, metricName, dimensionKey, filterDimensions) {
+  getDimensionValues(
+    region: string,
+    namespace: string,
+    metricName: string,
+    dimensionKey: string,
+    filterDimensions: {}
+  ) {
     return this.doMetricQueryRequest('dimension_values', {
       region: this.templateSrv.replace(this.getActualRegion(region)),
       namespace: this.templateSrv.replace(namespace),
@@ -229,14 +235,14 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     });
   }
 
-  getEbsVolumeIds(region, instanceId) {
+  getEbsVolumeIds(region: string, instanceId: string) {
     return this.doMetricQueryRequest('ebs_volume_ids', {
       region: this.templateSrv.replace(this.getActualRegion(region)),
       instanceId: this.templateSrv.replace(instanceId),
     });
   }
 
-  getEc2InstanceAttribute(region, attributeName, filters) {
+  getEc2InstanceAttribute(region: string, attributeName: string, filters: any) {
     return this.doMetricQueryRequest('ec2_instance_attribute', {
       region: this.templateSrv.replace(this.getActualRegion(region)),
       attributeName: this.templateSrv.replace(attributeName),
@@ -244,7 +250,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     });
   }
 
-  getResourceARNs(region, resourceType, tags) {
+  getResourceARNs(region: string, resourceType: string, tags: any) {
     return this.doMetricQueryRequest('resource_arns', {
       region: this.templateSrv.replace(this.getActualRegion(region)),
       resourceType: this.templateSrv.replace(resourceType),
@@ -252,7 +258,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     });
   }
 
-  metricFindQuery(query) {
+  metricFindQuery(query: string) {
     let region;
     let namespace;
     let metricName;
@@ -324,7 +330,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     return this.$q.when([]);
   }
 
-  annotationQuery(options) {
+  annotationQuery(options: any) {
     const annotation = options.annotation;
     const statistics = _.map(annotation.statistics, s => {
       return this.templateSrv.replace(s);
@@ -359,7 +365,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
           parameters
         ),
       ],
-    }).then(r => {
+    }).then((r: any) => {
       return _.map(r.results['annotationQuery'].tables[0].rows, v => {
         return {
           annotation: annotation,
@@ -372,7 +378,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     });
   }
 
-  targetContainsTemplate(target) {
+  targetContainsTemplate(target: any) {
     return (
       this.templateSrv.variableExists(target.region) ||
       this.templateSrv.variableExists(target.namespace) ||
@@ -395,14 +401,14 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     });
   }
 
-  awsRequest(url, data) {
+  awsRequest(url: string, data: any) {
     const options = {
       method: 'POST',
-      url: url,
-      data: data,
+      url,
+      data,
     };
 
-    return this.backendSrv.datasourceRequest(options).then(result => {
+    return this.backendSrv.datasourceRequest(options).then((result: any) => {
       return result.data;
     });
   }
@@ -411,14 +417,14 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     return this.defaultRegion;
   }
 
-  getActualRegion(region) {
+  getActualRegion(region: string) {
     if (region === 'default' || _.isEmpty(region)) {
       return this.getDefaultRegion();
     }
     return region;
   }
 
-  getExpandedVariables(target, dimensionKey, variable, templateSrv) {
+  getExpandedVariables(target: any, dimensionKey: any, variable: any, templateSrv: TemplateSrv) {
     /* if the all checkbox is marked we should add all values to the targets */
     const allSelected: any = _.find(variable.options, { selected: true, text: 'All' });
     const selectedVariables = _.filter(variable.options, v => {
@@ -430,7 +436,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     });
     const currentVariables = !_.isArray(variable.current.value)
       ? [variable.current]
-      : variable.current.value.map(v => {
+      : variable.current.value.map((v: any) => {
           return {
             text: v,
             value: v,
@@ -440,9 +446,9 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
       selectedVariables.some((s: any) => {
         return s.value === currentVariables[0].value;
       }) || currentVariables[0].value === '$__all';
-    return (useSelectedVariables ? selectedVariables : currentVariables).map(v => {
+    return (useSelectedVariables ? selectedVariables : currentVariables).map((v: any) => {
       const t = angular.copy(target);
-      const scopedVar = {};
+      const scopedVar: any = {};
       scopedVar[variable.name] = v;
       t.refId = target.refId + '_' + v.value;
       t.dimensions[dimensionKey] = templateSrv.replace(t.dimensions[dimensionKey], scopedVar);
@@ -455,7 +461,7 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
     });
   }
 
-  expandTemplateVariable(targets, scopedVars, templateSrv) {
+  expandTemplateVariable(targets: any, scopedVars: ScopedVars, templateSrv: TemplateSrv) {
     // Datasource and template srv logic uber-complected. This should be cleaned up.
     return _.chain(targets)
       .map(target => {
@@ -480,15 +486,15 @@ export default class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery>
       .value();
   }
 
-  convertToCloudWatchTime(date, roundUp) {
+  convertToCloudWatchTime(date: any, roundUp: any) {
     if (_.isString(date)) {
       date = dateMath.parse(date, roundUp);
     }
     return Math.round(date.valueOf() / 1000);
   }
 
-  convertDimensionFormat(dimensions, scopedVars) {
-    const convertedDimensions = {};
+  convertDimensionFormat(dimensions: any, scopedVars: ScopedVars) {
+    const convertedDimensions: any = {};
     _.each(dimensions, (value, key) => {
       convertedDimensions[this.templateSrv.replace(key, scopedVars)] = this.templateSrv.replace(value, scopedVars);
     });

+ 2 - 1
public/app/plugins/datasource/cloudwatch/query_ctrl.ts

@@ -1,5 +1,6 @@
 import './query_parameter_ctrl';
 import { QueryCtrl } from 'app/plugins/sdk';
+import { auto } from 'angular';
 
 export class CloudWatchQueryCtrl extends QueryCtrl {
   static templateUrl = 'partials/query.editor.html';
@@ -7,7 +8,7 @@ export class CloudWatchQueryCtrl extends QueryCtrl {
   aliasSyntax: string;
 
   /** @ngInject */
-  constructor($scope, $injector) {
+  constructor($scope: any, $injector: auto.IInjectorService) {
     super($scope, $injector);
     this.aliasSyntax = '{{metric}} {{stat}} {{namespace}} {{region}} {{<dimension name>}}';
   }

+ 12 - 10
public/app/plugins/datasource/cloudwatch/query_parameter_ctrl.ts

@@ -1,10 +1,12 @@
-import angular from 'angular';
+import angular, { IQService } from 'angular';
 import coreModule from 'app/core/core_module';
 import _ from 'lodash';
+import { TemplateSrv } from 'app/features/templating/template_srv';
+import DatasourceSrv from 'app/features/plugins/datasource_srv';
 
 export class CloudWatchQueryParameterCtrl {
   /** @ngInject */
-  constructor($scope, templateSrv, uiSegmentSrv, datasourceSrv, $q) {
+  constructor($scope: any, templateSrv: TemplateSrv, uiSegmentSrv: any, datasourceSrv: DatasourceSrv, $q: IQService) {
     $scope.init = () => {
       const target = $scope.target;
       target.namespace = target.namespace || '';
@@ -69,7 +71,7 @@ export class CloudWatchQueryParameterCtrl {
       );
     };
 
-    $scope.statSegmentChanged = (segment, index) => {
+    $scope.statSegmentChanged = (segment: any, index: number) => {
       if (segment.value === $scope.removeStatSegment.value) {
         $scope.statSegments.splice(index, 1);
       } else {
@@ -91,7 +93,7 @@ export class CloudWatchQueryParameterCtrl {
       $scope.onChange();
     };
 
-    $scope.ensurePlusButton = segments => {
+    $scope.ensurePlusButton = (segments: any) => {
       const count = segments.length;
       const lastSegment = segments[Math.max(count - 1, 0)];
 
@@ -100,7 +102,7 @@ export class CloudWatchQueryParameterCtrl {
       }
     };
 
-    $scope.getDimSegments = (segment, $index) => {
+    $scope.getDimSegments = (segment: any, $index: number) => {
       if (segment.type === 'operator') {
         return $q.when([]);
       }
@@ -130,7 +132,7 @@ export class CloudWatchQueryParameterCtrl {
       });
     };
 
-    $scope.dimSegmentChanged = (segment, index) => {
+    $scope.dimSegmentChanged = (segment: any, index: number) => {
       $scope.dimSegments[index] = segment;
 
       if (segment.value === $scope.removeDimSegment.value) {
@@ -148,7 +150,7 @@ export class CloudWatchQueryParameterCtrl {
     };
 
     $scope.syncDimSegmentsWithModel = () => {
-      const dims = {};
+      const dims: any = {};
       const length = $scope.dimSegments.length;
 
       for (let i = 0; i < length - 2; i += 3) {
@@ -165,7 +167,7 @@ export class CloudWatchQueryParameterCtrl {
     $scope.getRegions = () => {
       return $scope.datasource
         .metricFindQuery('regions()')
-        .then(results => {
+        .then((results: any) => {
           results.unshift({ text: 'default' });
           return results;
         })
@@ -197,8 +199,8 @@ export class CloudWatchQueryParameterCtrl {
       $scope.onChange();
     };
 
-    $scope.transformToSegments = addTemplateVars => {
-      return results => {
+    $scope.transformToSegments = (addTemplateVars: any) => {
+      return (results: any) => {
         const segments = _.map(results, segment => {
           return uiSegmentSrv.newSegment({
             value: segment.text,

+ 17 - 17
public/app/plugins/datasource/cloudwatch/specs/datasource.test.ts

@@ -32,7 +32,7 @@ describe('CloudWatchDatasource', () => {
   } as any;
 
   beforeEach(() => {
-    ctx.ds = new CloudWatchDatasource(instanceSettings, {}, backendSrv, templateSrv, timeSrv);
+    ctx.ds = new CloudWatchDatasource(instanceSettings, {} as any, backendSrv, templateSrv, timeSrv);
   });
 
   describe('When performing CloudWatch query', () => {
@@ -56,7 +56,7 @@ describe('CloudWatchDatasource', () => {
       ],
     };
 
-    const response = {
+    const response: any = {
       timings: [null],
       results: {
         A: {
@@ -156,7 +156,7 @@ describe('CloudWatchDatasource', () => {
     });
 
     it('should return series list', done => {
-      ctx.ds.query(query).then(result => {
+      ctx.ds.query(query).then((result: any) => {
         expect(result.data[0].target).toBe(response.results.A.series[0].name);
         expect(result.data[0].datapoints[0][0]).toBe(response.results.A.series[0].points[0][0]);
         done();
@@ -204,7 +204,7 @@ describe('CloudWatchDatasource', () => {
         ],
       };
 
-      ctx.ds.query(query).then(result => {
+      ctx.ds.query(query).then((result: any) => {
         expect(requestParams.queries[0].region).toBe(instanceSettings.jsonData.defaultRegion);
         done();
       });
@@ -231,7 +231,7 @@ describe('CloudWatchDatasource', () => {
       ],
     };
 
-    const response = {
+    const response: any = {
       timings: [null],
       results: {
         A: {
@@ -259,7 +259,7 @@ describe('CloudWatchDatasource', () => {
     });
 
     it('should return series list', done => {
-      ctx.ds.query(query).then(result => {
+      ctx.ds.query(query).then((result: any) => {
         expect(result.data[0].target).toBe(response.results.A.series[0].name);
         expect(result.data[0].datapoints[0][0]).toBe(response.results.A.series[0].points[0][0]);
         done();
@@ -411,7 +411,7 @@ describe('CloudWatchDatasource', () => {
     });
 
     it('should generate the correct query for multilple template variables with expression', done => {
-      const query = {
+      const query: any = {
         range: { from: 'now-1h', to: 'now' },
         rangeRaw: { from: 1483228800, to: 1483232400 },
         targets: [
@@ -466,17 +466,17 @@ describe('CloudWatchDatasource', () => {
     });
   });
 
-  function describeMetricFindQuery(query, func) {
+  function describeMetricFindQuery(query: any, func: any) {
     describe('metricFindQuery ' + query, () => {
       const scenario: any = {};
-      scenario.setup = setupCallback => {
+      scenario.setup = (setupCallback: any) => {
         beforeEach(() => {
           setupCallback();
           ctx.backendSrv.datasourceRequest = jest.fn(args => {
             scenario.request = args.data;
             return Promise.resolve({ data: scenario.requestResponse });
           });
-          ctx.ds.metricFindQuery(query).then(args => {
+          ctx.ds.metricFindQuery(query).then((args: any) => {
             scenario.result = args;
           });
         });
@@ -486,7 +486,7 @@ describe('CloudWatchDatasource', () => {
     });
   }
 
-  describeMetricFindQuery('regions()', scenario => {
+  describeMetricFindQuery('regions()', (scenario: any) => {
     scenario.setup(() => {
       scenario.requestResponse = {
         results: {
@@ -504,7 +504,7 @@ describe('CloudWatchDatasource', () => {
     });
   });
 
-  describeMetricFindQuery('namespaces()', scenario => {
+  describeMetricFindQuery('namespaces()', (scenario: any) => {
     scenario.setup(() => {
       scenario.requestResponse = {
         results: {
@@ -522,7 +522,7 @@ describe('CloudWatchDatasource', () => {
     });
   });
 
-  describeMetricFindQuery('metrics(AWS/EC2)', scenario => {
+  describeMetricFindQuery('metrics(AWS/EC2)', (scenario: any) => {
     scenario.setup(() => {
       scenario.requestResponse = {
         results: {
@@ -540,7 +540,7 @@ describe('CloudWatchDatasource', () => {
     });
   });
 
-  describeMetricFindQuery('dimension_keys(AWS/EC2)', scenario => {
+  describeMetricFindQuery('dimension_keys(AWS/EC2)', (scenario: any) => {
     scenario.setup(() => {
       scenario.requestResponse = {
         results: {
@@ -558,7 +558,7 @@ describe('CloudWatchDatasource', () => {
     });
   });
 
-  describeMetricFindQuery('dimension_values(us-east-1,AWS/EC2,CPUUtilization,InstanceId)', scenario => {
+  describeMetricFindQuery('dimension_values(us-east-1,AWS/EC2,CPUUtilization,InstanceId)', (scenario: any) => {
     scenario.setup(() => {
       scenario.requestResponse = {
         results: {
@@ -576,7 +576,7 @@ describe('CloudWatchDatasource', () => {
     });
   });
 
-  describeMetricFindQuery('dimension_values(default,AWS/EC2,CPUUtilization,InstanceId)', scenario => {
+  describeMetricFindQuery('dimension_values(default,AWS/EC2,CPUUtilization,InstanceId)', (scenario: any) => {
     scenario.setup(() => {
       scenario.requestResponse = {
         results: {
@@ -594,7 +594,7 @@ describe('CloudWatchDatasource', () => {
     });
   });
 
-  describeMetricFindQuery('resource_arns(default,ec2:instance,{"environment":["production"]})', scenario => {
+  describeMetricFindQuery('resource_arns(default,ec2:instance,{"environment":["production"]})', (scenario: any) => {
     scenario.setup(() => {
       scenario.requestResponse = {
         results: {

+ 3 - 2
public/app/plugins/datasource/elasticsearch/bucket_agg.ts

@@ -1,10 +1,11 @@
 import coreModule from 'app/core/core_module';
 import _ from 'lodash';
 import * as queryDef from './query_def';
+import { IQService } from 'angular';
 
 export class ElasticBucketAggCtrl {
   /** @ngInject */
-  constructor($scope, uiSegmentSrv, $q, $rootScope) {
+  constructor($scope: any, uiSegmentSrv: any, $q: IQService, $rootScope: any) {
     const bucketAggs = $scope.target.bucketAggs;
 
     $scope.orderByOptions = [];
@@ -158,7 +159,7 @@ export class ElasticBucketAggCtrl {
       $scope.agg.settings.filters.push({ query: '*' });
     };
 
-    $scope.removeFiltersQuery = filter => {
+    $scope.removeFiltersQuery = (filter: any) => {
       $scope.agg.settings.filters = _.without($scope.agg.settings.filters, filter);
     };
 

+ 2 - 2
public/app/plugins/datasource/elasticsearch/config_ctrl.ts

@@ -8,7 +8,7 @@ export class ElasticConfigCtrl {
   current: DataSourceInstanceSettings<ElasticsearchOptions>;
 
   /** @ngInject */
-  constructor($scope) {
+  constructor($scope: any) {
     this.current.jsonData.timeField = this.current.jsonData.timeField || '@timestamp';
     this.current.jsonData.esVersion = this.current.jsonData.esVersion || 5;
     const defaultMaxConcurrentShardRequests = this.current.jsonData.esVersion >= 70 ? 5 : 256;
@@ -18,7 +18,7 @@ export class ElasticConfigCtrl {
     this.current.jsonData.logLevelField = this.current.jsonData.logLevelField || '';
   }
 
-  indexPatternTypes = [
+  indexPatternTypes: any = [
     { name: 'No pattern', value: undefined },
     { name: 'Hourly', value: 'Hourly', example: '[logstash-]YYYY.MM.DD.HH' },
     { name: 'Daily', value: 'Daily', example: '[logstash-]YYYY.MM.DD' },

+ 31 - 31
public/app/plugins/datasource/elasticsearch/datasource.ts

@@ -63,7 +63,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
     }
   }
 
-  private request(method, url, data?) {
+  private request(method: string, url: string, data?: undefined) {
     const options: any = {
       url: this.url + '/' + url,
       method: method,
@@ -82,29 +82,29 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
     return this.backendSrv.datasourceRequest(options);
   }
 
-  private get(url) {
+  private get(url: string) {
     const range = this.timeSrv.timeRange();
     const indexList = this.indexPattern.getIndexList(range.from.valueOf(), range.to.valueOf());
     if (_.isArray(indexList) && indexList.length) {
-      return this.request('GET', indexList[0] + url).then(results => {
+      return this.request('GET', indexList[0] + url).then((results: any) => {
         results.data.$$config = results.config;
         return results.data;
       });
     } else {
-      return this.request('GET', this.indexPattern.getIndexForToday() + url).then(results => {
+      return this.request('GET', this.indexPattern.getIndexForToday() + url).then((results: any) => {
         results.data.$$config = results.config;
         return results.data;
       });
     }
   }
 
-  private post(url, data) {
+  private post(url: string, data: any) {
     return this.request('POST', url, data)
-      .then(results => {
+      .then((results: any) => {
         results.data.$$config = results.config;
         return results.data;
       })
-      .catch(err => {
+      .catch((err: any) => {
         if (err.data && err.data.error) {
           throw {
             message: 'Elasticsearch error: ' + err.data.error.reason,
@@ -116,14 +116,14 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
       });
   }
 
-  annotationQuery(options) {
+  annotationQuery(options: any) {
     const annotation = options.annotation;
     const timeField = annotation.timeField || '@timestamp';
     const queryString = annotation.query || '*';
     const tagsField = annotation.tagsField || 'tags';
     const textField = annotation.textField || null;
 
-    const range = {};
+    const range: any = {};
     range[timeField] = {
       from: options.range.from.valueOf(),
       to: options.range.to.valueOf(),
@@ -144,8 +144,8 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
       },
     };
 
-    const data = {
-      query: query,
+    const data: any = {
+      query,
       size: 10000,
     };
 
@@ -168,11 +168,11 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
 
     const payload = angular.toJson(header) + '\n' + angular.toJson(data) + '\n';
 
-    return this.post('_msearch', payload).then(res => {
+    return this.post('_msearch', payload).then((res: any) => {
       const list = [];
       const hits = res.responses[0].hits.hits;
 
-      const getFieldFromSource = (source, fieldName) => {
+      const getFieldFromSource = (source: any, fieldName: any) => {
         if (!fieldName) {
           return;
         }
@@ -229,7 +229,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
   testDatasource() {
     // validate that the index exist and has date field
     return this.getFields({ type: 'date' }).then(
-      dateFields => {
+      (dateFields: any) => {
         const timeField: any = _.find(dateFields, { text: this.timeField });
         if (!timeField) {
           return {
@@ -239,7 +239,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
         }
         return { status: 'success', message: 'Index OK. Time field name OK.' };
       },
-      err => {
+      (err: any) => {
         console.log(err);
         if (err.data && err.data.error) {
           let message = angular.toJson(err.data.error);
@@ -254,7 +254,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
     );
   }
 
-  getQueryHeader(searchType, timeFrom, timeTo) {
+  getQueryHeader(searchType: any, timeFrom: any, timeTo: any) {
     const queryHeader: any = {
       search_type: searchType,
       ignore_unavailable: true,
@@ -319,7 +319,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
 
     const url = this.getMultiSearchUrl();
 
-    return this.post(url, payload).then(res => {
+    return this.post(url, payload).then((res: any) => {
       const er = new ElasticResponse(sentTargets, res);
       if (sentTargets.some(target => target.isLogsQuery)) {
         return er.getLogs(this.logMessageField, this.logLevelField);
@@ -329,10 +329,10 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
     });
   }
 
-  getFields(query) {
+  getFields(query: any) {
     const configuredEsVersion = this.esVersion;
-    return this.get('/_mapping').then(result => {
-      const typeMap = {
+    return this.get('/_mapping').then((result: any) => {
+      const typeMap: any = {
         float: 'number',
         double: 'number',
         integer: 'number',
@@ -344,7 +344,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
         nested: 'nested',
       };
 
-      function shouldAddField(obj, key, query) {
+      function shouldAddField(obj: any, key: any, query: any) {
         if (key[0] === '_') {
           return false;
         }
@@ -358,10 +358,10 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
       }
 
       // Store subfield names: [system, process, cpu, total] -> system.process.cpu.total
-      const fieldNameParts = [];
-      const fields = {};
+      const fieldNameParts: any = [];
+      const fields: any = {};
 
-      function getFieldsRecursively(obj) {
+      function getFieldsRecursively(obj: any) {
         for (const key in obj) {
           const subObj = obj[key];
 
@@ -415,7 +415,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
     });
   }
 
-  getTerms(queryDef) {
+  getTerms(queryDef: any) {
     const range = this.timeSrv.timeRange();
     const searchType = this.esVersion >= 5 ? 'query_then_fetch' : 'count';
     const header = this.getQueryHeader(searchType, range.from, range.to);
@@ -427,7 +427,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
 
     const url = this.getMultiSearchUrl();
 
-    return this.post(url, esQuery).then(res => {
+    return this.post(url, esQuery).then((res: any) => {
       if (!res.responses[0].aggregations) {
         return [];
       }
@@ -450,7 +450,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
     return '_msearch';
   }
 
-  metricFindQuery(query) {
+  metricFindQuery(query: any) {
     query = angular.fromJson(query);
     if (!query) {
       return this.$q.when([]);
@@ -472,11 +472,11 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
     return this.getFields({});
   }
 
-  getTagValues(options) {
+  getTagValues(options: any) {
     return this.getTerms({ field: options.key, query: '*' });
   }
 
-  targetContainsTemplate(target) {
+  targetContainsTemplate(target: any) {
     if (this.templateSrv.variableExists(target.query) || this.templateSrv.variableExists(target.alias)) {
       return true;
     }
@@ -500,7 +500,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
     return false;
   }
 
-  private isPrimitive(obj) {
+  private isPrimitive(obj: any) {
     if (obj === null || obj === undefined) {
       return true;
     }
@@ -511,7 +511,7 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
     return false;
   }
 
-  private objectContainsTemplate(obj) {
+  private objectContainsTemplate(obj: any) {
     if (!obj) {
       return false;
     }

+ 19 - 18
public/app/plugins/datasource/elasticsearch/elastic_response.ts

@@ -4,14 +4,15 @@ import * as queryDef from './query_def';
 import TableModel from 'app/core/table_model';
 import { DataFrame, toDataFrame, FieldType } from '@grafana/data';
 import { DataQueryResponse } from '@grafana/ui';
+import { ElasticsearchAggregation } from './types';
 
 export class ElasticResponse {
-  constructor(private targets, private response) {
+  constructor(private targets: any, private response: any) {
     this.targets = targets;
     this.response = response;
   }
 
-  processMetrics(esAgg, target, seriesList, props) {
+  processMetrics(esAgg: any, target: any, seriesList: any, props: any) {
     let metric, y, i, newSeries, bucket, value;
 
     for (y = 0; y < target.metrics.length; y++) {
@@ -113,7 +114,7 @@ export class ElasticResponse {
     }
   }
 
-  processAggregationDocs(esAgg, aggDef, target, table, props) {
+  processAggregationDocs(esAgg: any, aggDef: ElasticsearchAggregation, target: any, table: any, props: any) {
     // add columns
     if (table.columns.length === 0) {
       for (const propKey of _.keys(props)) {
@@ -123,7 +124,7 @@ export class ElasticResponse {
     }
 
     // helper func to add values to value array
-    const addMetricValue = (values, metricName, value) => {
+    const addMetricValue = (values: any[], metricName: string, value: any) => {
       table.addColumn({ text: metricName });
       values.push(value);
     };
@@ -188,8 +189,8 @@ export class ElasticResponse {
 
   // This is quite complex
   // need to recurse down the nested buckets to build series
-  processBuckets(aggs, target, seriesList, table, props, depth) {
-    let bucket, aggDef, esAgg, aggId;
+  processBuckets(aggs: any, target: any, seriesList: any, table: any, props: any, depth: any) {
+    let bucket, aggDef: any, esAgg, aggId;
     const maxDepth = target.bucketAggs.length - 1;
 
     for (aggId in aggs) {
@@ -224,7 +225,7 @@ export class ElasticResponse {
     }
   }
 
-  private getMetricName(metric) {
+  private getMetricName(metric: any) {
     let metricDef: any = _.find(queryDef.metricAggTypes, { value: metric });
     if (!metricDef) {
       metricDef = _.find(queryDef.extendedStats, { value: metric });
@@ -233,13 +234,13 @@ export class ElasticResponse {
     return metricDef ? metricDef.text : metric;
   }
 
-  private getSeriesName(series, target, metricTypeCount) {
+  private getSeriesName(series: any, target: any, metricTypeCount: any) {
     let metricName = this.getMetricName(series.metric);
 
     if (target.alias) {
       const regex = /\{\{([\s\S]+?)\}\}/g;
 
-      return target.alias.replace(regex, (match, g1, g2) => {
+      return target.alias.replace(regex, (match: any, g1: any, g2: any) => {
         const group = g1 || g2;
 
         if (group.indexOf('term ') === 0) {
@@ -303,7 +304,7 @@ export class ElasticResponse {
     return name.trim() + ' ' + metricName;
   }
 
-  nameSeries(seriesList, target) {
+  nameSeries(seriesList: any, target: any) {
     const metricTypeCount = _.uniq(_.map(seriesList, 'metric')).length;
 
     for (let i = 0; i < seriesList.length; i++) {
@@ -312,17 +313,17 @@ export class ElasticResponse {
     }
   }
 
-  processHits(hits, seriesList) {
+  processHits(hits: { total: { value: any }; hits: any[] }, seriesList: any[]) {
     const hitsTotal = typeof hits.total === 'number' ? hits.total : hits.total.value; // <- Works with Elasticsearch 7.0+
 
-    const series = {
+    const series: any = {
       target: 'docs',
       type: 'docs',
       datapoints: [],
       total: hitsTotal,
       filterable: true,
     };
-    let propName, hit, doc, i;
+    let propName, hit, doc: any, i;
 
     for (i = 0; i < hits.hits.length; i++) {
       hit = hits.hits[i];
@@ -347,7 +348,7 @@ export class ElasticResponse {
     seriesList.push(series);
   }
 
-  trimDatapoints(aggregations, target) {
+  trimDatapoints(aggregations: any, target: any) {
     const histogram: any = _.find(target.bucketAggs, { type: 'date_histogram' });
 
     const shouldDropFirstAndLast = histogram && histogram.settings && histogram.settings.trimEdges;
@@ -362,7 +363,7 @@ export class ElasticResponse {
     }
   }
 
-  getErrorFromElasticResponse(response, err) {
+  getErrorFromElasticResponse(response: any, err: any) {
     const result: any = {};
     result.data = JSON.stringify(err, null, 4);
     if (err.root_cause && err.root_cause.length > 0 && err.root_cause[0].reason) {
@@ -394,7 +395,7 @@ export class ElasticResponse {
       if (response.aggregations) {
         const aggregations = response.aggregations;
         const target = this.targets[i];
-        const tmpSeriesList = [];
+        const tmpSeriesList: any[] = [];
         const table = new TableModel();
 
         this.processBuckets(aggregations, target, tmpSeriesList, table, {}, 0);
@@ -426,7 +427,7 @@ export class ElasticResponse {
 
       const hits = response.hits;
       let propNames: string[] = [];
-      let propName, hit, doc, i;
+      let propName, hit, doc: any, i;
 
       for (i = 0; i < hits.hits.length; i++) {
         hit = hits.hits[i];
@@ -534,7 +535,7 @@ export class ElasticResponse {
       if (response.aggregations) {
         const aggregations = response.aggregations;
         const target = this.targets[n];
-        const tmpSeriesList = [];
+        const tmpSeriesList: any[] = [];
         const table = new TableModel();
 
         this.processBuckets(aggregations, target, tmpSeriesList, table, {}, 0);

+ 3 - 3
public/app/plugins/datasource/elasticsearch/index_pattern.ts

@@ -1,6 +1,6 @@
 import { toUtc, dateTime } from '@grafana/data';
 
-const intervalMap = {
+const intervalMap: any = {
   Hourly: { startOf: 'hour', amount: 'hours' },
   Daily: { startOf: 'day', amount: 'days' },
   Weekly: { startOf: 'isoWeek', amount: 'weeks' },
@@ -9,7 +9,7 @@ const intervalMap = {
 };
 
 export class IndexPattern {
-  constructor(private pattern, private interval: string | null) {}
+  constructor(private pattern: any, private interval: string | null) {}
 
   getIndexForToday() {
     if (this.interval) {
@@ -19,7 +19,7 @@ export class IndexPattern {
     }
   }
 
-  getIndexList(from, to) {
+  getIndexList(from: any, to: any) {
     if (!this.interval) {
       return this.pattern;
     }

+ 2 - 1
public/app/plugins/datasource/elasticsearch/metric_agg.ts

@@ -2,10 +2,11 @@ import coreModule from 'app/core/core_module';
 import _ from 'lodash';
 import * as queryDef from './query_def';
 import { ElasticsearchAggregation } from './types';
+import { IQService } from 'angular';
 
 export class ElasticMetricAggCtrl {
   /** @ngInject */
-  constructor($scope, uiSegmentSrv, $q, $rootScope) {
+  constructor($scope: any, uiSegmentSrv: any, $q: IQService, $rootScope: any) {
     const metricAggs: ElasticsearchAggregation[] = $scope.target.metrics;
     $scope.metricAggTypes = queryDef.getMetricAggTypes($scope.esVersion);
     $scope.extendedStats = queryDef.extendedStats;

+ 3 - 3
public/app/plugins/datasource/elasticsearch/pipeline_variables.ts

@@ -14,7 +14,7 @@ export function elasticPipelineVariables() {
   };
 }
 
-const newVariable = index => {
+const newVariable = (index: any) => {
   return {
     name: 'var' + index,
     pipelineAgg: 'select metric',
@@ -23,7 +23,7 @@ const newVariable = index => {
 
 export class ElasticPipelineVariablesCtrl {
   /** @ngInject */
-  constructor($scope) {
+  constructor($scope: any) {
     $scope.variables = $scope.variables || [newVariable(1)];
 
     $scope.onChangeInternal = () => {
@@ -35,7 +35,7 @@ export class ElasticPipelineVariablesCtrl {
       $scope.onChange();
     };
 
-    $scope.remove = index => {
+    $scope.remove = (index: number) => {
       $scope.variables.splice(index, 1);
       $scope.onChange();
     };

+ 17 - 16
public/app/plugins/datasource/elasticsearch/query_builder.ts

@@ -1,16 +1,17 @@
 import * as queryDef from './query_def';
+import { ElasticsearchAggregation } from './types';
 
 export class ElasticQueryBuilder {
   timeField: string;
   esVersion: number;
 
-  constructor(options) {
+  constructor(options: any) {
     this.timeField = options.timeField;
     this.esVersion = options.esVersion;
   }
 
   getRangeFilter() {
-    const filter = {};
+    const filter: any = {};
     filter[this.timeField] = {
       gte: '$timeFrom',
       lte: '$timeTo',
@@ -20,7 +21,7 @@ export class ElasticQueryBuilder {
     return filter;
   }
 
-  buildTermsAgg(aggDef, queryNode, target) {
+  buildTermsAgg(aggDef: ElasticsearchAggregation, queryNode: { terms?: any; aggs?: any }, target: { metrics: any[] }) {
     let metricRef, metric, y;
     queryNode.terms = { field: aggDef.field };
 
@@ -63,7 +64,7 @@ export class ElasticQueryBuilder {
     return queryNode;
   }
 
-  getDateHistogramAgg(aggDef) {
+  getDateHistogramAgg(aggDef: ElasticsearchAggregation) {
     const esAgg: any = {};
     const settings = aggDef.settings || {};
     esAgg.interval = settings.interval;
@@ -87,7 +88,7 @@ export class ElasticQueryBuilder {
     return esAgg;
   }
 
-  getHistogramAgg(aggDef) {
+  getHistogramAgg(aggDef: ElasticsearchAggregation) {
     const esAgg: any = {};
     const settings = aggDef.settings || {};
     esAgg.interval = settings.interval;
@@ -100,8 +101,8 @@ export class ElasticQueryBuilder {
     return esAgg;
   }
 
-  getFiltersAgg(aggDef) {
-    const filterObj = {};
+  getFiltersAgg(aggDef: ElasticsearchAggregation) {
+    const filterObj: any = {};
     for (let i = 0; i < aggDef.settings.filters.length; i++) {
       const query = aggDef.settings.filters[i].query;
       let label = aggDef.settings.filters[i].label;
@@ -117,7 +118,7 @@ export class ElasticQueryBuilder {
     return filterObj;
   }
 
-  documentQuery(query, size) {
+  documentQuery(query: any, size: number) {
     query.size = size;
     query.sort = {};
     query.sort[this.timeField] = { order: 'desc', unmapped_type: 'boolean' };
@@ -136,12 +137,12 @@ export class ElasticQueryBuilder {
     return query;
   }
 
-  addAdhocFilters(query, adhocFilters) {
+  addAdhocFilters(query: any, adhocFilters: any) {
     if (!adhocFilters) {
       return;
     }
 
-    let i, filter, condition, queryCondition;
+    let i, filter, condition: any, queryCondition: any;
 
     for (i = 0; i < adhocFilters.length; i++) {
       filter = adhocFilters[i];
@@ -183,7 +184,7 @@ export class ElasticQueryBuilder {
     }
   }
 
-  build(target, adhocFilters?, queryString?) {
+  build(target: any, adhocFilters?: any, queryString?: string) {
     // make sure query has defaults;
     target.metrics = target.metrics || [queryDef.defaultMetricAgg()];
     target.bucketAggs = target.bucketAggs || [queryDef.defaultBucketAgg()];
@@ -224,7 +225,7 @@ export class ElasticQueryBuilder {
 
     for (i = 0; i < target.bucketAggs.length; i++) {
       const aggDef = target.bucketAggs[i];
-      const esAgg = {};
+      const esAgg: any = {};
 
       switch (aggDef.type) {
         case 'date_histogram': {
@@ -265,8 +266,8 @@ export class ElasticQueryBuilder {
         continue;
       }
 
-      const aggField = {};
-      let metricAgg = null;
+      const aggField: any = {};
+      let metricAgg: any = null;
 
       if (queryDef.isPipelineAgg(metric.type)) {
         if (queryDef.isPipelineAggWithMultipleBucketPaths(metric.type)) {
@@ -323,7 +324,7 @@ export class ElasticQueryBuilder {
     return query;
   }
 
-  getTermsQuery(queryDef) {
+  getTermsQuery(queryDef: any) {
     const query: any = {
       size: 0,
       query: {
@@ -368,7 +369,7 @@ export class ElasticQueryBuilder {
     return query;
   }
 
-  getLogsQuery(target, querystring) {
+  getLogsQuery(target: any, querystring: string) {
     let query: any = {
       size: 0,
       query: {

+ 4 - 4
public/app/plugins/datasource/elasticsearch/query_ctrl.ts

@@ -2,7 +2,7 @@ import './bucket_agg';
 import './metric_agg';
 import './pipeline_variables';
 
-import angular from 'angular';
+import angular, { auto } from 'angular';
 import _ from 'lodash';
 import * as queryDef from './query_def';
 import { QueryCtrl } from 'app/plugins/sdk';
@@ -15,7 +15,7 @@ export class ElasticQueryCtrl extends QueryCtrl {
   rawQueryOld: string;
 
   /** @ngInject */
-  constructor($scope, $injector, private $rootScope, private uiSegmentSrv) {
+  constructor($scope: any, $injector: auto.IInjectorService, private $rootScope: any, private uiSegmentSrv: any) {
     super($scope, $injector);
 
     this.esVersion = this.datasource.esVersion;
@@ -35,7 +35,7 @@ export class ElasticQueryCtrl extends QueryCtrl {
     this.queryUpdated();
   }
 
-  getFields(type) {
+  getFields(type: any) {
     const jsonStr = angular.toJson({ find: 'fields', type: type });
     return this.datasource
       .metricFindQuery(jsonStr)
@@ -98,7 +98,7 @@ export class ElasticQueryCtrl extends QueryCtrl {
     return text;
   }
 
-  handleQueryError(err) {
+  handleQueryError(err: any): any[] {
     this.error = err.message || 'Failed to issue metric query';
     return [];
   }

+ 15 - 15
public/app/plugins/datasource/elasticsearch/query_def.ts

@@ -128,7 +128,7 @@ export const movingAvgModelOptions = [
   { text: 'Holt Winters', value: 'holt_winters' },
 ];
 
-export const pipelineOptions = {
+export const pipelineOptions: any = {
   moving_avg: [
     { text: 'window', default: 5 },
     { text: 'model', default: 'simple' },
@@ -139,7 +139,7 @@ export const pipelineOptions = {
   bucket_script: [],
 };
 
-export const movingAvgModelSettings = {
+export const movingAvgModelSettings: any = {
   simple: [],
   linear: [],
   ewma: [{ text: 'Alpha', value: 'alpha', default: undefined }],
@@ -153,7 +153,7 @@ export const movingAvgModelSettings = {
   ],
 };
 
-export function getMetricAggTypes(esVersion) {
+export function getMetricAggTypes(esVersion: any) {
   return _.filter(metricAggTypes, f => {
     if (f.minVersion) {
       return f.minVersion <= esVersion;
@@ -163,7 +163,7 @@ export function getMetricAggTypes(esVersion) {
   });
 }
 
-export function getPipelineOptions(metric) {
+export function getPipelineOptions(metric: any) {
   if (!isPipelineAgg(metric.type)) {
     return [];
   }
@@ -171,7 +171,7 @@ export function getPipelineOptions(metric) {
   return pipelineOptions[metric.type];
 }
 
-export function isPipelineAgg(metricType) {
+export function isPipelineAgg(metricType: any) {
   if (metricType) {
     const po = pipelineOptions[metricType];
     return po !== null && po !== undefined;
@@ -180,7 +180,7 @@ export function isPipelineAgg(metricType) {
   return false;
 }
 
-export function isPipelineAggWithMultipleBucketPaths(metricType) {
+export function isPipelineAggWithMultipleBucketPaths(metricType: any) {
   if (metricType) {
     return metricAggTypes.find(t => t.value === metricType && t.supportsMultipleBucketPaths) !== undefined;
   }
@@ -188,8 +188,8 @@ export function isPipelineAggWithMultipleBucketPaths(metricType) {
   return false;
 }
 
-export function getPipelineAggOptions(targets) {
-  const result = [];
+export function getPipelineAggOptions(targets: any) {
+  const result: any[] = [];
   _.each(targets.metrics, metric => {
     if (!isPipelineAgg(metric.type)) {
       result.push({ text: describeMetric(metric), value: metric.id });
@@ -199,8 +199,8 @@ export function getPipelineAggOptions(targets) {
   return result;
 }
 
-export function getMovingAvgSettings(model, filtered) {
-  const filteredResult = [];
+export function getMovingAvgSettings(model: any, filtered: boolean) {
+  const filteredResult: any[] = [];
   if (filtered) {
     _.each(movingAvgModelSettings[model], setting => {
       if (!setting.isCheckbox) {
@@ -212,8 +212,8 @@ export function getMovingAvgSettings(model, filtered) {
   return movingAvgModelSettings[model];
 }
 
-export function getOrderByOptions(target) {
-  const metricRefs = [];
+export function getOrderByOptions(target: any) {
+  const metricRefs: any[] = [];
   _.each(target.metrics, metric => {
     if (metric.type !== 'count') {
       metricRefs.push({ text: describeMetric(metric), value: metric.id });
@@ -223,12 +223,12 @@ export function getOrderByOptions(target) {
   return orderByOptions.concat(metricRefs);
 }
 
-export function describeOrder(order) {
+export function describeOrder(order: string) {
   const def: any = _.find(orderOptions, { value: order });
   return def.text;
 }
 
-export function describeMetric(metric) {
+export function describeMetric(metric: { type: string; field: string }) {
   const def: any = _.find(metricAggTypes, { value: metric.type });
   if (!def.requiresField && !isPipelineAgg(metric.type)) {
     return def.text;
@@ -236,7 +236,7 @@ export function describeMetric(metric) {
   return def.text + ' ' + metric.field;
 }
 
-export function describeOrderBy(orderBy, target) {
+export function describeOrderBy(orderBy: any, target: any) {
   const def: any = _.find(orderByOptions, { value: orderBy });
   if (def) {
     return def.text;

+ 7 - 7
public/app/plugins/datasource/elasticsearch/specs/datasource.test.ts

@@ -69,7 +69,7 @@ describe('ElasticDatasource', function(this: any) {
     });
 
     it('should translate index pattern to current day', () => {
-      let requestOptions;
+      let requestOptions: any;
       ctx.backendSrv.datasourceRequest = jest.fn(options => {
         requestOptions = options;
         return Promise.resolve({ data: {} });
@@ -83,7 +83,7 @@ describe('ElasticDatasource', function(this: any) {
   });
 
   describe('When issuing metric query with interval pattern', () => {
-    let requestOptions, parts, header, query, result;
+    let requestOptions: any, parts: any, header: any, query: any, result: any;
 
     beforeEach(async () => {
       createDatasource({
@@ -154,7 +154,7 @@ describe('ElasticDatasource', function(this: any) {
   });
 
   describe('When issuing logs query with interval pattern', () => {
-    let query, queryBuilderSpy;
+    let query, queryBuilderSpy: any;
 
     beforeEach(async () => {
       createDatasource({
@@ -249,7 +249,7 @@ describe('ElasticDatasource', function(this: any) {
   });
 
   describe('When issuing document query', () => {
-    let requestOptions, parts, header;
+    let requestOptions: any, parts: any, header: any;
 
     beforeEach(() => {
       createDatasource({
@@ -539,7 +539,7 @@ describe('ElasticDatasource', function(this: any) {
   });
 
   describe('When issuing aggregation query on es5.x', () => {
-    let requestOptions, parts, header;
+    let requestOptions: any, parts: any, header: any;
 
     beforeEach(() => {
       createDatasource({
@@ -582,7 +582,7 @@ describe('ElasticDatasource', function(this: any) {
   });
 
   describe('When issuing metricFind query on es5.x', () => {
-    let requestOptions, parts, header, body, results;
+    let requestOptions: any, parts, header: any, body: any, results: any;
 
     beforeEach(() => {
       createDatasource({
@@ -615,7 +615,7 @@ describe('ElasticDatasource', function(this: any) {
         });
       });
 
-      ctx.ds.metricFindQuery('{"find": "terms", "field": "test"}').then(res => {
+      ctx.ds.metricFindQuery('{"find": "terms", "field": "test"}').then((res: any) => {
         results = res;
       });
 

+ 14 - 14
public/app/plugins/datasource/elasticsearch/specs/elastic_response.test.ts

@@ -2,8 +2,8 @@ import { ElasticResponse } from '../elastic_response';
 
 describe('ElasticResponse', () => {
   let targets;
-  let response;
-  let result;
+  let response: any;
+  let result: any;
 
   describe('simple query and count', () => {
     beforeEach(() => {
@@ -48,7 +48,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('simple query count & avg aggregation', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -97,7 +97,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('single group by query one metric', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -149,7 +149,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('single group by query two metrics', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -209,7 +209,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('with percentiles ', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -257,7 +257,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('with extended_stats', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -333,7 +333,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('single group by with alias pattern', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -394,7 +394,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('histogram response', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -426,7 +426,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('with two filters agg', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -583,7 +583,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('No group by time with percentiles ', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -720,7 +720,7 @@ describe('ElasticResponse', () => {
   });
 
   describe('with bucket_script ', () => {
-    let result;
+    let result: any;
 
     beforeEach(() => {
       targets = [
@@ -861,7 +861,7 @@ describe('ElasticResponse', () => {
       expect(result.data[0].fields).toContainEqual({ name: '@timestamp', type: 'time' });
       expect(result.data[0].fields).toContainEqual({ name: 'host', type: 'string' });
       expect(result.data[0].fields).toContainEqual({ name: 'message', type: 'string' });
-      result.data[0].rows.forEach((row, i) => {
+      result.data[0].rows.forEach((row: any, i: number) => {
         expect(row).toContain(response.responses[0].hits.hits[i]._id);
         expect(row).toContain(response.responses[0].hits.hits[i]._type);
         expect(row).toContain(response.responses[0].hits.hits[i]._index);
@@ -869,7 +869,7 @@ describe('ElasticResponse', () => {
       });
 
       expect(result.data[1]).toHaveProperty('name', 'Count');
-      response.responses[0].aggregations['2'].buckets.forEach(bucket => {
+      response.responses[0].aggregations['2'].buckets.forEach((bucket: any) => {
         expect(result.data[1].rows).toContainEqual([bucket.doc_count, bucket.key]);
       });
     });

+ 2 - 1
public/app/plugins/datasource/elasticsearch/specs/query_builder.test.ts

@@ -1,7 +1,7 @@
 import { ElasticQueryBuilder } from '../query_builder';
 
 describe('ElasticQueryBuilder', () => {
-  let builder;
+  let builder: any;
 
   beforeEach(() => {
     builder = new ElasticQueryBuilder({ timeField: '@timestamp' });
@@ -103,6 +103,7 @@ describe('ElasticQueryBuilder', () => {
         ],
       },
       100,
+      // @ts-ignore
       1000
     );
 

+ 3 - 1
public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/query_ctrl.ts

@@ -1,3 +1,5 @@
+import { auto } from 'angular';
+
 export class QueryCtrl {
   target: any;
   datasource: any;
@@ -6,7 +8,7 @@ export class QueryCtrl {
   hasRawMode: boolean;
   error: string;
 
-  constructor(public $scope, _$injector) {
+  constructor(public $scope: any, _$injector: auto.IInjectorService) {
     this.panelCtrl = this.panelCtrl || { panel: {} };
     this.target = this.target || { target: '' };
     this.panel = this.panelCtrl.panel;

+ 6 - 4
public/app/plugins/datasource/grafana-azure-monitor-datasource/annotations_query_ctrl.ts

@@ -1,3 +1,5 @@
+import { TemplateSrv } from 'app/features/templating/template_srv';
+
 export class AzureMonitorAnnotationsQueryCtrl {
   static templateUrl = 'partials/annotations.editor.html';
   datasource: any;
@@ -9,7 +11,7 @@ export class AzureMonitorAnnotationsQueryCtrl {
     '<your table>\n| where $__timeFilter() \n| project TimeGenerated, Text=YourTitleColumn, Tags="tag1,tag2"';
 
   /** @ngInject */
-  constructor(private templateSrv) {
+  constructor(private templateSrv: TemplateSrv) {
     this.annotation.queryType = this.annotation.queryType || 'Azure Log Analytics';
     this.annotation.rawQuery = this.annotation.rawQuery || this.defaultQuery;
     this.initDropdowns();
@@ -25,7 +27,7 @@ export class AzureMonitorAnnotationsQueryCtrl {
       return;
     }
 
-    return this.datasource.azureMonitorDatasource.getSubscriptions().then(subs => {
+    return this.datasource.azureMonitorDatasource.getSubscriptions().then((subs: any[]) => {
       this.subscriptions = subs;
 
       if (!this.annotation.subscription && this.annotation.queryType === 'Azure Log Analytics') {
@@ -45,7 +47,7 @@ export class AzureMonitorAnnotationsQueryCtrl {
 
     return this.datasource
       .getAzureLogAnalyticsWorkspaces(this.annotation.subscription)
-      .then(list => {
+      .then((list: any[]) => {
         this.workspaces = list;
         if (list.length > 0 && !this.annotation.workspace) {
           this.annotation.workspace = list[0].value;
@@ -72,6 +74,6 @@ export class AzureMonitorAnnotationsQueryCtrl {
   };
 
   get templateVariables() {
-    return this.templateSrv.variables.map(t => '$' + t.name);
+    return this.templateSrv.variables.map((t: any) => '$' + t.name);
   }
 }

+ 12 - 11
public/app/plugins/datasource/grafana-azure-monitor-datasource/app_insights/app_insights_datasource.test.ts

@@ -1,4 +1,5 @@
 import AzureMonitorDatasource from '../datasource';
+// @ts-ignore
 import Q from 'q';
 import { TemplateSrv } from 'app/features/templating/template_srv';
 import { toUtc } from '@grafana/data';
@@ -46,7 +47,7 @@ describe('AppInsightsDatasource', () => {
       });
 
       it('should return success status', () => {
-        return ctx.ds.testDatasource().then(results => {
+        return ctx.ds.testDatasource().then((results: any) => {
           expect(results.status).toEqual('success');
         });
       });
@@ -71,7 +72,7 @@ describe('AppInsightsDatasource', () => {
       });
 
       it('should return error status and a detailed error message', () => {
-        return ctx.ds.testDatasource().then(results => {
+        return ctx.ds.testDatasource().then((results: any) => {
           expect(results.status).toEqual('error');
           expect(results.message).toEqual(
             '1. Application Insights: Not Found: Invalid Application Id for Application Insights service. '
@@ -99,7 +100,7 @@ describe('AppInsightsDatasource', () => {
       });
 
       it('should return error status and a detailed error message', () => {
-        return ctx.ds.testDatasource().then(results => {
+        return ctx.ds.testDatasource().then((results: any) => {
           expect(results.status).toEqual('error');
           expect(results.message).toEqual('1. Application Insights: Error: SomeOtherError. An error message. ');
         });
@@ -149,7 +150,7 @@ describe('AppInsightsDatasource', () => {
       });
 
       it('should return a single datapoint', () => {
-        return ctx.ds.query(options).then(results => {
+        return ctx.ds.query(options).then((results: any) => {
           expect(results.data.length).toBe(1);
           expect(results.data[0].datapoints.length).toBe(1);
           expect(results.data[0].target).toEqual('exceptions/server');
@@ -196,7 +197,7 @@ describe('AppInsightsDatasource', () => {
       });
 
       it('should return a list of datapoints', () => {
-        return ctx.ds.query(options).then(results => {
+        return ctx.ds.query(options).then((results: any) => {
           expect(results.data.length).toBe(1);
           expect(results.data[0].datapoints.length).toBe(2);
           expect(results.data[0].target).toEqual('exceptions/server');
@@ -267,7 +268,7 @@ describe('AppInsightsDatasource', () => {
         });
 
         it('should return a list of datapoints', () => {
-          return ctx.ds.query(options).then(results => {
+          return ctx.ds.query(options).then((results: any) => {
             expect(results.data.length).toBe(3);
             expect(results.data[0].datapoints.length).toBe(2);
             expect(results.data[0].target).toEqual('exceptions/server{client/city="Miami"}');
@@ -292,7 +293,7 @@ describe('AppInsightsDatasource', () => {
         });
 
         it('should return a list of datapoints', () => {
-          return ctx.ds.query(options).then(results => {
+          return ctx.ds.query(options).then((results: any) => {
             expect(results.data.length).toBe(3);
             expect(results.data[0].datapoints.length).toBe(2);
             expect(results.data[0].target).toEqual('exceptions/server + client/city + Miami');
@@ -323,7 +324,7 @@ describe('AppInsightsDatasource', () => {
       });
 
       it('should return a list of metric names', () => {
-        return ctx.ds.metricFindQuery('appInsightsMetricNames()').then(results => {
+        return ctx.ds.metricFindQuery('appInsightsMetricNames()').then((results: any) => {
           expect(results.length).toBe(2);
           expect(results[0].text).toBe('exceptions/server');
           expect(results[0].value).toBe('exceptions/server');
@@ -361,7 +362,7 @@ describe('AppInsightsDatasource', () => {
       });
 
       it('should return a list of group bys', () => {
-        return ctx.ds.metricFindQuery('appInsightsGroupBys(requests/count)').then(results => {
+        return ctx.ds.metricFindQuery('appInsightsGroupBys(requests/count)').then((results: any) => {
           expect(results[0].text).toContain('client/os');
           expect(results[0].value).toContain('client/os');
           expect(results[1].text).toContain('client/city');
@@ -389,7 +390,7 @@ describe('AppInsightsDatasource', () => {
     });
 
     it('should return a list of metric names', () => {
-      return ctx.ds.getAppInsightsMetricNames().then(results => {
+      return ctx.ds.getAppInsightsMetricNames().then((results: any) => {
         expect(results.length).toBe(2);
         expect(results[0].text).toBe('exceptions/server');
         expect(results[0].value).toBe('exceptions/server');
@@ -427,7 +428,7 @@ describe('AppInsightsDatasource', () => {
     });
 
     it('should return a list of group bys', () => {
-      return ctx.ds.getAppInsightsMetricMetadata('requests/count').then(results => {
+      return ctx.ds.getAppInsightsMetricMetadata('requests/count').then((results: any) => {
         expect(results.primaryAggType).toEqual('avg');
         expect(results.supportedAggTypes).toContain('avg');
         expect(results.supportedAggTypes).toContain('sum');

+ 15 - 13
public/app/plugins/datasource/grafana-azure-monitor-datasource/app_insights/app_insights_datasource.ts

@@ -6,6 +6,7 @@ import { DataSourceInstanceSettings } from '@grafana/ui';
 import { AzureDataSourceJsonData } from '../types';
 import { BackendSrv } from 'app/core/services/backend_srv';
 import { TemplateSrv } from 'app/features/templating/template_srv';
+import { IQService } from 'angular';
 
 export interface LogAnalyticsColumn {
   text: string;
@@ -24,7 +25,7 @@ export default class AppInsightsDatasource {
     instanceSettings: DataSourceInstanceSettings<AzureDataSourceJsonData>,
     private backendSrv: BackendSrv,
     private templateSrv: TemplateSrv,
-    private $q
+    private $q: IQService
   ) {
     this.id = instanceSettings.id;
     this.applicationId = instanceSettings.jsonData.appInsightsAppId;
@@ -36,7 +37,7 @@ export default class AppInsightsDatasource {
     return !!this.applicationId && this.applicationId.length > 0;
   }
 
-  query(options) {
+  query(options: any) {
     const queries = _.filter(options.targets, item => {
       return item.hide !== true;
     }).map(target => {
@@ -106,6 +107,7 @@ export default class AppInsightsDatasource {
     });
 
     if (!queries || queries.length === 0) {
+      // @ts-ignore
       return;
     }
 
@@ -130,16 +132,16 @@ export default class AppInsightsDatasource {
       });
   }
 
-  doQueries(queries) {
+  doQueries(queries: any) {
     return _.map(queries, query => {
       return this.doRequest(query.url)
-        .then(result => {
+        .then((result: any) => {
           return {
             result: result,
             query: query,
           };
         })
-        .catch(err => {
+        .catch((err: any) => {
           throw {
             error: err,
             query: query,
@@ -148,7 +150,7 @@ export default class AppInsightsDatasource {
     });
   }
 
-  annotationQuery(options) {}
+  annotationQuery(options: any) {}
 
   metricFindQuery(query: string) {
     const appInsightsMetricNameQuery = query.match(/^AppInsightsMetricNames\(\)/i);
@@ -168,7 +170,7 @@ export default class AppInsightsDatasource {
   testDatasource() {
     const url = `${this.baseUrl}/metrics/metadata`;
     return this.doRequest(url)
-      .then(response => {
+      .then((response: any) => {
         if (response.status === 200) {
           return {
             status: 'success',
@@ -182,7 +184,7 @@ export default class AppInsightsDatasource {
           message: 'Returned http status code ' + response.status,
         };
       })
-      .catch(error => {
+      .catch((error: any) => {
         let message = 'Application Insights: ';
         message += error.statusText ? error.statusText + ': ' : '';
 
@@ -201,13 +203,13 @@ export default class AppInsightsDatasource {
       });
   }
 
-  doRequest(url, maxRetries = 1) {
+  doRequest(url: any, maxRetries = 1) {
     return this.backendSrv
       .datasourceRequest({
         url: this.url + url,
         method: 'GET',
       })
-      .catch(error => {
+      .catch((error: any) => {
         if (maxRetries > 0) {
           return this.doRequest(url, maxRetries - 1);
         }
@@ -223,20 +225,20 @@ export default class AppInsightsDatasource {
 
   getMetricMetadata(metricName: string) {
     const url = `${this.baseUrl}/metrics/metadata`;
-    return this.doRequest(url).then(result => {
+    return this.doRequest(url).then((result: any) => {
       return new ResponseParser(result).parseMetadata(metricName);
     });
   }
 
   getGroupBys(metricName: string) {
-    return this.getMetricMetadata(metricName).then(result => {
+    return this.getMetricMetadata(metricName).then((result: any) => {
       return new ResponseParser(result).parseGroupBys();
     });
   }
 
   getQuerySchema() {
     const url = `${this.baseUrl}/query/schema`;
-    return this.doRequest(url).then(result => {
+    return this.doRequest(url).then((result: any) => {
       const schema = new ResponseParser(result).parseQuerySchema();
       // console.log(schema);
       return schema;

+ 1 - 1
public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/__mocks__/schema.ts

@@ -162,7 +162,7 @@ export default class FakeSchemaData {
     };
   }
 
-  static getlogAnalyticsFakeMetadata() {
+  static getlogAnalyticsFakeMetadata(): any {
     return {
       tables: [
         {

+ 1 - 1
public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/supported_namespaces.ts

@@ -1,5 +1,5 @@
 export default class SupportedNamespaces {
-  supportedMetricNamespaces = {
+  supportedMetricNamespaces: any = {
     azuremonitor: [
       'Microsoft.AnalysisServices/servers',
       'Microsoft.ApiManagement/service',

+ 3 - 1
public/app/plugins/datasource/grafana-azure-monitor-datasource/editor/KustoQueryField.tsx

@@ -43,7 +43,7 @@ const defaultSchema: any = () => ({
   },
 });
 
-const cleanText = s => s.replace(/[{}[\]="(),!~+\-*/^%]/g, '').trim();
+const cleanText = (s: string) => s.replace(/[{}[\]="(),!~+\-*/^%]/g, '').trim();
 const wrapText = (text: string) => ({ text });
 
 export default class KustoQueryField extends QueryField {
@@ -353,11 +353,13 @@ export default class KustoQueryField extends QueryField {
   }
 
   getTableSuggestions(db = 'Default'): SuggestionGroup[] {
+    // @ts-ignore
     if (this.schema.Databases[db]) {
       return [
         {
           prefixMatch: true,
           label: 'Tables',
+          // @ts-ignore
           items: _.map(this.schema.Databases[db].Tables, (t: any) => ({ text: t.Name })),
         },
       ];

+ 1 - 0
public/app/plugins/datasource/graphite/specs/graphite_query.test.ts

@@ -10,6 +10,7 @@ describe('Graphite query model', () => {
       waitForFuncDefsLoaded: jest.fn().mockReturnValue(Promise.resolve(null)),
       createFuncInstance: gfunc.createFuncInstance,
     },
+    // @ts-ignore
     templateSrv: new TemplateSrvStub(),
     targets: [],
   };

+ 4 - 4
public/app/plugins/datasource/loki/language_provider.test.ts

@@ -111,7 +111,7 @@ describe('Request URL', () => {
     };
 
     const datasourceWithLabels = {
-      metadataRequest: url => {
+      metadataRequest: (url: string) => {
         if (url.slice(0, 15) === '/api/prom/label') {
           return { data: { data: ['other'] } };
         } else {
@@ -154,7 +154,7 @@ describe('Query imports', () => {
 
     it('returns empty query from selector query if label is not available', async () => {
       const datasourceWithLabels = {
-        metadataRequest: url =>
+        metadataRequest: (url: string) =>
           url.slice(0, 15) === '/api/prom/label'
             ? { data: { data: ['other'] } }
             : { data: { data: [] as DataQueryResponseData[] } },
@@ -166,7 +166,7 @@ describe('Query imports', () => {
 
     it('returns selector query from selector query with common labels', async () => {
       const datasourceWithLabels = {
-        metadataRequest: url =>
+        metadataRequest: (url: string) =>
           url.slice(0, 15) === '/api/prom/label'
             ? { data: { data: ['foo'] } }
             : { data: { data: [] as DataQueryResponseData[] } },
@@ -178,7 +178,7 @@ describe('Query imports', () => {
 
     it('returns selector query from selector query with all labels if logging label list is empty', async () => {
       const datasourceWithLabels = {
-        metadataRequest: url =>
+        metadataRequest: (url: string) =>
           url.slice(0, 15) === '/api/prom/label'
             ? { data: { data: [] as DataQueryResponseData[] } }
             : { data: { data: [] as DataQueryResponseData[] } },

+ 1 - 1
scripts/ci-frontend-metrics.sh

@@ -3,7 +3,7 @@
 echo -e "Collecting code stats (typescript errors & more)"
 
 
-ERROR_COUNT_LIMIT=2350
+ERROR_COUNT_LIMIT=1670
 DIRECTIVES_LIMIT=172
 CONTROLLERS_LIMIT=139